پرش به محتوای اصلی
رزرو مشاوره تلفنی تک جلسه‌ای با استاد رضویمشاوره با استاد رضوی
رزرو مشاوره تلفنی
کنکور کامپیوتر
0
اشتراک
 

فاطمه نامور (2)

درخت B

درخت B یا B-tree یک ساختمان داده درخت جستجوی باینری است که برای عملیات جستجو و حذف سریع بهینه شده است. در پایگاه‌های داده، سیستم‌های فایل و سایر برنامه‌ها که در آن داده‌های گسترده باید به طور مؤثر جستجو شوند، استفاده می‌شود. B-treeها می‌توانند کلیدها و مقادیر زیادی را در یک فضای فشرده ذخیره کنند و از عملیات‌های درج و حذف سریع پشتیبانی کنند. در این مقاله به بررسی این نوع درختان می‌پردازیم.

ویژگی‌های درخت B

درخت B از مرتبه n شامل تمام ویژگی‌های درخت است، علاوه بر این شامل خواص زیر نیز می‌باشد:

  • برای هر گره x، کلیدها به ترتیب افزایشی ذخیره می‌شوند.
  • هر گره یک مقدار بولی دارد که اگر x یک برگ باشد این مقدار True است.
  • اگر n مرتبه درخت باشد، هر گره داخلی می‌تواند حداکثر دارای n - 1 کلید به همراه یک اشاره گر به هر فرزند باشد.
  • هر گره به جز ریشه می‌تواند حداکثر n فرزند و حداقل n/2 فرزند داشته باشد.
  • همه برگها عمق یکسانی دارند (یعنی ارتفاع درخت).
  • ریشه حداقل دو فرزند دارد و دارای حداقل 1 کلید است.
  • اگر n ≥ 1، آنگاه برای هر درخت B از مرتبه n، با ارتفاع h و حداقل درجه t ≥ 2، h ≥ logt (n+1)/2.

عملیات‌های درخت B

عملیات جستجو در درخت B

جستجو در درختان B شبیه به جستجوی درخت جستجوی باینری است؛ به عنوان مثال، اگر عنصر 49 را در B Tree زیر جستجو کنیم، روند چیزی شبیه به زیر خواهد بود:

نمونه ای از درخت B

  1. عنصر 49 را با گره ریشه 78 مقایسه کنید. چون 49 < 78 است، به زیر درخت سمت چپ آن بروید.
  2. از آنجایی که 40 < 49 < 56، از زیر درخت 40 به سمت راست عبور کنید.
  3. 49 > 45، به سمت راست حرکت کنید. عنصر 49 را با 49 مقایسه کنید.
  4. عنصر مورد نظر پیدا شد، آن را برمی‌گردانیم.

عملیات درج در درخت B

درج در سطح گره برگ انجام می‌شود. برای درج یک آیتم در B Tree باید الگوریتم زیر را دنبال کنید:

  • درخت B را پیمایش کنید تا گره برگ مناسب برای درج گره را بیابید.
  • اگر گره برگ کمتر از m - 1 کلید دارد، عنصر را به ترتیب افزایشی درج کنید.
  • در غیر این صورت، اگر گره برگ حاوی m - 1 کلید است، مراحل زیر را دنبال کنید.
  • عنصر جدید را به ترتیب افزایشی عناصر درج کنید.
  • گره را از وسط به دو گره تقسیم کنید.
  • عنصر میانه را به سمت گره والد خود انتقال دهید.
  • اگر گره والد دارای تعداد m - 1 کلید است، آن را با دنبال کردن مراحل مشابه تقسیم کنید.

برای مثال فرض کنید می‌خواهید عنصر 8 را در درخت B با مرتبه 5 زیر درج کنید:

نمونه ای از درخت B

8 در سمت راست 5 درج می شود، بنابراین 8 را درج کنید.

درج عدد 8 در سمت راست 5 در درخت B

گره جدید، اکنون حاوی 5 کلید است که بزرگتر از حد مجاز است (5 - 1 = 4) است بنابراین گره را از عنصر میانی یعنی 8 جدا کنید و آن را به سمت گره والد خود که به شکل زیر نشان داده شده است، منتقل کنید:

درخت B نهایی به همین شکل خواهد بود.

عملیات حذف از درخت B

حذف نیز در گره‌های برگ انجام می‌شود. گره‌ای که باید حذف شود می‌تواند یک گره برگ یا یک گره داخلی باشد. برای حذف یک گره از درخت B، الگوریتم زیر باید دنبال شود:

  1. محل گره برگ را پیدا کنید.
  2. اگر بیش از m/2 کلید در گره برگ وجود دارد، کلید مورد نظر را از گره حذف کنید.
  3. اگر گره برگ کمتر از m/2 کلید دارد ، با گرفتن عنصر از سمت راست یا چپ، کلیدها را تکمیل کنید.
    • اگر گره سمت چپ حاوی بیش از m/2 عناصر است، بزرگترین عنصر آن را به سمت والدش منتقل کنید و عنصر وسط را به سمت پایین به سمت گره‌ای که کلیدش حذف شده است، ببرید.
    • اگر گره سمت راست حاوی بیش از m/2 عناصر است، کوچکترین عنصر آن را به سمت والد منتقل کنید و عنصر وسط را به سمت پایین به سمت گره‌ای که کلیدش حذف شده است ببرید.
  4. اگر هیچ یک از گره‌های کناری بیش از m/2 عنصر ندارند، با پیوند دادن دو گره برگ و عنصر میانی گره والد، یک گره برگ جدید ایجاد کنید.
  5. اگر گره‌های والد کمتر از m/2 است، فرآیند بالا را برای والد نیز اعمال کنید.

اگر گره‌ای که باید حذف شود، یک گره داخلی است، آن را با گره قبلی یا بعدی اش در پیمایش Inorder، جایگزین کنید. از آنجایی که گره قبلی یا بعدی همیشه در گره برگ خواهد بود، فرآیند مشابه با حذف گره از گره برگ خواهد بود.

برای مثال فرض کنید می‌خواهید گره 10 را از درخت B مرتبه 5 که در شکل زیر نشان داده شده است حذف کنید:

 نمونه ای از درخت B

10 در فرزند سمت راست عنصر 8 وجود دارد، آن را حذف کنید.

حذف عنصر 10 از درخت B

در حال حاضر، 23 تنها عنصر باقی مانده در گره است، و از حداقل تعداد عناصری که باید در درخت B درجه 5 وجود داشته باشد، یعنی 2 کمتر است. عناصر موجود در زیردرخت چپ و راست آن نیز کافی نیستند بنابراین آن را با گره‌های چپ و راست و عنصر میانی والد، یعنی 8 ادغام کنید.

درخت B نهایی به صورت زیر است:

 درخت B نهایی پس از حذف عنصر 10 از آن

پیچیدگی زمانی عملیات‌های درخت B

پیچیدگی زمانی درخت B برای عملیات‌های جستجو، درج و حذف از مرتبه Θ(log n) است.

پیاده‌سازی درخت B

در ادامه به پیاده سازی درخت B در زبان های برنامه نویسی پایتون و سی پلاس پلاس می‌پردازیم:

Python

# Searching a key on a B-tree in Python

# Create a node
class BTreeNode:
    def __init__(self, leaf=False):
        self.leaf = leaf
        self.keys = []
        self.child = []

# Tree
class BTree:
    def __init__(self, t):
        self.root = BTreeNode(True)
        self.t = t

        # Insert node

    def insert(self, k):
        root = self.root
        if len(root.keys) == (2 * self.t) - 1:
            temp = BTreeNode()
            self.root = temp
            temp.child.insert(0, root)
            self.split_child(temp, 0)
            self.insert_non_full(temp, k)
        else:
            self.insert_non_full(root, k)

        # Insert nonfull

    def insert_non_full(self, x, k):
        i = len(x.keys) - 1
        if x.leaf:
            x.keys.append((None, None))
            while i >= 0 and k[0] < x.keys[i][0]:
                x.keys[i + 1] = x.keys[i]
                i -= 1
            x.keys[i + 1] = k
        else:
            while i >= 0 and k[0] < x.keys[i][0]:
                i -= 1
            i += 1
            if len(x.child[i].keys) == (2 * self.t) - 1:
                self.split_child(x, i)
                if k[0] > x.keys[i][0]:
                    i += 1
            self.insert_non_full(x.child[i], k)

        # Split the child

    def split_child(self, x, i):
        t = self.t
        y = x.child[i]
        z = BTreeNode(y.leaf)
        x.child.insert(i + 1, z)
        x.keys.insert(i, y.keys[t - 1])
        z.keys = y.keys[t : (2 * t) - 1]
        y.keys = y.keys[0 : t - 1]
        if not y.leaf:
            z.child = y.child[t : 2 * t]
            y.child = y.child[0 : t - 1]

    # Print the tree
    def print_tree(self, x, l=0):
        print("Level ", l, " ", len(x.keys), end=":")
        for i in x.keys:
            print(i, end=" ")
        print()
        l += 1
        if len(x.child) > 0:
            for i in x.child:
                self.print_tree(i, l)

    # Search key in the tree
    def search_key(self, k, x=None):
        if x is not None:
            i = 0
            while i < len(x.keys) and k > x.keys[i][0]:
                i += 1
            if i < len(x.keys) and k == x.keys[i][0]:
                return (x, i)
            elif x.leaf:
                return None
            else:
                return self.search_key(k, x.child[i])

        else:
            return self.search_key(k, self.root)

def main():
    B = BTree(3)

    for i in range(10):
        B.insert((i, 2 * i))

    B.print_tree(B.root)

    if B.search_key(8) is not None:
        print("\nFound")
    else:
        print("\nNot Found")

if __name__ == "__main__":
    main()

C++

// Searching a key on a B-tree in C++

#include <iostream>
using namespace std;

class TreeNode
{
    int *keys;
    int t;
    TreeNode **C;
    int n;
    bool leaf;

public:
    TreeNode(int temp, bool bool_leaf);

    void insertNonFull(int k);
    void splitChild(int i, TreeNode *y);
    void traverse();

    TreeNode *search(int k);

    friend class BTree;
};

class BTree
{
    TreeNode *root;
    int t;

public:
    BTree(int temp)
    {
        root = NULL;
        t = temp;
    }

    void traverse()
    {
        if (root != NULL)
            root->traverse();
    }

    TreeNode *search(int k)
    {
        return (root == NULL) ? NULL : root->search(k);
    }

    void insert(int k);
};

TreeNode::TreeNode(int t1, bool leaf1)
{
    t = t1;
    leaf = leaf1;

    keys = new int[2 * t - 1];
    C = new TreeNode *[2 * t];

    n = 0;
}

void TreeNode::traverse()
{
    int i;
    for (i = 0; i < n; i++)
    {
        if (leaf == false)
            C[i]->traverse();
        cout << " " << keys[i];
    }

    if (leaf == false)
        C[i]->traverse();
}

TreeNode *TreeNode::search(int k)
{
    int i = 0;
    while (i < n && k > keys[i])
        i++;

    if (keys[i] == k)
        return this;

    if (leaf == true)
        return NULL;

    return C[i]->search(k);
}

void BTree::insert(int k)
{
    if (root == NULL)
    {
        root = new TreeNode(t, true);
        root->keys[0] = k;
        root->n = 1;
    }
    else
    {
        if (root->n == 2 * t - 1)
        {
            TreeNode *s = new TreeNode(t, false);

            s->C[0] = root;

            s->splitChild(0, root);

            int i = 0;
            if (s->keys[0] < k)
                i++;
            s->C[i]->insertNonFull(k);

            root = s;
        }
        else
            root->insertNonFull(k);
    }
}

void TreeNode::insertNonFull(int k)
{
    int i = n - 1;

    if (leaf == true)
    {
        while (i >= 0 && keys[i] > k)
        {
            keys[i + 1] = keys[i];
            i--;
        }

        keys[i + 1] = k;
        n = n + 1;
    }
    else
    {
        while (i >= 0 && keys[i] > k)
            i--;

        if (C[i + 1]->n == 2 * t - 1)
        {
            splitChild(i + 1, C[i + 1]);

            if (keys[i + 1] < k)
                i++;
        }
        C[i + 1]->insertNonFull(k);
    }
}

void TreeNode::splitChild(int i, TreeNode *y)
{
    TreeNode *z = new TreeNode(y->t, y->leaf);
    z->n = t - 1;

    for (int j = 0; j < t - 1; j++)
        z->keys[j] = y->keys[j + t];

    if (y->leaf == false)
    {
        for (int j = 0; j < t; j++)
            z->C[j] = y->C[j + t];
    }

    y->n = t - 1;
    for (int j = n; j >= i + 1; j--)
        C[j + 1] = C[j];

    C[i + 1] = z;

    for (int j = n - 1; j >= i; j--)
        keys[j + 1] = keys[j];

    keys[i] = y->keys[t - 1];
    n = n + 1;
}

int main()
{
    BTree t(3);
    t.insert(8);
    t.insert(9);
    t.insert(10);
    t.insert(11);
    t.insert(15);
    t.insert(16);
    t.insert(17);
    t.insert(18);
    t.insert(20);
    t.insert(23);

    cout << "The B-tree is: ";
    t.traverse();

    int k = 10;
    (t.search(k) != NULL) ? cout << endl
                                 << k << " is found"
                          : cout << endl
                                 << k << " is not Found";

    k = 2;
    (t.search(k) != NULL) ? cout << endl
                                 << k << " is found"
                          : cout << endl
                                 << k << " is not Found\n";
}

مقایسه با درخت B+

برجسته‌ترین نقاط مقایسه بین B-tree و B+tree شامل موارد زیر است:

  • اشاره گر: تمام گره‌های داخلی و برگ در درخت B دارای اشاره‌گر داده هستند. در B+tree، فقط گره‌های برگ دارای اشاره‌گر داده هستند.
  • جستجو: در B-tree از آنجایی که همه کلیدها در برگ موجود نیستند، جستجو اغلب زمان بیشتری می‌برد. در B+tree، همه کلیدها در گره‌های برگ قرار دارند. از این رو جستجو سریع‌تر و دقیق‌تر است.
  • کلیدهای تکراری: در درخت B، هیچ کلید تکراری در درخت نگهداری نمی‌شود. در B+tree، کلیدهای تکراری می‌توانند نگه داشته شوند و همه گره‌ها در برگ قرار دارند.
  • درج: در B-tree ، درج زمان بیشتری می‌برد و گاهی اوقات قابل پیش‌بینی نیست. در B+tree، درج سریع‌تر است و نتایج همیشه یکسان است.
  • حذف: در درخت B، حذف گره داخلی بسیار پیچیده است و درخت باید دستخوش تغییرات زیادی شود. در B+tree، حذف هر گره آسان است زیرا همه گره‌ها در برگ پیدا می‌شوند.
  • گره های برگ: گره‌های برگ به صورت ساختمان داده لیست پیوندی در درخت B ذخیره نمی‌شوند. در B+tree، گره های برگ به صورت لیست پیوندی ذخیره می‌شوند.
  • دسترسی: در درخت B، دسترسی متوالی به گر‌ها غیرممکن است. در B+tree، دسترسی متوالی، درست مانند یک لیست پیوندی، امکان‌پذیر است.
  • ارتفاع: ارتفاع در B-tree برای تعداد خاصی از گره‌ها بزرگتر است. ارتفاع B+tree برای همان تعداد گره از درخت B کمتر است.
  • کاربرد: B-Trees در پایگاه داده و موتورهای جستجو استفاده می‌شود. درختان B+ در شاخص‌سازی چندسطحی در پایگاه داده استفاده می‌شوند.
  • تعداد گره ها: در درخت B تعداد گره‌ها در هر سطح میانی l، برابر 2l است. در B+tree، هر گره واسطه می‌تواند n/2 تا n فرزند داشته باشد.

کاربردهای درخت B

از کاربردهای درخت B می‌توان به موارد زیر اشاره کرد:

  • پایگاه های داده و سیستم‌های مدیریت فایل
  • برای ذخیره بلوک‌های داده (رسانه‌های ذخیره‌سازی ثانویه)
  • شاخص‌سازی چندسطحی

جمع‌بندی

B-tree یک درخت جستجوی خود متعادل کننده است که در آن هر گره می‌تواند بیش از یک کلید داشته باشد و بیش از دو فرزند داشته باشد. این درخت، یک شکل تعمیم یافته از درخت جستجوی دودویی است. در این مقاله به شرح این نوع درخت پرداختیم و همچنین عملیات‌های اساسی آن را بررسی کردیم و با کاربردها و پیاده‌سازی آن آشنا شدیم.

درخت B چیست؟

درخت B داده‌ها را به گونه‌ای ذخیره می‌کند که هر گره حاوی کلیدها به ترتیب صعودی باشد. هر یک از این کلیدها دو مرجع به دو گره فرزند دیگر دارند. کلیدهای گره فرزند سمت چپ کمتر از کلید فعلی هستند و کلیدهای گره فرزند سمت راست بیشتر از کلید فعلی هستند.

مزیت اصلی استفاده از B-Trees چیست؟

مزیت استفاده از این نوع درخت شامل موارد زیر است:
کلیدها را به ترتیب مرتب شده برای پیمایش متوالی نگه می‌دارد.
از یک شاخص سلسله مراتبی برای به حداقل رساندن تعداد خواندن دیسک استفاده می‌کند.
از بلوک‌های نیمه کامل برای سرعت بخشیدن به درج و حذف استفاده می‌کند.
شاخص را با یک الگوریتم بازگشتی متعادل نگه می‌دارد.

پیچیدگی زمانی B-tree چقدر است؟

اگر n را تعداد کل عناصر یک درخت B در نظر بگیریم، پیچیدگی زمانی برای هر عملیات رایج، یعنی جستجو، درج و حذف، O(log n) خواهد بود.

درخت B بهتر است یا درخت B+؟

در B-tree، جستجو ناکارآمد است زیرا رکوردها در برگ یا گره‌های داخلی ذخیره می‌شوند. در درخت B+، جستجو بسیار کارآمد یا سریعتر است زیرا تمام رکوردها در گره‌های برگ ذخیره می‌شوند.

مزیت B-tree نسبت به درخت AVL چیست؟

AVL خود متعادل کننده است و تضمین می‌کند که همه عملیات‌ها در حالت متوسط و بدترین حالت O(log n) هستند. علاوه بر این، B-tree با اطمینان از پر بودن گره های داخلی حداقل ضایعات را به حداقل می‌رساند. یک B-tree می‌تواند تعداد دلخواه درج و حذف را مدیریت کند.







درخت B+

درخت B+ شکل پیشرفته‌ای از درخت خود متعادل کننده است که در آن تمام مقادیر در سطح برگ قرار دارند. در این مقاله به بررسی این نوع درخت می‌پردازیم.

ویژگی‌های درخت B+

یک مفهوم مهم که باید قبل از یادگیری درخت B+ درک شود، شاخص‌سازی چندسطحی است. در شاخص‌سازی چندسطحی، شاخص‌ها مانند شکل زیر ایجاد می‌شوند. این کار، دسترسی به داده‌ها را آسان‌تر و سریع‌تر می‌کند.

نمونه ای از درخت B+

ویژگی‌های درخت B+ شامل موارد زیر است:

  • همه برگها در یک سطح هستند.
  • ریشه حداقل دو فرزند دارد.
  • هر گره به جز ریشه می‌تواند حداکثر m فرزند و حداقل m/2 فرزند داشته باشد (m مرتبه درخت B+ را مشخص می‌کند).
  • هر گره می‌تواند حداکثر دارای m - 1 کلید و حداقل ⌈m/2⌉ - 1 کلید باشد.

عملیات‌های درخت B+

عملیات درج

مراحل عملیات درج در درخت B+ به‌صورت زیر است:

  • گره جدید را به عنوان یک گره برگ وارد کنید.
  • اگر برگ فضای لازم را ندارد، گره را تقسیم کرده و گره میانی را در گره شاخص بعدی کپی کنید.
  • اگر گره شاخص فضای لازم را ندارد، گره را تقسیم کرده و عنصر میانی را در صفحه شاخص بعدی کپی کنید.

فرض کنید می‌خواهیم مقدار 195 را در درخت B+ از مرتبه 5 که در شکل زیر نشان داده شده است وارد کنیم.

نمونه ای از درخت B+

195 بعد از 190 در زیر درخت سمت راست 120 درج می شود. آن را در این مکان درج می‌کنیم.

درج کردن گره 195 در درخت B+

گره سمت راست 120 حاوی بیش از حداکثر تعداد عناصر یعنی 4، است. آن را تقسیم می‌کنیم و گره میانی یعنی 190 را والد قرار می‌دهیم.

گره ریشه شامل 6 فرزند و 5 کلید است که ویژگی درخت B+ را نقض می کند.

اکنون، گره ریشه شامل 6 فرزند و 5 کلید است که ویژگی درخت B+ را نقض می‌کند بنابراین باید آن را تقسیم کنیم که به صورت زیر نشان داده شده است.

تقسیم گره ریشه برای حفظ تعادل در درخت B+

عملیات حذف

مراحل عملیات حذف در درخت B+ به‌صورت زیر است:

  • کلید و داده‌ها را از برگه‌ها حذف کنید.
  • اگر گره برگ حاوی کمتر از حداقل تعداد عناصر است، گره را با خواهر و برادرش ادغام کرده و کلید بین آنها را حذف کنید.
  • اگر گره شاخص حاوی کمتر از حداقل تعداد عناصر است، گره را با خواهر و برادر ادغام کرده و کلید بین آنها را به پایین حرکت دهید.

برای مثال فرض کنید می‌خواهید کلید 200 را از درخت B+ که در شکل زیر نشان داده شده است حذف کنید.

نمونه ای از درخت B+

200 در زیر درخت سمت راست 190 بعد از 190 قرار دارد، آن را حذف کنید.

حذف کلید 200 از درخت B+

دو گره را با استفاده از 195، 190، 154 و 129 ادغام کنید.

ادغام دو گره با استفاده از 195، 190، 154 و 129

اکنون، عنصر 120 تنها عنصر موجود در گره است که خصوصیات درخت B+ را نقض می‌کند بنابراین، باید آن را با استفاده از 60، 78، 108 و 120 ادغام کنیم.

ادغام 120 با استفاده از 60، 78، 108 و 120

اکنون ارتفاع درخت 1 واحد کاهش یافت.

عملیات جستجو

مراحل زیر برای جستجوی داده‌ها در درخت B+ از مرتبه m دنبال می‌شود. فرض کنید داده مورد جستجو k باشد.

  • از گره ریشه شروع کنید. k را با کلیدهای گره ریشه [k1, k2, k3,......km - 1] مقایسه کنید.
  • اگر k < k1، به فرزند سمت چپ گره ریشه بروید.
  • اگر k > k1، به فرزند سمت راست گره ریشه بروید.
  • در غیر این صورت اگر k == k1، k2 را برمی‌گردانیم.
  • مراحل بالا را تکرار کنید تا به یک گره برگ برسید.

مثال زیر را در نظر بگیرید. فرض کنید به دنبال گره 129 در این درخت B+ هستیم:

مثالی از درخت B+ که در آن به دنبال گره 129 هستیم

ابتدا 129 را با 108 مقایسه می‌کنیم. چون 108 < 129 پس به زیر درخت سمت راست می‌رویم.

مقایسه گره 129 با 108

مقایسه گره 120 با 129

چون 120 < 129 پس به زیر درخت سمت راست می‌رویم.

گره 129 یافت شد

گره مورد نظر را پیدا کردیم.

پیچیدگی عملیات‌های درخت B+

عملیات درج

پیچیدگی زمانی عملیات درج درخت B+ از مرتبه Θ(t.logt n) است.

عملیات حذف

پیچیدگی زمانی عملیات حذف از درخت B+ از مرتبه Θ(logn) است.

عملیات جستجو

اگر جستجوی خطی در داخل یک گره اجرا شود، پیچیدگی کل Θ(logt n) است (Θ(t) پیچیدگی زمانی جستجوی خطی است).

اگر از جستجوی دودویی استفاده شود، پیچیدگی کل Θ(log2t.logt n) است.

پیاده سازی درخت B+

در ادامه به پیاده سازی درخت B+ در زبان های برنامه نویسی پایتون و سی پلاس پلاس می‌پردازیم:

Python

# B+ tee in python

import math

# Node creation
class Node:
    def __init__(self, order):
        self.order = order
        self.values = []
        self.keys = []
        self.nextKey = None
        self.parent = None
        self.check_leaf = False

    # Insert at the leaf
    def insert_at_leaf(self, leaf, value, key):
        if (self.values):
            temp1 = self.values
            for i in range(len(temp1)):
                if (value == temp1[i]):
                    self.keys[i].append(key)
                    break
                elif (value < temp1[i]):
                    self.values = self.values[:i] + [value] + self.values[i:]
                    self.keys = self.keys[:i] + [[key]] + self.keys[i:]
                    break
                elif (i + 1 == len(temp1)):
                    self.values.append(value)
                    self.keys.append([key])
                    break
        else:
            self.values = [value]
            self.keys = [[key]]

# B plus tree
class BplusTree:
    def __init__(self, order):
        self.root = Node(order)
        self.root.check_leaf = True

    # Insert operation
    def insert(self, value, key):
        value = str(value)
        old_node = self.search(value)
        old_node.insert_at_leaf(old_node, value, key)

        if (len(old_node.values) == old_node.order):
            node1 = Node(old_node.order)
            node1.check_leaf = True
            node1.parent = old_node.parent
            mid = int(math.ceil(old_node.order / 2)) - 1
            node1.values = old_node.values[mid + 1:]
            node1.keys = old_node.keys[mid + 1:]
            node1.nextKey = old_node.nextKey
            old_node.values = old_node.values[:mid + 1]
            old_node.keys = old_node.keys[:mid + 1]
            old_node.nextKey = node1
            self.insert_in_parent(old_node, node1.values[0], node1)

    # Search operation for different operations
    def search(self, value):
        current_node = self.root
        while(current_node.check_leaf == False):
            temp2 = current_node.values
            for i in range(len(temp2)):
                if (value == temp2[i]):
                    current_node = current_node.keys[i + 1]
                    break
                elif (value < temp2[i]):
                    current_node = current_node.keys[i]
                    break
                elif (i + 1 == len(current_node.values)):
                    current_node = current_node.keys[i + 1]
                    break
        return current_node

    # Find the node
    def find(self, value, key):
        l = self.search(value)
        for i, item in enumerate(l.values):
            if item == value:
                if key in l.keys[i]:
                    return True
                else:
                    return False
        return False

    # Inserting at the parent
    def insert_in_parent(self, n, value, ndash):
        if (self.root == n):
            rootNode = Node(n.order)
            rootNode.values = [value]
            rootNode.keys = [n, ndash]
            self.root = rootNode
            n.parent = rootNode
            ndash.parent = rootNode
            return

        parentNode = n.parent
        temp3 = parentNode.keys
        for i in range(len(temp3)):
            if (temp3[i] == n):
                parentNode.values = parentNode.values[:i] + \
                    [value] + parentNode.values[i:]
                parentNode.keys = parentNode.keys[:i +
                                                  1] + [ndash] + parentNode.keys[i + 1:]
                if (len(parentNode.keys) > parentNode.order):
                    parentdash = Node(parentNode.order)
                    parentdash.parent = parentNode.parent
                    mid = int(math.ceil(parentNode.order / 2)) - 1
                    parentdash.values = parentNode.values[mid + 1:]
                    parentdash.keys = parentNode.keys[mid + 1:]
                    value_ = parentNode.values[mid]
                    if (mid == 0):
                        parentNode.values = parentNode.values[:mid + 1]
                    else:
                        parentNode.values = parentNode.values[:mid]
                    parentNode.keys = parentNode.keys[:mid + 1]
                    for j in parentNode.keys:
                        j.parent = parentNode
                    for j in parentdash.keys:
                        j.parent = parentdash
                    self.insert_in_parent(parentNode, value_, parentdash)

    # Delete a node
    def delete(self, value, key):
        node_ = self.search(value)

        temp = 0
        for i, item in enumerate(node_.values):
            if item == value:
                temp = 1

                if key in node_.keys[i]:
                    if len(node_.keys[i]) > 1:
                        node_.keys[i].pop(node_.keys[i].index(key))
                    elif node_ == self.root:
                        node_.values.pop(i)
                        node_.keys.pop(i)
                    else:
                        node_.keys[i].pop(node_.keys[i].index(key))
                        del node_.keys[i]
                        node_.values.pop(node_.values.index(value))
                        self.deleteEntry(node_, value, key)
                else:
                    print("Value not in Key")
                    return
        if temp == 0:
            print("Value not in Tree")
            return

    # Delete an entry
    def deleteEntry(self, node_, value, key):

        if not node_.check_leaf:
            for i, item in enumerate(node_.keys):
                if item == key:
                    node_.keys.pop(i)
                    break
            for i, item in enumerate(node_.values):
                if item == value:
                    node_.values.pop(i)
                    break

        if self.root == node_ and len(node_.keys) == 1:
            self.root = node_.keys[0]
            node_.keys[0].parent = None
            del node_
            return
        elif (len(node_.keys) < int(math.ceil(node_.order / 2)) and node_.check_leaf == False) or (len(node_.values) < int(math.ceil((node_.order - 1) / 2)) and node_.check_leaf == True):

            is_predecessor = 0
            parentNode = node_.parent
            PrevNode = -1
            NextNode = -1
            PrevK = -1
            PostK = -1
            for i, item in enumerate(parentNode.keys):

                if item == node_:
                    if i > 0:
                        PrevNode = parentNode.keys[i - 1]
                        PrevK = parentNode.values[i - 1]

                    if i < len(parentNode.keys) - 1:
                        NextNode = parentNode.keys[i + 1]
                        PostK = parentNode.values[i]

            if PrevNode == -1:
                ndash = NextNode
                value_ = PostK
            elif NextNode == -1:
                is_predecessor = 1
                ndash = PrevNode
                value_ = PrevK
            else:
                if len(node_.values) + len(NextNode.values) < node_.order:
                    ndash = NextNode
                    value_ = PostK
                else:
                    is_predecessor = 1
                    ndash = PrevNode
                    value_ = PrevK

            if len(node_.values) + len(ndash.values) < node_.order:
                if is_predecessor == 0:
                    node_, ndash = ndash, node_
                ndash.keys += node_.keys
                if not node_.check_leaf:
                    ndash.values.append(value_)
                else:
                    ndash.nextKey = node_.nextKey
                ndash.values += node_.values

                if not ndash.check_leaf:
                    for j in ndash.keys:
                        j.parent = ndash

                self.deleteEntry(node_.parent, value_, node_)
                del node_
            else:
                if is_predecessor == 1:
                    if not node_.check_leaf:
                        ndashpm = ndash.keys.pop(-1)
                        ndashkm_1 = ndash.values.pop(-1)
                        node_.keys = [ndashpm] + node_.keys
                        node_.values = [value_] + node_.values
                        parentNode = node_.parent
                        for i, item in enumerate(parentNode.values):
                            if item == value_:
                                p.values[i] = ndashkm_1
                                break
                    else:
                        ndashpm = ndash.keys.pop(-1)
                        ndashkm = ndash.values.pop(-1)
                        node_.keys = [ndashpm] + node_.keys
                        node_.values = [ndashkm] + node_.values
                        parentNode = node_.parent
                        for i, item in enumerate(p.values):
                            if item == value_:
                                parentNode.values[i] = ndashkm
                                break
                else:
                    if not node_.check_leaf:
                        ndashp0 = ndash.keys.pop(0)
                        ndashk0 = ndash.values.pop(0)
                        node_.keys = node_.keys + [ndashp0]
                        node_.values = node_.values + [value_]
                        parentNode = node_.parent
                        for i, item in enumerate(parentNode.values):
                            if item == value_:
                                parentNode.values[i] = ndashk0
                                break
                    else:
                        ndashp0 = ndash.keys.pop(0)
                        ndashk0 = ndash.values.pop(0)
                        node_.keys = node_.keys + [ndashp0]
                        node_.values = node_.values + [ndashk0]
                        parentNode = node_.parent
                        for i, item in enumerate(parentNode.values):
                            if item == value_:
                                parentNode.values[i] = ndash.values[0]
                                break

                if not ndash.check_leaf:
                    for j in ndash.keys:
                        j.parent = ndash
                if not node_.check_leaf:
                    for j in node_.keys:
                        j.parent = node_
                if not parentNode.check_leaf:
                    for j in parentNode.keys:
                        j.parent = parentNode

# Print the tree
def printTree(tree):
    lst = [tree.root]
    level = [0]
    leaf = None
    flag = 0
    lev_leaf = 0

    node1 = Node(str(level[0]) + str(tree.root.values))

    while (len(lst) != 0):
        x = lst.pop(0)
        lev = level.pop(0)
        if (x.check_leaf == False):
            for i, item in enumerate(x.keys):
                print(item.values)
        else:
            for i, item in enumerate(x.keys):
                print(item.values)
            if (flag == 0):
                lev_leaf = lev
                leaf = x
                flag = 1

record_len = 3
bplustree = BplusTree(record_len)
bplustree.insert('5', '33')
bplustree.insert('15', '21')
bplustree.insert('25', '31')
bplustree.insert('35', '41')
bplustree.insert('45', '10')

printTree(bplustree)

if(bplustree.find('5', '34')):
    print("Found")
else:
    print("Not found")

C++

// Searching on a B+ tree in C++

#include <climits>
#include <fstream>
#include <iostream>
#include <sstream>
using namespace std;
int MAX = 3;

// BP node
class Node
{
    bool IS_LEAF;
    int *key, size;
    Node **ptr;
    friend class BPTree;

public:
    Node();
};

// BP tree
class BPTree
{
    Node *root;
    void insertInternal(int, Node *, Node *);
    Node *findParent(Node *, Node *);

public:
    BPTree();
    void search(int);
    void insert(int);
    void display(Node *);
    Node *getRoot();
};

Node::Node()
{
    key = new int[MAX];
    ptr = new Node *[MAX + 1];
}

BPTree::BPTree()
{
    root = NULL;
}

// Search operation
void BPTree::search(int x)
{
    if (root == NULL)
    {
        cout << "Tree is empty\n";
    }
    else
    {
        Node *cursor = root;
        while (cursor->IS_LEAF == false)
        {
            for (int i = 0; i < cursor->size; i++)
            {
                if (x < cursor->key[i])
                {
                    cursor = cursor->ptr[i];
                    break;
                }
                if (i == cursor->size - 1)
                {
                    cursor = cursor->ptr[i + 1];
                    break;
                }
            }
        }
        for (int i = 0; i < cursor->size; i++)
        {
            if (cursor->key[i] == x)
            {
                cout << "Found\n";
                return;
            }
        }
        cout << "Not found\n";
    }
}

// Insert Operation
void BPTree::insert(int x)
{
    if (root == NULL)
    {
        root = new Node;
        root->key[0] = x;
        root->IS_LEAF = true;
        root->size = 1;
    }
    else
    {
        Node *cursor = root;
        Node *parent;
        while (cursor->IS_LEAF == false)
        {
            parent = cursor;
            for (int i = 0; i < cursor->size; i++)
            {
                if (x < cursor->key[i])
                {
                    cursor = cursor->ptr[i];
                    break;
                }
                if (i == cursor->size - 1)
                {
                    cursor = cursor->ptr[i + 1];
                    break;
                }
            }
        }
        if (cursor->size < MAX)
        {
            int i = 0;
            while (x > cursor->key[i] && i < cursor->size)
                i++;
            for (int j = cursor->size; j > i; j--)
            {
                cursor->key[j] = cursor->key[j - 1];
            }
            cursor->key[i] = x;
            cursor->size++;
            cursor->ptr[cursor->size] = cursor->ptr[cursor->size - 1];
            cursor->ptr[cursor->size - 1] = NULL;
        }
        else
        {
            Node *newLeaf = new Node;
            int virtualNode[MAX + 1];
            for (int i = 0; i < MAX; i++)
            {
                virtualNode[i] = cursor->key[i];
            }
            int i = 0, j;
            while (x > virtualNode[i] && i < MAX)
                i++;
            for (int j = MAX + 1; j > i; j--)
            {
                virtualNode[j] = virtualNode[j - 1];
            }
            virtualNode[i] = x;
            newLeaf->IS_LEAF = true;
            cursor->size = (MAX + 1) / 2;
            newLeaf->size = MAX + 1 - (MAX + 1) / 2;
            cursor->ptr[cursor->size] = newLeaf;
            newLeaf->ptr[newLeaf->size] = cursor->ptr[MAX];
            cursor->ptr[MAX] = NULL;
            for (i = 0; i < cursor->size; i++)
            {
                cursor->key[i] = virtualNode[i];
            }
            for (i = 0, j = cursor->size; i < newLeaf->size; i++, j++)
            {
                newLeaf->key[i] = virtualNode[j];
            }
            if (cursor == root)
            {
                Node *newRoot = new Node;
                newRoot->key[0] = newLeaf->key[0];
                newRoot->ptr[0] = cursor;
                newRoot->ptr[1] = newLeaf;
                newRoot->IS_LEAF = false;
                newRoot->size = 1;
                root = newRoot;
            }
            else
            {
                insertInternal(newLeaf->key[0], parent, newLeaf);
            }
        }
    }
}

// Insert Operation
void BPTree::insertInternal(int x, Node *cursor, Node *child)
{
    if (cursor->size < MAX)
    {
        int i = 0;
        while (x > cursor->key[i] && i < cursor->size)
            i++;
        for (int j = cursor->size; j > i; j--)
        {
            cursor->key[j] = cursor->key[j - 1];
        }
        for (int j = cursor->size + 1; j > i + 1; j--)
        {
            cursor->ptr[j] = cursor->ptr[j - 1];
        }
        cursor->key[i] = x;
        cursor->size++;
        cursor->ptr[i + 1] = child;
    }
    else
    {
        Node *newInternal = new Node;
        int virtualKey[MAX + 1];
        Node *virtualPtr[MAX + 2];
        for (int i = 0; i < MAX; i++)
        {
            virtualKey[i] = cursor->key[i];
        }
        for (int i = 0; i < MAX + 1; i++)
        {
            virtualPtr[i] = cursor->ptr[i];
        }
        int i = 0, j;
        while (x > virtualKey[i] && i < MAX)
            i++;
        for (int j = MAX + 1; j > i; j--)
        {
            virtualKey[j] = virtualKey[j - 1];
        }
        virtualKey[i] = x;
        for (int j = MAX + 2; j > i + 1; j--)
        {
            virtualPtr[j] = virtualPtr[j - 1];
        }
        virtualPtr[i + 1] = child;
        newInternal->IS_LEAF = false;
        cursor->size = (MAX + 1) / 2;
        newInternal->size = MAX - (MAX + 1) / 2;
        for (i = 0, j = cursor->size + 1; i < newInternal->size; i++, j++)
        {
            newInternal->key[i] = virtualKey[j];
        }
        for (i = 0, j = cursor->size + 1; i < newInternal->size + 1; i++, j++)
        {
            newInternal->ptr[i] = virtualPtr[j];
        }
        if (cursor == root)
        {
            Node *newRoot = new Node;
            newRoot->key[0] = cursor->key[cursor->size];
            newRoot->ptr[0] = cursor;
            newRoot->ptr[1] = newInternal;
            newRoot->IS_LEAF = false;
            newRoot->size = 1;
            root = newRoot;
        }
        else
        {
            insertInternal(cursor->key[cursor->size], findParent(root, cursor), newInternal);
        }
    }
}

// Find the parent
Node *BPTree::findParent(Node *cursor, Node *child)
{
    Node *parent;
    if (cursor->IS_LEAF || (cursor->ptr[0])->IS_LEAF)
    {
        return NULL;
    }
    for (int i = 0; i < cursor->size + 1; i++)
    {
        if (cursor->ptr[i] == child)
        {
            parent = cursor;
            return parent;
        }
        else
        {
            parent = findParent(cursor->ptr[i], child);
            if (parent != NULL)
                return parent;
        }
    }
    return parent;
}

// Print the tree
void BPTree::display(Node *cursor)
{
    if (cursor != NULL)
    {
        for (int i = 0; i < cursor->size; i++)
        {
            cout << cursor->key[i] << " ";
        }
        cout << "\n";
        if (cursor->IS_LEAF != true)
        {
            for (int i = 0; i < cursor->size + 1; i++)
            {
                display(cursor->ptr[i]);
            }
        }
    }
}

// Get the root
Node *BPTree::getRoot()
{
    return root;
}

int main()
{
    BPTree node;
    node.insert(5);
    node.insert(15);
    node.insert(25);
    node.insert(35);
    node.insert(45);
    node.insert(55);
    node.insert(40);
    node.insert(30);
    node.insert(20);
    node.display(node.getRoot());

    node.search(15);
}

کاربردهای درخت B+

از کاربردهای درخت B+ می‌توان به موارد زیر اشاره کرد:

  • شاخص‌سازی چندسطحی
  • عملیات سریع‌تر روی درخت (درج، حذف، جستجو)
  • شاخص‌سازی

مقایسه درخت B+ و درخت B

برجسته‌ترین نقاط مقایسه بین B-tree و B+tree شامل موارد زیر است:

  • در B+trees، کلیدهای جستجو را می‌توان تکرار کرد، اما این مورد برای B-trees نیست.
  • درختان B به داده‌ها اجازه می‌دهند فقط در گره‌های برگ ذخیره شوند، در حالی که درختان B داده‌ها را در گره‌های برگ و داخلی ذخیره می‌کنند.
  • در B+trees، داده‌های ذخیره شده در گره برگ، جستجو را کارآمدتر می‌کند، زیرا می‌توانیم کلیدهای بیشتری را در گره‌های داخلی ذخیره کنیم - این بدان معناست که ما نیاز به دسترسی به گره‌های کمتری داریم.
  • حذف داده‌ها از B+tree آسان‌تر و سریعتر است زیرا فقط باید داده‌ها را از گره‌های برگ حذف کنیم.
  • گره های برگ در B+tree به هم مرتبط هستند و عملیات جستجو را کارآمد و سریع می‌کنند.

جمع‌بندی

B+ Tree توسعه‌ای از B Tree است که امکان درج، حذف و عملیات جستجو را فراهم می‌کند. در B Tree، کلیدها و رکوردها را می‌توان در گره های داخلی و برگ ذخیره کرد. در درخت B+، رکوردها (داده‌ها) فقط روی گره‌های برگ نگهداری می‌شوند، در حالی که گره‌های داخلی فقط می‌توانند مقادیر کلیدی را ذخیره کنند. در این مقاله، درخت B+ را از نزدیک بررسی کردیم. ما یاد گرفتیم که آنها چگونه ساخته می‌شوند و یاد گرفتیم که چگونه می‌توانیم یک مقدار خاص را جستجو، درج یا حذف کنیم؛ همچنین پیاده‌سازی‌هایی از این نوع درخت را دیدیم و با برخی کاربردها و تفاوت آن با درخت B آشنا شدیم.

درخت B+ چیست؟

درخت B+ از ریشه، گره های داخلی و برگ تشکیل شده است. ریشه ممکن است یک برگ یا یک گره با دو یا چند فرزند باشد. درخت B+ را می‌توان به عنوان یک درخت B مشاهده کرد که در آن هر گره فقط حاوی کلیدها است (نه جفت‌های کلید-مقدار) و یک سطح در پایین با برگ‌های مرتبط اضافه می کند.

درخت B+ چگونه در پایگاه داده استفاده می‌شود؟

پایگاه‌های داده SQL از درخت‌های B+ برای ذخیره کارآمد داده‌ها و انجام عملیات‌هایی مانند درج، به‌روزرسانی، یافتن و حذف با پیچیدگی زمانی O(log n) استفاده می‌کنند. این امر مدیریت و ذخیره حجم زیادی از داده ها را قابل مدیریت و کارآمدتر می کند.

چرا درخت B+ سریعتر از B-tree است؟

جستجو در درخت B ناکارآمد است زیرا رکوردها در گره های برگ یا درونی ذخیره می شوند. از آنجا که تمام رکوردها در گره های برگ درخت B+ ذخیره می‌شوند، جستجو بسیار کارآمد یا سریع‌تر است. در مقابل عملیات درج بیشتر طول می‌کشد و گاهی اوقات غیرقابل پیش‌بینی است.

درس هوش مصنوعی

هوش مصنوعی در جهان با نام آلن تورینگ گره خورده است. اولین بار در سال 1950 آلن تورینگ آزمایشی تعریف کرد که آزمایش تورینگ نام گرفت. قبل از ساخته شدن این آزمایش، آلن تورینگ ابتدا مقاله‌ای را ارائه داد که در آن مقاله از بازی‌ای با نام Imitation یا تقلید نام برده بود. هدف از طراحی این آزمایش، پاسخ دادن به سوال "آیا ماشین‌ها می‌توانند فکر کنند؟" بود. به عقیده آلن تورینگ، ماشینی هوشمند است که وقتی افراد با آن ارتباط برقرار می‌کنند، نتوانند تشخص دهند که فردی که در تعامل با آن هست یک ماشین است یا یک انسان. بعد از گذشت بیش از 70 سال از این آزمایش، هنوز هم آزمایش تورینگ از آزمایش‌هایی است که در تمامی دروس و مباحث هوش مصنوعی یاد می‌شود.

امروزه هوش مصنوعی به یکی از مباحث جدایی‌ناپذیر از روزمرگی ما انسان‌ها تبدیل شده است. از دوربین‌های مدار بسته در خیابان‌ها گرفته تا سایت‌های فروشگاهی، ماشین‌ها، ابزارآلات کارخانه‌جات و... همگی به نحوی با هوش مصنوعی در ارتباط هستند. درس هوش مصنوعی یکی از دروش چالشی در دوره کارشناسی می‌باشد که عمدتا شامل مباحث جستجو و منطق است. از آنجا که این درس در کنکور ضریب بالایی دارد، یادگیری دقیق و اصولی این درس از اهمیت بالایی برخوردار است.

هوش مصنوعی چیست و کجا مورد استفاده قرار می‌گیرد؟

هوش مصنوعی یا Artificial Intelligence از دو کلمه "هوش" و "مصنوعی" تشکیل شده است و به چیزی اطلاق می‌شود که واقعی نیست (مصنوعی است) اما باهوش هم هست و قادر است تفکر کند و تجربه کسب کند و همچنین بر اساس این تجربیات یاد بگیرد و تصمیم‌گیری‌های بهتری انجام دهد. اکثر مردم وقتی کلمه هوش مصنوعی را می‌شنوند به یاد ربات‌های نابودکننده و ابزارهای ابرانسانی فیلم‌های هالیوودی می‌افتد که هیچ هدفی جز نابود کردن نسل انسان‌ها ندارند!! درحالی که ربات‌ها تنها بخش کوچکی از هوش مصنوعی هستند و اهدافی غیر از نابود کردن هم دارند. آنالیز کردن داده‌ها، داده کاوی، یادگیری ماشین، یادگیری عمیق، شبکه های عصبی و خیلی از زمینه‌های دیگر هوش مصنوعی وجود دارند که کاملا درون کامپیوتر قرار گرفته‌اند و دارای هیچ ماهیت فیزیکی نمی‌باشند.

در این بخش، مشاغل و صنعت‌های جدیدی که از هوش مصنوعی استفاده می‌کنند را معرفی کرده و در مورد آنها بحث می‌کنیم:

  • تعلیم ربات‌ها به وسیله هوش مصنوعی برای کارهای مختلف: یکی از موارد هیجان‌انگیز هوش مصنوعی، ربات‌های خبره هستند. به وسیله هوش مصنوعی می‌توان ربات‌هایی ساخت که تجربه کسب کنند و از تجربیات خود موارد مختلفی را یاد بگیرند؛ به عنوان مثال بازوهای الکترونیکی که امروزه جایگزین کارگران در کارخانه‌ها شده و کارهای محول شده را با دقت بیشتر و سریعتر از انسان انجام می‌دهد یا به عنوان مثالی دیگر که امروزه جزء مباحث داغ قرار دارد، می‌توان به ربات‌های جراح اشاره کرد. این ربات‌ها با ظرافت هرچه بیشتر و بدون خستگی می‌توانند عمل‌های حیاتی جراحی را به نحو احسن انجام دهند و هر روزه بر توانایی این ربات‌ها نیز افزوده می‌شود.
  • هوش مصنوعی در تجارت الکترونیک: استفاده از هوش مصنوعی در تجارت الکترونیک، یکی از دستاوردهای مهم متخصصان هوش مصنوعی بود که امروزه همه ما با آن سروکار داریم. شاید اگر از کاربران قدیمی اینترنت باشید به خاطر دارید که تبلیغ‌هایی که قبلا مشاهده می‌کردید در اکثر مواقع بی‌ربط با نیازهای ما بود و یا پست‌هایی که در شبکه‌های اجتماعی مثل فیسبوک برایمان ظاهر می‌شد، ربطی به علاقه‌های ما نداشت. امروزه با مباحث هوش مصنوعی و یادگیری، امورات انجام شده کاربران مثل جستجوها و خریدها، ثبت شده و توسط ابزارهای هوش مصنوعی مورد بررسی قرار می‌گیرند تا محصولات و محتواهایی در خور نیاز ما در صفحات اول فروشگاه‌ها، در تبلیغات و شبکه‌های اجتماعی مثل اینستاگرام برایمان آورده شود.
  • ساخت خودروهای خودران: امروزه شرکت‌های مختلفی مثل تسلا، آئودی، تویوتا و ولوو وجود دارند که با استفاده از یادگیری عمیق و یادگیری ماشین، برای آموزش سیستم‌های تعبیه شده درون خودروها استفاده می‌کنند تا این خودروها بدون نیاز به سرنشین مسافت‌های طولانی را حرکت کنند و موانع مختلف را تشخیص دهند. این ماشین‌ها کمک شایانی به انسان‌ها می‌کند، جلوگیری از تصادف، پیمایش مسیرهای طولانی بدون نیاز به استراحت و خواب، رعایت کردن دقیق قوانین رانندگی از جمله مزایای این خودروها می‌باشند.
  • موارد بسیار دیگری وجود دارد که مباحث هوش مصنوعی را وارد عرصه کار خود کرده‌اند مانند حوزه پزشکی، هوش مصنوعی در هواشناسی، در بازی‌های کامپیوتری، در امور کشاورزی، در ساخت خانه هوشمند، حوزه نویسندگی و...

درس هوش مصنوعی

درس هوش مصنوعی از جمله دروس تخصصی رشته‌های مهندسی کامپیوتر، مهندسی فناوری اطلاعات (IT) و علوم کامپیوتر است. این درس جزء دروس مهم رشته مهندسی کامپیوتر به حساب می‌آید، به‌ویژه برای دانشجویانی که قصد ادامه دادن این رشته در کارشناسی ارشد را دارند. این درس در دانشگاه‌های ایران با عنوان هوش مصنوعی و سیستم های خبره ارائه می‌شود و شامل مباحث مقدماتی و تئوری هوش مصنوعی است. دروس ساختمان داده و طراحی الگوریتم از دروس مهمی هستند که پیش از مطالعه این درس لازم به گذراندن آنها است؛ همچنین آشنایی با برخی از مباحث ریاضیات مثل جبر خطی و ریاضی گسسته، به یادگیری و درک بهتر درس هوش مصنوعی کمک شایانی می‌کند. این درس معمولا در نیمه دوم تحصیلی توسط دانشجویان اخذ می‌شود (ترم 4 تا ترم 6). درس هوش مصنوعی همچنین یکی از دروس مهم برای فارغ‌التحصیلان مقطع کارشناسی که قصد دارند در رشته هوش مصنوعی به ادامه تحصیل بپردازند به حساب می‌آید؛ چه از لحاظ یادگیری مبانی هوش مصنوعی و چه از لحاظ تست‌های کنکوری.

پیش نیازهای درس هوش مصنوعی

با توجه به الگوریتم‌های مختلف و بررسی پیچیدگی زمانی و فضا در الگوریتم‌های ارائه شده در درس هوش مصنوعی، پیش‌نیاز این درس در مقطع کارشناسی، دروس ساختمان داده و الگوریتم‌ها است؛ همچنین درس جبر خطی به عنوان هم نیاز درس هوش مصنوعی است اما از آنجایی که درس‌های پیش نیاز به نوبه خود پیش نیازهای دیگری دارند، باعث می‌شود سلسه مراتبی از دروس پیش نیاز به‌وجود آید.

  1. پیش نیاز درس هوش مصنوعی: ساختمان داده و الگوریتم‌ها
  2. پیش نیاز درس ساختمان داده و الگوریتم‌ها: دروس برنامه نویسی پیشرفته و ریاضیات گسسته
  3. پیش نیاز درس برنامه نویسی پیشرفته و ریاضیات گسسته: درس مبانی برنامه نویسی
  4. پیش نیاز درس جبر خطی: ریاضی عمومی 2
  5. پیش نیاز درس ریاضی عمومی 2: ریاضی عمومی 1

همچنین کارگاه مبانی کامپیوتر و گارگاه برنامه نویسی پیشرفته نیز هم‌نیاز درس مبانی پیشرفته و برنامه نویسی پیشرفته هستند.

پس به طور خلاصه برای اخذ درس هوش مصنوعی نیاز به قبولی در دروس زیر است:

  • ریاضی عمومی 1
  • ریاضی عمومی 2
  • ریاضیات گسسته
  • مبانی برنامه نویسی
  • برنامه نویسی پیشرفته
  • کارگاه مبانی برنامه نویسی
  • کارگاه برنامه نویسی پیشرفته
  • ساختمان داده و الگوریتم‌ها

منابع درس هوش مصنوعی در دانشگاه ها

منبع درس اصلی هوش مصنوعی، کتاب هوش مصنوعی با عنوان Artificial Intelligence: A Modern Approach که توسط استوارت راسل (Stuart Russell) و پیتر نورویگ (Peter Norvig) نوشته شده است، می‌باشد. در اکثر دانشگاه‌های ایران این کتاب تدریس می‌شود و مرجع سوالات کنکور نیز همین کتاب است. این کتاب با هدف شروع مبانی هوش مصنوعی و تدریس در دانشگاه‌ها منتشر شده است. کتاب هوش مصنوعی با رویکردی نوین، توسط مترجم‌های مختلفی به زبان فارسی ترجمه شده است. البته لازم به ذکر است که تنها 10 فصل ابتدایی این کتاب به عنوان منبع درس هوش مصنوعی دانشگاه توسط وزارت علوم انتخاب شده است؛ در حالی که این کتاب شامل 28 فصل می‌باشد.

سرفصل های کتاب هوش مصنوعی: رویکردی نوین

همانطور که گفته شد، کتاب هوش مصنوعی راسل شامل 28 فصل است و تنها 10 فصل آن در طول یک ترم به دانشجویان تدریس می‌گردد. در این قسمت این 10 فصل را یک مرور کوتاهی می‌کنیم تا با کلیات قضیه آشنا شوید:

  • فصل اول؛ مقدمه (Introduction): در این فصل به طور کلی تاریخچه هوش مصنوعی، نیاز بشر به هوش مصنوعی و چالش‌های آن مورد بررسی قرار گرفته است.
  • فصل دوم؛ عامل‌های هوشمند (Intelligent Agents): این فصل به بحث و گفتگو در مورد عامل‌های هوشمند و محیط کارکرد آنها پرداخته است؛ همچنین اصطلاحات مربوط به بحث‌های هوش مصنوعی مانند خرد، عقلانیت، انواع محیط‌ها و طبیعت هوش مصنوعی در این فصل مطرح گردیده است.
  • فصل سوم؛ حل مساله به وسیله جستجو (Solving Problems by Searching): یکی از مباحث مهم در رشته هوش مصنوعی، مباحث جستجو یا به اصطلاح Searching است. در این فصل راجع به عامل‌های حل کننده مساله و جستجو کردن برای حل مساله و رسیدن به جواب نهایی، انواع الگوریتم‌های جستجو (نا آگاهانه) و ویژگی‌های آنها بحث می‌شود؛ مانند جستجوها و توابع ابتکاری (Heuristic)، جستجوی یکپارچه و...
  • فصل چهارم؛ جستجو های آگاهانه (Search in Complex Environments): این فصل هول محور الگوریتم‌های جستجوی محلی برای حل مسائل بهینه سازی می‌گردد. جستجوهای محلی، جستجو با اعمال غیر قطی، جستجوهای محیط ناشناخته و روی خط نیز از مباحث دیگری هستند که در این فصل مطرح می‌گردد.
  • فصل پنجم؛ جستجوهای خصمانه یا رقابتی (Adversarial Search and Games): همانطور که از نام این فصل پیداست، این فصل در مورد جستجوهای رقابتی که ردپای آن در اکثر بازی‌ها قابل مشاهده است بحث می‌کند. انواع الگوریتم‌های تصمیم‌گیری بهینه و کسب بیشترین امتیاز در بازی‌ها مانند هرس کردن آلفا-بتا، بازی‌های تصادفی و بسیاری موارد دیگر در این فصل مورد بررسی قرار می‌گیرند.
  • فصل ششم؛ مسائل ارضاء محدودیت (Constraint Satisfaction Problems): مسائل ارضای محدودیت یا به اختصار CSP، یکی از مبحث‌های هوش مصنوعی می‌باشد. بسیاری از مسائل مطرح شده در هوش مصنوعی، قابلیت این را دارند که به صورت یک مساله ارضای محدودیت تعریف شوند، در مسائل CSP، یک مجموعه متغیری تعریف می‌شود و سپس تعدادی محدودیت برای مقادیری که این متغیر ها می‌توانند اختیار کنند قرار داده می‌شود. حل این مسائل شامل مجموعه از از مقادیر منحصر به فرد یا Unique برای تمامی متغیرها است به طوری که تمامی محدودیت‌ها ارضا شده باشند. یک مثال ساده برای مسائل CSP، بازی سودوکو است که در آن خانه‌های مربعی می‌توانند عددهای مختلفی داشته باشند، اما به علت اینکه در هر سطر و ستون تنها هر عدد یکبار باید ظاهر شود، بنابراین محدودیت‌هایی برای انتخاب عدد در هر خانه در نظر گرفته می‌شود. در این فصل همچنین انواع جستجوها مانند جستجوی عقبگرد برای CSPها، جستجوی محلی و موارد دیگری مورد بررسی قرار می‌گیرد.
  • فصل هفتم؛ عامل‌های منطقی (Logical Agents): این فصل مقدمه توصیف عامل‌های منطقی در هوش مصنوعی است. عامل‌های منطقی عامل‌هایی هستند که بر اساس دانش عمل می‌کنند. در این فصل یک نمونه ساده که جهان وامپوس یا Wumpus World نام دارد، مورد بررسی قرار می‌گیرد. عاملی که در این جهان قرار گرفته است می‌بایست با توجه به درکی که از محیط پیرامون خود دارد و بر اساس تجزیه و تحلیل آن، بتواند مسیر درست را تا رسیدن به هدف انتخاب کند. مواردی از قبیل منطق گزاره‌ای، مدل های گزاره‌ای و عامل‌های مبتنی بر منطق گزاره‌ای نیز در این فصل مورد بررسی قرار می‌گیرند.
  • فصل هشتم؛ منطق مرتبه اول (First-Order Logic): منطق مرتبه اول از سیستم‌های سوری است که به آن منطق گزاره‌ای (Predicate Logic) یا حساب گزاره‌ای مرتبه اول (First-Order Predicate Calculus) می‌گویند. این منطق در ریاضیات، فلسفه، زبان شناسی و علوم کامپیوتر کاربردهای متعددی دارد و به همین خاطر فصل هشتم کتاب هوش مصنوعی راسل به این مبحث اختصاص داده شده است. در منطق مرتبه اول بر خلاف منطق گزاره‌ای، می‌توان از متغیرهای سور داده شده بر روی اشیاء غیر منطقی استفاده کرد؛ به عنوان مثال جمله یک دانش‌آموز y وجود دارد که y علی است و y انسان است را در نظر بگیرید. در این جمله "وجود دارد" سور و y "متغیر" است.
  • فصل نهم؛ استنتاج در منطق مرتبه اول (Inference in First-Order Logic): این فصل ادامه فصل قبل می‌باشد و در مورد استنتاج در منطق مرتبه اول بحث می‌کند. در این فصل زنجیره‌های عقب رو و جلو رو برای استنتاج در منطق مرتبه اول مورد بررسی قرار می‌گیرند.
  • فصل دهم؛ توصیف دانش (Knowledge Representation): دانش، که در بعضی متون ممکن است معرفت هم نامیده شود، آشنایی و درک یک فرد مانند اطلاعات و حقایق است که از طریق تجربه یا آموزش از طریق ادراک و یادگیری بدست می‌آید. فصل دهم کتاب هوش مصنوعی به این مبحث تعلق گرفته و موارد مختفی را شامل می‌شود؛ مانند مهندسی هستی شناسی (Ontological Engineering)، رویدادها (Events)، اشیاء ذهنی و منطق مدال (Mental Objects and Modal Logic). همچنین موارد استدلالی برای این سیستم‌ها بر اساس اطلاعات پیش‌فرض نیز مورد بحث قرار می‌گیرد.

دانلود کتاب هوش مصنوعی: رویکردی نوین

هم اکنون نسخه 4 کتاب هوش مصنوعی: رویکردی نوین آخرین نسخه چاپ شده این کتاب است که در سال 2020 به چاپ رسیده است. از طریق لینک زیر | با کلیک بر روی تصویر زیر می‌توانید این کتاب را دانلود کنید.

منابع درسی هوش مصنوعی به زبان فارسی

ترجمه‌های فارسی متفاوتی از کتاب هوش مصنوعی با رویکردی نوین راسل وجود دارد که در اینجا محبوب‌ترین آنها را معرفی می‌کنیم. این کتاب‌ها هم می‌توانند به عنوان منبع درسی هوش مصنوعی در دانشگاه‌ها مورد استفاده قرار گیرند و هم منبعی هستند برای تست‌های کنکور.

در لیست زیر 4 تا از محبوب‌ترین ترجمه‌ها را مشاهده می‌کنید:

  • ترجمه کتاب راسل از جعفر نژاد قمی؛ عنوان کتاب: هوش مصنوعی (رهیافتی نوین). این کتاب به عنوان منبع اصلی برای درس هوش مصنوعی در دانشگاه‌های پیام دور به حساب می‌آید.
  • ترجمه کتاب راسل از حمیدرضا قنبری و سجاد محمد زاده
  • ترجمه کتاب راسل از دکتر هشام فیلی منتشر شده توسط انتشارات نصیر؛ عنوان کتاب: هوش مصنوعی همراه با بازنگری کامل. این کتاب یکی از ترجمه‌های دقیق و خوانای کتاب راسل می‌باشد.
  • ترجمه کتاب راسل از آیدین خوشنویس حسینی

شاخه های هوش مصنوعی

هوش مصنوعی که خود یک شاخه از علوم کامپیوتر است، دارای شاخه‌های متعددی می‌باشد که هر شاخه نیز به شاخه‌های دیگری نیز قابل تقسیم است. در این قسمت به برخی از مهم‌ترین این شاخه‌ها می‌پردازیم.

یادگیری ماشین

یکی از شاخه‌های مهمی که کاربردهای بسیار زیادی در صنعت دارد، یادگیری ماشین یا Machine Learning (به اختصار ML) است. در یادگیری ماشین، سیستم‌های هوشمند طوری طراحی و ساخته می‌شوند که با استفاده از اطلاعات دریافتی و بدون برنامه‌ریزی اولیه و تنها با الگوریتم‌های نوشته شده، عامل شروع به یادگیری و تحلیل کند تا بتواند بر اساس یادگیری‌های خود موارد خواسته شده را پیش‌بینی و یا محاسبه کند. فرض کنید هزاران داده آماری مربوط به روند تغییر قیمت سهام را در اختیار دارید، به وسیله یادگیری ماشین، عامل می‌‌تواند شروع به یادگیری از طریق این داده‌ها کند و بر اساس آنها و الگوی دریافت شده از آنها، قیمت سهام را در آینده پیش‌بینی کند. با توجه به اینکه در دنیای امروزی داده‌ها بسیار حجیم هستند، در نتیجه اهمیت کلان داده‌ها و آنالیز آنها به یک امری جدی برای بشر تبدیل شده است. استفاده از هوش مصنوعی و یادگیری ماشین، کمک شایانی به رسیدگی به امورات تجزیه و تحلیلی می‌کند. تعدادی از مواردی که یادگیری ماشین می‌تواند به آنها رسیدگی کند را در لیست زیر مشاهده می‌کنید:

  • پردازش تصویر، تشخیص چهره، تشخیص انواع حرکت
  • تشخیص تومورهای سرطانی
  • تولید انرژی، پیش‌بینی قیمت سهام
  • ساخت خودروهای هوشمند
  • برنامه‌های تشخیص و شناسایی صدا و زبان
  • امورات مالی، انجام انواع محاسبات، تجارت الگوریتمی

یادگیری عمیق

یادگیری عمیق یا Deep Learning یکی از حوزه‌های هوش مصنوعی و در واقع زیر مجموعه‌ای از یادگیری ماشین است. در یادگیری عمیق، طراحی سیستم‌های کامپیوتری هوشمند به گونه‌ای طراحی و برنامه‌ریزی می‌شوند تا بتوانند همانند یک انسان در مورد مسائل مشخص شده یاد بگیرند و راه‌حل‌هایی ارائه کنند. مهندسان علم داده  از موارد مختلفی مانند آمار و مدل‌سازی برای پیاده سازی سیستم‌های یادگیری عمیق استفاده می‌کنند. به طور کلی استفاده از یادگیری عمیق، جمع‌آوری، آنالیز و تفسیر کلان داده‌ها را آسان‌تر و بسیار سریعتر می‌کند. ورودی الگوریتم‌هایی که برای یادگیری عمیق وجود دارند، داده‌های مختلفی است که از دنیای خارجی به آنها می‌رسد، مانند متون، صوت، تصاویر و موارد دیگر. این الگوریتم‌ها با در اختیار داشتن چنین اطلاعاتی، سعی می‌کنند الگوهایی را پیدا کنند تا بتوانند به وسیله آن پیش‌بینی خاصی را حول موضوع مشخص شده انجام دهند.

یادگیری تقویتی

در یادگیری تقویتی یا Reinforcement Learning، عامل محیط پیرامون را بررسی و تجزیه تحلیل می‌کند و بر اساس آن یک اقدامی انجام می‌دهد سپس نتیجه این اقدام را مشاهده کرده و مورد بررسی قرار می‌دهد بنابراین علاوه بر داده‌های اولیه، ماشین‌های هوشمند بر اساس تجربیات خودشان نیز دانش کسب می‌کنند و رفتار و عملکردشان را تغییر می‌دهند. این تجربیات و رفتارها آنقدر تغییر کرده و پیشرفت می‌کند تا عامل هوشمند به هدف خود برسد.

شبکه های عصبی

مغز انسان یکی از پیچیده‌ترین و شگرف‌ترین سیستمی است که به عقیده دانشمندان در کل جهان هستی وجود دارد. تمامی رفتارهایی که به صورت خودآگاه یا ناخودآگاه از انسان سر می‌زند، تحت کنترل مغز او هستند. سرعت و قدرت بالای مغز انسان به ارتباطات پیچیده‌ای بر می‌گردد که در میان سلول‌های زنده مغز انسان وجود دارد. به همین علت، عملکرد فوق‌العاده مغز انسان در بسیاری از موارد مختلف باعث شده تا شبیه سازی مغز انسان و ویژگی‌های آن، به یکی از الگوهای مهم برای مهندسین نرم افزار و سخت افزار تبدیل شود.

تحقیقات و ابداعاتی که در راستای شبیه‌سازی رفتار مغز انسان از جهت پردازش و محاسباتی انجام شده است، باعث به‌وجود آمدن علم جدیدی در هوش مصنوعی تحت عنوان شبکه های عصبی مصنوعی یا Artificial Neural Network شد. در این علم شبکه‌های عصبی، مدل‌های نرم افزاری و ریاضی گوناگونی با الهام گرفتن از عملکرد و ساختار مغز انسان پیشنهاد شده‌اند که برای حل مسائل کامپیوتری مختلفی مورد استفاده قرار می‌گیرند؛ به عنوان مثال در حوزه مسائل کاربردی و مهندسی، در مسائل علمی و...

در لیست زیر، تعدادی از کاربردهای مختلف شبکه‌های عصبی مصنوعی را آورده‌ایم:

  • توسعه نرم افزارهای آنتی ویروس
  • مدل‌سازی سیستم‌ها به وسیله مهندسی معکوس
  • عیب‌یابی سیستم‌های صنعتی
  • بهینه‌سازی سیستم‌های مهندسی
  • پیش‌بینی نتایج آزمایش‌ها
  • تشخیص بیماری‌ها با توجه به نتایج آزمایش‌های پزشکی و تصویربرداری‌ها
  • پیش‌بینی قیمت سهام و شاخص بورس
  • تخصیص سرمایه
  • طبقه‌بندی و کاوش متون ادبی
  • هدف‌گیری و تعقیب در سلاح‌های موشکی
  • پیاده‌سازی سیستم‌های دفاعی
  • پیش‌بینی رفتار نیروی مهاجم

رباتیک

شاید ملموس‌ترین کاربرد هوش مصنوعی برای عموم مردم، علم رباتیک (Robotics) باشد. ربات در واقع محصول مشترک علم مهندسی و فناوری است. ربات‌ها ماشین‌هایی هستند که رفتارهای انسان را تقلید کرده و می‌تواند در بسیاری از امورات مختلف جایگزین انسان‌ها شوند و یا دستیار انسان باشند. ربات‌ها محیط پیرامون را به وسیله سنسورها حس (Sense) می‌کنند و بر اساس آنها رفتارهایی از خود نشان می‌دهند که درخور محیط باشد.

ربات‌ها در انواع و اندازه‌های مختلفی ساخته می‌شوند تا بتوانند وظایف محول شده خاصی را انجام دهند. در اینجا انواع مهم ربات‌ها معرفی شده‌اند:

  • ربات‌های انسان نما (Humanoid Robots): ربات‌هایی هستند که شبیه به انسان ساخته شده‌اند و کارهای انسان را تقلید می‌کنند. این ربات‌ها قادر به انجام کارهایی مشابه انسان از قبیل راه رفتن، دویدن، شلیک کردن، پریدن و... هستند همچنین حالات چهره این ربات‌ها نیز از حالات چهره انسان واقعی تبعیت می‌کند و با پیشرفت تکنولوژی، روز به روز این شباهت‌ها نیز بیشتر و بهتر می‌شوند.
  • ربات‌های مستقل (Autonomous Robots): ربات‌های مستقل، ربات‌هایی هستند که بدون هیچ نظارت و کنترلی قادر به انجام وظیفه محول شده هستند. این ربات‌ها با استفاده از سنسورهای تعبیه شده در آنها محیط اطراف خود را به خوبی درک کرده و سپس با استفاده از الگوریتم‌های مختلف و تجهیزات طراحی شده عمل مناسبی را انجام می‌دهد. ربات‌های کاوشگر در سیارات دیگر و یا جاروبرقی‌های هوشمند جزء این دسته از ربات‌ها هستند.
  • ربات‌های از پیش برنامه ریزی شده (Pre-Programmed Robots): این دسته از ربات‌ها برای کارهای ساده و تک بعدی اما به طور سریع و مداوم ساخته شده‌اند. در حقیقت کارهای تکراری، ظریف و کارهایی که نیاز به دقت فراوانی دارند نیز به وسیله این دسته از ربات‌ها قابل انجام هستند. بازوی رباتیک یکی از این موارد است. این بازوها می‌توانند کارهای مختلفی از قبیل پیوند قطعات الکترونیکی، جوشکاری، اسمبل کردن و خیلی از موارد دیگر را در زمان کوتاه و با حداقل خطا انجام دهند.
  • ربات‌های قابل کنترل از راه دور (Teleoperated Robots): اگر دوران کودکی شیرینی را گذرانده باشید، احتمالا ماشین‌های کنترلی یا پهپادهای کنترلی را به خاطر دارید، در حقیقت این وسایل به نوعی ربات محسوب می‌شوند؛ البته از نوع ساده آن. ربات‌های قابل کنترل از راه دور که توسط شبکه های بی سیم هدایت می‌شوند، نوعی ربات نیمه مستقل محسوب می‌شوند که کنترل آن در دست انسان است. از این ربات‌ها در موارد مختلفی استفاده می‌شود، به عنوان مثال پهپادهای نظامی که برای شناسایی مناطق مین‌گذاری شده استفاده می‌شود.
  • ربات‌های افزودنی (Augmenting Robots): این ربات‌ها به بدن انسان افزوده می‌شود و هدف آن نیز انتساب ویژگی جدید به انسان است، بسایری از افراد به دلیل معلولیت یا نقص عضو نمی‌توانند بسیاری از فعالیت‌ها را انجام دهند. این ربات‌ها با وصل شدن به بدن انسان کمک می‌کند تا فعالیت‌هایی که به هر دلیلی قادر به انجام آن نیست را انجام دهد. هر ساله پیشرفت‌های چشمگیری در این حوزه ارائه می‌شود و اینطور که به نظر می‌رسد در آینده‌ای نه چندان دور، به یکی از ربات‌های جدایی‌ناپذیر از زندگی انسان‌ها تبدیل شوند.

در لیست زیر موارد مختلفی که از ربات‌ها استفاده می‌شوند را مشاهده می‌کنید:

  • در صنعت
  • اکتشاف
  • در زمینه کشاورزی
  • عمل جراحی
  • ربات اسباب بازی
  • بهداشت و درمان
  • ربات خدمتکار
  • در زمینه انبار داری
  • در بخش‌های نظامی
  • حمل و نقل و گردشگری

بینایی ماشین

از دیگر حوزه‌های هوش مصنوعی می‌توان به بینایی ماشین یا Machine Vision اشاره کرد. بینایی ماشین یک حوزه میان رشته‌ای است و علوم مختلفی را شامل می‌شود، از جمله این علوم می‌توان به صنایع، برق و الکترونیک، علوم رایانه و مکانیک اشاره کرد. در واقع بینایی ماشین از مبانی علوم رایانه، تکنیک‌های پردازش تصویر، مهندسی اپتیک و مهندسی مکانیک استفاده می‌کند و ارتباط نزدیکی با اتوماسین صنعتی دارد. این تکنولوژی بر اساس پردازش تصاویر دو بعدی کار می‌کند. به وسیله تجزیه و تحلیل پیرامون با دوربین‌های قدرتمندی که عامل‌های بینایی ماشین دارنده آنها هستند، می‌توان داده‌های تصویری یا همان Image Data را تولید و وارد کامپیوتر کرد. بینایی ماشین یکی از حوزه‌های رو به رشد حوزه هوش مصنوعی می‌باشد که کاربرد های مختلفی دارد.

کاربردهای بینایی ماشین

بینایی ماشین در صنایع مختلفی به طور مستقیم یا غیر مستقیم مورد استفاده قرار گرفته است که در اینجا به برخی از این صنعت‌ها می‌پردازیم:

  • استفاده از بینایی ماشین در صنعت: از بینایی ماشین در صنعت استفاده‌های مختلفی می‌شود. از جمله این کاربردها می‌توان به کنترل و بررسی موارد اولیه، کنترل میزان کیفیت محصول، کنترل موجودی انبار، مدیریت سیستم‌های امنیتی و تولید محصولات صنعتی در مقیاس بزرگ اشاره کرد.
  • بینایی ماشین در حمل و نقل: شاید اگر خیلی به جزئیات توجه کرده باشید، متوجه این امر شده باشید که چراغ‌های راهنمایی رانندگی در موارد مختلف، عملکردهای مختلفی دارند (در میدان‌های بزرگ) ممکن است چراغ قرمز 20 ثانیه شود و یا ممکن است تا 100 ثانیه هم طول بکشد و یا مثلا ناگهان سر یک عدد متوقف شود. مورد ملموس‌تر اینکه در پرداخت عوارضی‌های بین راهی شما دیگر شخصی را نمی‌بینید که در حال گرفتن عوارض باشد، بلکه همه مراحل به صورت خودکار انجام می‌شود. این تکنولوژی‌ها با دارا بودن قابلیت تشخیص خودروها و پلاک‌ها تمامی مراحل را به طور اتومات انجام می‌دهند؛ همچنین در پارکینگ‌های هوشمند، مجتمع‌های تجاری، ورودی و خروجی سازمان‌ها و تردد ماشین‌ها و ثبت تخلفات رانندگی از بینایی ماشین استفاده می‌شود.
  • هواشناسی: در سال‌های ابتدایی که تصاویر ماهواره‌ای از کره زمین گرفته می‌شد، خبرگان هواشناسی با تحلیل‌های مختلف از شرایط جوی، آب و هوا را پیش بینی می‌کردند که علاوه بر زمان‌بر بودن، اشکالات و خطاها و همچنین هزینه‌های زیادی را در بر داشت. امروزه با استفاده از بینایی ماشین می‌توان در کوتاه‌ترین مدت با کم‌ترین هزینه و با دقت بالا آب و هوا را پیش‌بینی کرد.
  • صنعت شهرسازی: با استفاده از تکنولوژی بینایی ماشین، قادر هستیم تا یک شهر را قبل از ساخته شدن به صورت دیجیتالی بازسازی کنیم، این کار به متخصصین این حوزه قبل از اجرای پروژه کمک بسیاری می‌کند؛ همچنین با استفاده از تصاویر هوایی بدست آمده از یک شهر در طول فرآیند انجام پروژه می‌توان میزان گسترش و توسعه را مورد سنجش و بررسی قرار داد.
  • استفاده از بینایی ماشین در مباحث مربوط به امنیت: از آنجایی که الگوی چشم و اثر انگشت هر انسان با دیگری متفاوت است، می‌توان از هوش مصنوعی برای تشخیص این موارد استفاده کرد؛ به عنوان مثال فناوری‌های تشخیص اثر انگشت در گوشی‌های هوشمند و لپ‌تاپ‌ها و یا ورودی‌های شرکت و همچنین سیستم تشخیص افراد بر اساس نگاه آنها از فناوری بینایی ماشین استفاده می‌کنند.
  • بینایی ماشین در صنعت کشاورزی و حوزه زراعی: سیستم بینایی ماشین قادر است تا فعالیت‌هایی نظیر پردازش تصویر از ارتفاع و در سطح زمین، تخمین خسارات وارد شده به محیط زیست و بسیاری از موارد دیگر را با دقت بالا انجام دهد. بنابراین ماشین‌های درو می‌توانند تا موقعیت صحیح محصولات کشاورزی را شناسایی کنند و بدون هرگونه آسیب رساندن به محصولات، فرآیندهای کشاورزی را انجام دهند. از موارد مهم دیگری که به وفور در صنعت کشاوری از آن استفاده می‌شود، تشخیص علف‌های هرز یا گیاهان زائد و محصول برداشتی است که توسط بینایی ماشین تفکیک داده می‌شوند.

دیگر حوزه های هوش مصنوعی

از دیگر شاخه‌های هوش مصنوعی می‌توان به موارد زیر اشاره کرد:

  • سیستم‌های خبره (Expert Systems)
  • منطق فازی (Fuzzy Logic)
  • پردازش زبان طبیعی (Natural Language Processing)
  • ماشین واکنشی (Reactive Machine)
  • مهندسی دانش (Knowledge Engineering)
  • بازیابی هوشمند (Intelligent Retrieval)

همچنین این حوزه‌ها می‌توانند با یکدیگر نیز ادغام شوند.

برنامه نویسی هوش مصنوعی

برنامه نویسی در زمینه هوش مصنوعی طیف گسترده‌ای از حوزه‌ها را در بر می‌گیرد. از ایجاد نرم‌افزارهایی برای اجرای عملیات تشخیص الگوها با استفاده از یادگیری ماشین و تحلیل داده‌ها گرفته تا برنامه نویسی سیستم‌های تعبیه شده در خودروهای خودران. همانند دیگر زمینه‌های مهندسی کامپیوتر (مثل برنامه نویسی وب، برنامه نویسی اندروید و یا بازی) برای برنامه نویسی هوش مصنوعی هم زبان های برنامه نویسی مختلف و متفاوت وجود دارد که هرکدام از آنها در موارد مختلف مورد استفاده قرار می‌گیرد و همچنین هرکدام دارای مزایا و معایب مختلفی هستند. در لیست زیر محبوب‌ترین زبان های برنامه نویسی هوش مصنوعی آورده شده است:

  • پایتون
  • لیسپ (Lisp)
  • جاوا
  • سی پلاس پلاس
  • R
  • جولیا (Julia)
  • پرولاگ (Prolog)
  • متلب (Matlab)

هوش مصنوعی با پایتون

زبان برنامه نویسی پایتون از دیرباز یکی از محبوب‌ترین زبان‌ها جهت برنامه نویسی هوش مصنوعی بوده است. به دلیل ساده بودن سینتکس‌ها، کم حجم بودن و راه‌اندازی سریع زبان و داشتن پکیج‌های بسیار زیاد و متنوع، هر روزه بر تعداد کاربران این زبان افزوده می‌شود. در این قسمت کتابخانه های پایتون معروف جهت کدنویسی برای هوش مصنوعی و تجزیه و تحلیل داده را مرور می‌کنیم. با استفاده از کتابخانه Scikit-Learn می‌توان الگوریتم های هوش مصنوعی مانند Classification و Regression را پیاده‌سازی کرد. کار کردن در زمینه Deep Learning یا یادگیری عمیق به وسیله کتابخانه‌های محبوب TensorFlow، Keras و Caffe قابل انجام است؛ همچنین با استفاده از کتابخانه هایی مانند NumPy، SciPy و Pandas می‌توان به ساخت و پردازش انواع آرایه‌ها، تجزیه و تحلیل داده‌ها و بسیاری از موارد دیگر پرداخت. اطلاعات آنالیز شده و یا نمودارها را نیز می‌توان به وسیله کتابخانه Matplotlib به حالت بصری درآورد. کتابخانه‌های دیگری هم وجود دارند که در زمینه هوش مصنوعی به برنامه نویسان کمک می‌کنند مانند SpaCy، NTLK، SimpleAI و...

هوش مصنوعی با زبان R

زبان برنامه نویسی R که مخصوص محاسبات و تحلیل‌های آماری ساخته شده است، یکی از زبان هایی است که در حوزه هوش مصنوعی کاربرد فراوانی دارد، به خصوص برای کاربردهای یادگیری ماشین. سینتکس‌های ساده و کوتاه شده، داشتن کتابخانه‌های فراوان برای ترسیم نمودارها و فرمول‌های آماری، پشتیبانی از کتابخانه‌های محبوب مانند TensorFlow، Keras و MXNet باعث شده است تا بسیاری از برنامه نویسان به سمت این زبان سوق پیدا کنند.

هوش مصنوعی با جاوا

وقتی هدف برنامه نویس هوش مصنوعی تحلیل و استخراج داده‌ها است و یا تنها می‌خواهد یک الگوریتم یادگیری را پیاده‌سازی کند، زبان‌هایی مثل پایتون و R بسیار مفید واقع می‌شوند اما ممکن است هدف از برنامه نویسی هوش مصنوعی، ایجاد یک برنامه و نرم افزار باشد که قرار است بارها توسط افراد مختلف (و مشتریان) اجرا شود. این نرم‌افزارها باید از عملکرد سریعی برخوردار باشند بنابراین استفاده از یک زبان کامپایلری مثل جاوا کار عاقلانه‌تری به نظر می‌رسد تا استفاده از یک زبان مفسری.

زبان جاوا دارای ویژگی‌های متعددی می‌باشد که مهم‌ترین آنها در لیست زیر آمده است:

  • سرعت بالا به دلیل کامپایلری بودن
  • چند سکویی یا Multiplatform بودن به دلیل استفاده از ماشین مجازی جاوا (JVM)
  • داشتن کتابخانه‌های متعدد
  • دارا بودن پشته‌های اپن سورس کلان داده
  • عیب‌یابی سریع، قابل حمل بودن، مدیریت حافظه و تطبیق‌پذیری

همین ویژگی‌های مثبت زبان جاوا باعث شده تا برای توسعه بسیاری از کاربردهای هوش مصنوعی از این زبان استفاده شود. مانند تجزیه و تحلیل داده‌ها، یادگیری عمیق، یادگیری ماشین، پردازش زبان طبیعی و بسیاری از کاربردهای دیگر.

درس هوش مصنوعی در کنکور ارشد

در کنکور ارشد کامپیوتر 1401 تمامی گرایش‌ها، درس‌های یکسانی دارند اما با ضرایب متفاوت. کل دروس به 2 بخش عمومی و تخصصی تقسیم می‌شوند. بخشی عمومی شامل زبان با ضریب 1 و مجموعه ریاضیات یعنی ریاضی 1، ریاضی 2، آمار و ریاضیات گسسته با ضریب 2 است.

بخش تخصصی شامل 11 درس است که به 4 مجموعه درسی تقسیم شده است:

  • مجموعه اول: نظریه زبان و سیگنال
  • مجموعه دوم: ساختمان داده، الگوریتم و هوش مصنوعی
  • مجموعه سوم: مدار منطقی، معماری کامپیوتر و الکترونیک دیجیتال
  • مجموعه چهارم: سیستم عامل، شبکه های کامپیوتری و پایگاه داده 

مجموعه درس دوم که شامل 3 درس ساختمان داده، الگوریتم و هوش مصنوعی است در گرایش‌های رایانش امن، شبکه‌های کامپیوتری، معماری کامپیوتر و علوم و فناوری شبکه، دارای ضریب 3 است و در گرایش هوش مصنوعی، نرم افزار، بیوانفورماتیک، علوم داده، الگوریتم و محاسبات و قرآن کاوی رایانشی دارای ضریب 4 می‌باشد. برای دیدن ضرایب بقیه درس‌ها و گرایش‌ها، به صفحه ی دروس مورد آزمون در کنکور ارشد کامپیوتر و ضرایب آن رجوع کنید. تعداد تست‌هایی که از درس هوش مصنوعی در آزمون کنکور مطرح می‌شود شامل 8 تست در کنکور مهندسی کامپیوتر و 6 تست در مهندسی فناوری اطلاعات می‌باشد. با توجه به تعداد سوالات و ضریب بالای این درس، می‌توان گفت یکی از دروس مهم کنکور کارشناسی ارشد به حساب می‌آید.

فیلم های آموزشی درس هوش مصنوعی

همانطور که قبل‌تر بیان شد، درس هوش مصنوعی اهمیت بالایی دارد بنابراین نیازمند یک آموزش کامل با بیان ساده و منسجم است تا دانشجویان بتوانند امتیاز بالایی از این درس در کنکور کسب کنند. به دلیل حجیم و البته چالش برانگیز بودن این درس، منابع کامل و کافی مناسبی برای این درس وجود ندارد، به خصوص اینکه در اکثر دانشگاه‌های ایران، با توجه به کمبود وقت، تمامی فصول هوش مصنوعی به طور کامل پوشش داده نمی‌شود بنابراین با توجه به نیازهای دانشجویان گرامی، مجموعه کاملی از ویدیوهای آموزشی برای درس هوش مصنوعی گردآوری شده تا هم نیازهای کنکور شما را برطرف سازد و هم اگر در آینده تمایل به ادامه این رشته پیدا کردید، این مجموعه آموزشی بتواند پایه‌های علم شما را مستحکم کند. ویدیو های آموزشی این مجموعه به صورت کاملا شیوا و صریح بیان شده است و از 0 تا 100 درس هوش مصنوعی را پوشش می‌دهد.

معرفی دوره درس و حل تست و سوالات هوش مصنوعی

در اینجا مشخصات پکیج قرار می‌گیرد.

بهترین منابع برای درس هوش مصنوعی در آزمون کنکور ارشد کدامند؟

با توجه به اهمیت بالای درس هوش مصنوعی در آزمون کنکور ارشد، تعداد کتاب‌های تالیف شده و آموزش‌های ویدیویی ساخته شده بسیار زیاد است و ممکن است داوطلبان کنکور را سردرگم کند. از آنجایی که مرجع درس هوش مصنوعی در دانشگاه و آزمون کنکور ارشد، کتاب Artificial Intelligence: A Modern Approach نوشته نورویگ و راسل است، در نتیجه کتب فارسی همگی ترجمه این کتاب می‌باشند و می‌توان گفت بیش از 90 درصد این کتب چه از نظر تدریس و چه از نظر تست‌ها شبیه به هم هستند. اما اگر بخواهیم با توجه به رضایتمندی داوطلبان، کتابی را انتخاب کنیم، کتاب هوش مصنوعی راسل ترجمه دکتر هشام فیلی می‌تواند گزینه مناسبی باشد. مشکلی که وجود دارد این است که تنها خواندن کتاب و یا تنها مشاهده ویدیو ممکن است کافی نباشد و بهتر است حتما در کنار کتاب درسی، ویدیوهای آموزشی نیز تهیه کنید. ویدیوهای درس هوش مصنوعی کنکور کامپیوتر با بیانی ساده و از 0 تا 100 درس هوش مصنوعی را به طور کامل پوشش داده است. بنابراین اگر قصد کسب رتبه برتر در آزمون کنکور ارشد را دارید، ویدیوهای این مجموعه به شما پیشنهاد می‌شود.

اهمیت درس هوش مصنوعی در کنکور ارشد چقدر است؟

درس هوش مصنوعی یکی از دروس مهم آزمون کنکور به حساب می‌آید. ضریب این درس در گرایش‌های مختلف متفاوت است. در گرایش‌های رایانش امن، شبکه‌های کامپیوتری، معماری کامپیوتر و علوم و فناوری شبکه، این درس دارای ضریب 3 است و در گرایش هوش مصنوعی، نرم‌افزار، بیوانفورماتیک، علوم داده، الگوریتم و محاسبات و قرآن کاوی رایانشی دارای ضریب 4 می‌باشد.

چند تست از درس هوش مصنوعی در آزمون کنکور ارشد مطرح می‌شود؟

با توجه به تغییراتی که در آزمون کنکور ایجاد می‌شود به طور دقیق نمی‌توان در این مورد نظر داد اما اگر بخواهیم آخرین آزمون کنکور را مدنظر قرار دهیم می‌توان گفت تعداد تست‌هایی که از درس هوش مصنوعی در آزمون کنکور مطرح می‌شود شامل 8 تست در کنکور مهندسی کامپیوتر و 6 تست در مهندسی فناوری اطلاعات می‌باشد.







کامپیوتر شریف

بیشتر دانش‌آموزانی که در رشته‌های نظری ریاضی فیزیک یا دانش‌آموزان فنی حرفه‌ای رشته کامپیوتر که در حال تحصیل هستند مایل‌اند برای تحصیلات تخصصی خود در یکی از بهترین رشته‌های مهندسی مانند مهندسی کامپیوتر ادامه تحصیل دهند؛ زیرا این رشته بازار کار فوق‌العاده‌ای در سراسر دنیا دارد و فارغ‌التحصیلان این رشته از دانشگاه‌های تاپ کشور در بهترین مناطق دنیا مشغول به کارند. یکی از بهترین دانشگاه‌های مطرح در ایران و سطح جهان دانشگاه صنعتی شریف یا به‌اختصار شریف است که با اساتید زبده و مدرک‌های معتبر آینده دانشجویان خود را تضمین می‌کند، در ادامه این نوشتار بیشتر به بحث مهندسی کامپیوتر شریف می‌پردازیم همچنین چند کارنامه قبولی مهندسی کامپیوتر 1401 در شریف را آنالیز می‌کنیم تا متقاضیان عزیز درک درست‌تری از نحوه انتخاب رشته و قبولی در این دانشگاه را داشته باشند، لذا با ما همراه باشید و مطالب جذاب ادامه را از دست ندهید.

دانشگاه شریف

دانشگاه صنعتی شریف یکی از بزرگ‌ترین دانشکده‌های مهندسی در جمهوری اسلامی ایران است. این دانشگاه در سال 1345 با نام دانشگاه صنعتی آریامهر تأسیس شد و در آن زمان 54 عضو هیئت‌علمی و در مجموع 412 دانشجو که با آزمون سراسری انتخاب شدند را داشت. در سال 1359 این دانشگاه به نام کنونی خود یعنی دانشگاه صنعتی شریف تغییر نام داد. اکنون در مجموع دارای 300 عضو هیئت‌علمی تمام‌وقت، تقریباً 430 عضو هیئت‌علمی پاره‌وقت و تعداد دانشجویان شریف در حدود 12000 نفر است.

ورودی دانشگاه صنعتی شریف

رتبه دانشگاه شریف

طبق آمار QS World University Rankings دانشگاه شریف یکی از برترین دانشگاه‌های جهان محسوب می‌شود و تا سال 2024 در رتبه‌بندی 334 دنیا قرار می‌گیرد.

نمودار رتبه دانشگاه صنعتی شریف

مهندسی کامپیوتر در دانشگاه شریف

رشته مهندسی کامپیوتر یکی از رشته‌های زیر مجموعه علوم ریاضی است که در بین رشته‌های پرمتقاضی در سراسر جهان شناخته می‌شود، قبولی در رشته مهندسی کامپیوتر فقط از یک طریق امکان‌پذیر است آن هم شرکت در کنکور سراسری ریاضی فیزیک و کسب حداقل درصدهای و حداقل رتبه قبولی است که در ادامه کارنامه آخرین نفرات قبول شده این دانشگاه آورده شده است و شما می‌توانید این کارنامه‌ها را بررسی کنید تا دید درست‌تری نسبت به قبولی دانشگاه شریف بیابید.

نکته لازم به ذکر دیگر این است که مهندسی کامپیوتر در دانشگاه شریف سه مقطع دارد که عبارت‌اند از:

  • کارشناسی «140 واحد و بدون گرایش»
  • کارشناسی ارشد «لازم به آوردن حداقل رتبه و درصد در کنکور ارشد کامپیوتر»
    عنوان برنامهطول دوره
    کارشناسی ارشد الگوریتم‌ها و محاسبات ۲ سال
    کارشناسی ارشد رایانش امن ۲ سال ۲ سال
    کارشناسی ارشد هوش مصنوعی ۲ سال
    کارشناسی ارشد علم داده ۲ سال
    کارشناسی ارشد بیوانفورماتیک ۲ سال
    کارشناسی ارشد نرم‌افزار ۲ سال
    کارشناسی ارشد معماری کامپیوتر ۲ سال
    کارشناسی ارشد شبکه‌های کامپیوتری ۲ سال
  • و دکتری «کنکور دکتری و مصاحبه»
    عنوان برنامهطول دوره
    دکترای نرم‌افزار 4 سال
    دکترای معماری کامپیوتر 4 سال
    دکترای هوش مصنوعی 4 سال
    دکتری الگوریتم و محاسبات 4 سال
    دکتری شبکه های کامپیوتری 4 سال
    دکتری رایانش امن 4 سال

لذا به علت نداشتن مقطع کارشناسی ناپیوسته مهندسی کامپیوتر در شریف ارائه نشده است؛ بنابراین دانش‌آموزان فنی حرفه‌ای و هنرستان‌ها نمی‌توانند در این دانشگاه پذیرش شوند. برای کسب اطلاعات بیشتر و آشنایی با دانشکده مهندسی کامپیوتر شریف می‌توانید به سایت دانشکده کامپیوتر دانشگاه شریف مراجعه کنید.

میانگین درصد و رتبه موردنیاز جهت قبولی در رشته مهندسی کامپیوتر در دانشگاه دولتی صنعتی شریف در سال‌های 1400 و 1401

در ادامه این نوشتار به میانگین درصدهای قبولی‌های دانشگاه شریف در دو سال متمادی 1400 و 1401 می‌پردازیم که باتوجه‌به جداول شاید فکر کنید اندکی قبولی 1401 نسبت به 1400 در دانشگاه شریف بهبودیافته اما این احتمال برای 1402 و 1403 خیلی کم است که همچنان رتبه‌های بالاتر بخواهند پذیرش شوند؛ زیرا هر ساله سطح متقاضیان نسبت به سال‌های قبل و بعد خود متفاوت است، حتی ممکن است ظرفیت دانشگاه برای رشته مهندسی کامپیوتر و سهمیه‌ها نیز در هر سال متفاوت باشد.

میانگین درصد و رتبه موردنیاز جهت قبولی مهندسی کامپیوتر دانشگاه دولتی صنعتی شریف سال 1401

میانگین رتبه و درصدهای لازم برای کنکور کامپیوتر دانشگاه شریف
نام درس میانگین درصد موردنیاز
ریاضی 60
فیزیک 90
شیمی 60
میانگین رتبه
منطقه 1 1-55
منطقه 2 1-31
منطقه 3 1-26

میانگین درصد و رتبه موردنیاز جهت قبولی مهندسی کامپیوتر دانشگاه دولتی صنعتی شریف سال 1400

میانگین رتبه و درصدهای لازم برای کنکور کامپیوتر دانشگاه شریف
نام درس میانگین درصد موردنیاز
ریاضی 60
فیزیک 90
شیمی 70
ادبیات 80
عربی 90
معرف 90
زبان انگلیسی 90
میانگین رتبه
منطقه 1 1-42
منطقه 2 1-18
منطقه 3 1-3

آخرین رتبه‌های قبولی رشته مهندسی کامپیوتر روزانه در دانشگاه صنعتی شریف در مناطق یک و دو و سه در سال 1401

در ادامه سه کارنامه که مربوط به آخرین نفرهای قبول شده دانشگاه شریف در رشته مهندسی کامپیوتر 1401 است آورده شده است، توجه داشته باشید که درصدهای کارنامه‌ها حدودی است و منظور از شهر، شهر متقاضی قبول شده است.

آخرین رتبه قبولی در رشته مهندسی کامپیوتر روزانه دانشگاه دولتی صنعتی شریف در منطقه 1

اولین کارنامه قبولی مهندسی کامپیوتر روزانه دانشگاه دولتی صنعتی شریف تهران منطقه 1
ادبیات شیمی معارف زبان عربی فیزیک ریاضی رتبه کشوری رتبه در منطقه 1 شهر
84 47 90 78 90 100 96 8 6 تهران
84 66 80 89 90 95 89 36 25 تهران
71 59 67 87 72 86 91 135 92 تهران

آخرین رتبه قبولی در رشته مهندسی کامپیوتر روزانه دانشگاه دولتی صنعتی شریف در منطقه 2

دومین کارنامه قبولی مهندسی کامپیوتر روزانه دانشگاه دولتی صنعتی شریف تهران منطقه 2
شیمی عربی زبان ادبیات ریاضی فیزیک معارف رتبه کشوری رتبه در منطقه 2 شهر
89 90 95 79 85 90 100 12 2 همدان
68 79 89 74 78 92 84 109 29 کرج
60 59 69 79 85 84 86 152 43 سمنان
70 - - - 59 88 - 67 21 تهران

آخرین رتبه قبولی در رشته مهندسی کامپیوتر مقطع روزانه در دانشگاه دولتی صنعتی شریف در منطقه 3

سومین کارنامه قبولی مهندسی کامپیوتر دانشگاه دولتی صنعتی شریف تهران منطقه 3
ادبیات فیزیک معارف عربی ریاضی زبان شیمی رتبه کشوری رتبه در منطقه 3 شهر
95 88 90 100 90 84 84 10 1 شیروان
84 88 87 96 79 77 56 123 5 بجستان
66 73 80 86 53 95 48 829 47 پاکدشت

جمع‌بندی

امیدواریم از این نوشتار هم مانند سایر نوشتارهای وبلاگ کنکور کامپیوتر مفید واقع شده باشد، برای قبولی مهندسی کامپیوتر دانشگاه شریف هر لحظه و هر جا کنار شما خواهیم بود، شما عزیزان برای کسب اطلاعات بیشتر و دوره‌های کنکور کامپیوتر مؤسسه ما می‌توانید از طریق تماس با مشاورین زبده ما در تماس باشید و مشاوره رایگان دریافت کنید.

آیا قبولی در کارشناسی مهندسی کامپیوتر دانشگاه شریف نیاز به کنکور دارد؟

بله صددرصد، متقاضیان عزیز بایستی با قبولی در کنکور سراسری ریاضی فیزیک بتوانند حداقل رتبه لازم را که در متن مقاله به آن اشاره شده است کسب نمایند و هیچ راه دیگری برای قبولی در این دانشگاه وجود ندارد.

آیا کارشناسی ارشد مهندسی کامپیوتر در دانشگاه شریف دارای مصاحبه تخصصی است؟

در سالیان 1400 و قبل‌تر مصاحبه فقط برای دوره دکتری شریف انجام می‌شد؛ اما اکنون گویا دانشگاه شریف برای دانشجویان ارشد آن هم در یک سری رشته‌های خاص مصاحبه تخصصی برگزار می‌کند.

اعتبار مدرک دانشگاه شریف چقدر است؟

باتوجه‌به رتبه‌بندی ذکر شده در متن مقاله، تقریباً کل کشورهای دنیا مدرک دانشگاه شریف را یکی از معتبرترین مدارک دانشگاهی برمی‌شمارند.







رشته آی تی دانشگاه شریف(به نویسنده گفتم اضافه کنه)

رشته آی تی یا فناوری اطلاعات هم مانند رشته مهندسی کامپیوتر یکی از رشته‌های پرطرفدار امروزی است که هر چند مانند کامپیوتر شناخته شده نیست؛ اما بسیار عالی و پرکاربرد است. در این نوشتار از کنکور کامپیوتر ابتدا اینکه رشته‌ آی تی چیست و چه تفاوتی با کامپیوتر دارد را شرح می‌دهیم سپس به سراغ رشته‌ آی تی در یکی از بهترین دانشگاه های ایران یعنی دانشگاه صنعتی شریف تهران می‌رویم و درصدها و رتبه‌های لازم را برای تحصیل آی تی شریف عنوان می‌کنیم، در آخر چندین کارنامه مربوط به قبولی‌های آی تی شریف را تحلیل و بررسی خواهیم کرد؛ پس اگر متقاضی قبولی در رشته آی تی دانشگاه شریف هستید، اطلاعات مفید این صفحه را به هیچ عنوان از دست ندهید.

رشته آی تی چیست؟ و تفاوت آن با مهندسی کامپیوتر چیست؟

رشته‌ آی تی IT خلاصه شده‌ی عبارت Information Technology یعنی فناوری اطلاعات، فارغ‌التحصیلان و کارشناسان این رشته باید بکوشند در بخش فناوری سازمان‌ها و یا شرکت‌ها فعالیت کنند تا اطلاعات را مدیریت کنند. برخلاف مهندسین کامپیوتر که باید یکی از گرایشات نرم‌افزار یا سخت‌افزار را انتخاب کنند، متخصصان آی تی باید در هر دو حوزه نرم‌افزار و سخت افزار کامپیوتر فعالیت داشته باشند؛ یعنی با یکسری قطعات سخت افزاری مانند روترها، سوئیچ‌ها، کابل‌ها، کامپیوترها کار کنند و یک سری تنظیمات نرم‌افزاری نیز انجام دهند. در واقع با گسترش فناوری‌ها و تکنولوژی داده‌های زیادی در سرتاسر دنیا به‌وجود آمد که به آنها بیگ دیتا می‌گویند، اکثر سازمان‌ها برای مدیریت این داده‌ها نیاز به متخصصان آی تی دارند، یک کارشناس آی تی باید بکوشد علاوه بر این اطلاعات حجیم، کامپیوترهای سازمان و پایگاه داده‌های را هم مدیریت و سامان‌دهی کند. در کشور ما رشته‌ آی تی اکثر در مقطع لیسانس ارائه می‌شود یا حتی در بعضی از دانشگاه‌های سر فصل‌های آن بسیار شبیه به علوم کامپیوتر است.

در کل سه دانشگاه پیشرو در زمینه‌ آی تی در ایران است:

  • دانشگاه صنعتی شریف
  • دانشگاه امیرکبیر
  • دانشگاه تهران

که‌ آی تی را در یک رشته مجزا با سر فصل‌های مجزا و در سه مقطع:

  • کارشناسی
  • کارشناسی ارشد
  • دکتری

ارائه می‌دهند.

در این تصویر شخصی درحال مدیریت اطلاعات است

رشته آی تی در دانشگاه شریف

دانشگاه شریف یکی از بهترین دانشگاه‌های ایران و البته جهان است که به داشتن اساتید برتر، دانشجویان فعال، تحقیقات پیشرفته و گسترده، همچنین کیفیت آموزشی بالاتر از حد استاندارد معروف است، این دانشگاه طبق آمار مرکز QS World University Rankings تا سال 2024 رتبه 334 بین کل دانشگاه‌های جهان را کسب خواهد کرد. رشته‌ آی تی از سال 1380 در دانشگاه صنعتی شریف در دو مقطع کارشناسی و کارشناسی ارشد ارائه می‌شود و در واقع یکی از اولین دانشگاه‌های ایران است که رشته‌ آی تی را ارائه کرده است.

سرفصل درس‌های رشته‌ آی تی و تعداد واحدها:

  • تعداد کل واحدها: 140تا
  • دروس عمومی: 22 واحد
  • دروس پایه: 20 واحد
  • دروس اصلی: 59 واحد
  • دروس انتخابی: 8 واحد

کارشناسی‌ آی تی دانشگاه شریف - رتبه و درصدهای لازم

قبولی در مقطع کارشناسی در رشته آی تی دانشگاه شریف مثل قبولی مهندسی کامپیوتر شریف رتبه و درصد می‌طلبد (با اندکی اختلاف) چون این دو رشته بسیار نزدیک به هم هستند حتی مقطع ارشد فناوری اطلاعات می‌توان با مهندسی کامپیوتر قبول شد. برای قبولی رشته‌ آی تی دانشگاه شریف به‌طور میانگین با توجه به منطقه یک یا دو یا سه بودن درصدهای زیر لازم است.

منطقه یک

قبولی برای داوطلبان منطقه یک به طور میانگین نیازمند درصدهای زیر است:

نام درسدرصد
ادبیات فارسی 80%
شیمی 43%
ریاضیات 94%
فیزیک 100%
معارف 89%
زبان 75%
عربی 94%

منطقه دو

قبولی برای داوطلبان منطقه دو به طور میانگین نیازمند درصدهای زیر است:

نام درسدرصد
ریاضیات 70%
فیزیک 80%
معارف 95%
زبان 90%
ادبیات فارسی 64%
عربی 80%
شیمی 40%

منطقه سه

قبولی برای داوطلبان منطقه سه به طور میانگین نیازمند درصدهای زیر است:

نام درسدرصد
ادبیات فارسی 66%
زبان 91%
شیمی 45%
عربی 74%
معارف 97%
ریاضیات 66%
فیزیک 90%

کارشناسی ارشد آی تی دانشگاه شریف - رتبه و درصدهای لازم

قبولی در مقطع ارشد آی تی دیگر مانند کارشناسی نیازمند درصدهای خوب و یا رتبه‌های تک رقمی نیست، هر چند دروس به مراتب تخصصی و سخت‌تر از دروس دبیرستان هستند و بیشتر مختص به رشته کامپیوتر هستند اما با توجه به کاهش به یکباره متقاضیان شرایط کمی آسان‌تر از مرحله کارشناسی آی تی در دانشگاه شریف است. در ارشد آی تی دانشجویان می‌توانند هم از سمت کارشناسی مهندسی کامپیوتر و هم از سمت رشته‌ آی تی کنکور سراسری ارشد را طی کنند و بعد از کسب درصد و رتبه لازم در دانشگاه شریف مشغول به تحصیل شوند. در ادامه توجه شما را به کارنامه قبولی‌ آی تی دانشگاه شریف در مقطع ارشد جلب می‌کنیم:

در این تصویر، کارنامه مربوط به قبولی یک داوطلب با سهمیه پنج درصدی در آزمون ارشد 1400 که رشته آی تی شریف پذیرفته شده‌ است قرار دارد

این کارنامه مربوط به قبولی یک داوطلب با سهمیه پنج درصدی در آزمون ارشد 1400 است که رشته آی تی شریف پذیرفته شده‌اند اگر به درصدها توجه کنید می‌بیند که با سطح متوسط رو به بالا زدن در آزمون ارشد می‌توان به‌راحتی قبول شد؛ فقط نکته حائز اهمیت این جا بحث سهمیه‌ها است که افراد با سهمیه آزاد باید رتبه‌ها و درصدهای بهتری کسب کنند.

جمع‌بندی

امیدواریم این نوشتار هم مانند سایر نوشتارهای بلاگ کنکور کامپیوتر برای شما مفید واقع شده باشد، اگر به دنبال تحصیل در دانشگاه‌ها و رشته‌های تاپ در ایران یا خارج از کشور مانند آی تی دانشگاه شریف هستید، موسسه کنکور کامپیوتر در هر لحظه کنار شما خواهد بود تا رتبه‌های بهتری کسب کنید برای کسب اطلاعات بیشتر در این زمینه می‌توانید از طریق مشاوره تلفنی رایگان با موسسه ما در ارتباط باشید.

آیا رشته آی تی بهتر است یا مهندسی کامپیوتر؟

رشته‌ آی تی تقریباً جدیدتر از مهندسی کامپیوتر است؛ اما از لحاظ بهتری این دو هیچ برتری نسبت به هم ندارند، بسته به علایق دانشجویانم دارد که کدام را برگزینند.

آیا رشته‌ آی تی به صورت کارشناسی ناپیوسته در دانشگاه شریف ارائه می‌شود؟

خیر، دانشگاه شریف در کل دو مقطع کارشناسی و کارشناسی ارشد آی تی را ارائه می‌دهد و هیچ مقطع ناپیوسته‌ای برای این رشته در شریف موجود نیست.

آیا میتوان بدون کنکور آی تی شریف پذیرفته شد؟

خیر، تنها راه قبولی در رشته‌ آی تی شریف کنکور سراسری رشته ریاضی فیزیک که هر ساله تحت نظر سازمان سنجش برگزار می‌شود، است.

این مطلب چقدر به کارت آمد؟11111111110.00 از ۵ 0 رأی
اشتراک

پرسش و پاسخ داوطلبان کنکور ارشد کامپیوتر

سوال شما توسط استاد رضوی پاسخ داده می‌شود و از طریق پیامک به شما اطلاع رسانی می‌شود
×
kb
هیچ نظری ارسال شده در اینجا وجود ندارد
تلگرام اینستاگرام تماس با پشتیبانی: 09378555200 تماس با پشتیبانی: 09378555200
خدمات ما
پشتیبانی کنکور کامپیوتر

سؤالی داری؟ از ۸ صبح تا ۱۰ شب پاسخ‌گوییم.

تماس با پشتیبانی۰۹۳۷۸۵۵۵۲۰۰ پشتیبانی در تلگرامپاسخ‌گویی پیامی
شبکه‌های اجتماعی
کانال تلگرام اینستاگرام آپارات یوتیوب
اشتراک‌گذاری این مطلب

فاطمه نامور (2)

تلگرام واتس‌اپ ایکس
https://www.konkurcomputer.ir/content_user12.html
خدمات کنکور کامپیوتر
هر چیزی که برای قبولی لازم داری، یک‌جاخدمات ما

از مشاوره‌ی شخصی با استاد رضوی تا فیلم‌های دروس، پلتفرم‌ها و ابزارهای رایگان

مشاوره‌ی شخصی با استاد رضوی
تماس با پشتیبانی