Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

البحث بالعرض (BFS)

آخر تحديث

يستكشف البحث بالعرض الرسم البياني مستوى تلو الآخر. بدءًا من عقدة المصدر، يزور أولًا جميع جيرانها المباشرين، ثم جميع الجيران غير المزارين لهؤلاء، وهكذا - متوسعًا نحو الخارج في حلقات ذات مسافة متزايدة. اضغط تشغيل بالأعلى لمشاهدته يتفرع من عقدة البداية طبقة تلو الأخرى.

يستخدم BFS طابورًا من نوع الوارد أولًا يخرج أولًا، وهو ما يفرض الترتيب مستوى تلو الآخر. لأنه يصل إلى العقد بترتيب مسافة القفزات، يجد BFS أقصر مسار (أقل عدد من الحواف) في رسم بياني غير موزون. يزور كل عقدة وحافة مرة واحدة، لذا يعمل في زمن O(V + E).

التعقيد الزمني والمكاني

المقياسالتعقيدملاحظات
الزمنO(V + E)كل رأس وحافة تُزار مرة واحدة
المساحةO(V)الطابور + مجموعة المزارة، في أسوأ الحالات كل العقد
الاجتيازمستوى تلو الآخرأقرب العقد أولًا، في حلقات
أقصر مسارنعم (غير موزون)يصل إلى كل عقدة بأقل عدد من الحواف

خطوة بخطوة

الخطوةماذا يحدث
1أضف عقدة المصدر إلى الطابور.
2أخرج العقدة الأمامية وضع علامة أنها مزارة.
3افحص كل واحد من جيرانها.
4أضف إلى الطابور أي جار غير مزار وليس في الطابور بالفعل.
5كرّر حتى يصبح الطابور فارغًا.

مثال محلول

اجتياز هذا الرسم البياني بدءًا من العقدة 0، حيث 0-1 و0-2 و1-3 و2-3 و2-4 حواف:

الخطوةالمزارةالطابور (الحدود)
البداية{}[0]
أخرج 0{0}[1, 2]
أخرج 1{0, 1}[2, 3]
أخرج 2{0, 1, 2}[3, 4]
أخرج 3{0, 1, 2, 3}[4]
أخرج 4{0, 1, 2, 3, 4}[] (انتهى)

متى تستخدم BFS

استخدمه عندماتجنّبه عندما
تحتاج إلى أقصر مسار في رسم بياني غير موزونتحمل الحواف أوزانًا - استخدم Dijkstra بدلًا منه
من المرجح أن يكون الهدف قريبًا من المصدرالرسم البياني عريض جدًا - قد يحتفظ الطابور بحدود ضخمة
تريد استكشاف رسم بياني بترتيب المستوياتتحتاج فقط إلى الوصول إلى أي عقدة، حيث يستخدم DFS ذاكرة أقل
تبحث عن المكوّنات المتصلة أو مسار بأقل عدد من القفزاتتحتاج إلى الترتيب الطوبولوجي أو كشف الدورات - DFS أنسب

تنفيذ نظيف وقابل للتشغيل لخوارزمية Breadth-First Search بلغات Python, JavaScript, Java, C++, C. اختر لغة، وانسخ الكود، أو افتحه محمّلًا مسبقًا في ساحة تجربة Coddy.

كود Breadth-First Search بلغة Python

Python
1from collections import deque2
3
4def bfs(graph, start):5    visited = {start}6    queue = deque([start])7    order = []8    while queue:9        node = queue.popleft()10        order.append(node)11        for neighbor in graph[node]:12            if neighbor not in visited:13                visited.add(neighbor)  # mark on enqueue, not dequeue14                queue.append(neighbor)15    return order16
17
18graph = {19    "A": ["B", "C"],20    "B": ["D", "E"],21    "C": ["F"],22    "D": [],23    "E": ["F"],24    "F": [],25}26
27print("BFS order:", " -> ".join(bfs(graph, "A")))
شغّل هذا الكود في ساحة تجربة Python

أسئلة شائعة حول البحث بالعرض

ما هو التعقيد الزمني لـ BFS؟
يعمل BFS في زمن O(V + E)، حيث V عدد الرؤوس وE عدد الحواف، لأنه يزور كل رأس مرة واحدة ويفحص كل حافة مرة واحدة. يستخدم O(V) من المساحة للطابور ومجموعة المزارة.
هل يجد BFS أقصر مسار؟
نعم، في رسم بياني غير موزون. لأن BFS يصل إلى العقد بترتيب مسافة القفزات من المصدر، فإن أول وصول إلى عقدة يكون عبر مسار بأقل عدد من الحواف. أما للرسوم البيانية الموزونة فتحتاج إلى خوارزمية Dijkstra.
ما الفرق بين BFS وDFS؟
يستخدم BFS طابورًا ويستكشف مستوى تلو الآخر (الأقرب أولًا)، بينما يستخدم DFS مكدسًا ويتعمق على طول فرع واحد قبل التراجع. يجد BFS أقصر المسارات غير الموزونة؛ ويستخدم DFS ذاكرة أقل في الرسوم البيانية العريضة ويناسب كشف الدورات والترتيب الطوبولوجي.
متى ينبغي أن أستخدم BFS بدلًا من خوارزمية Dijkstra؟
استخدم BFS عندما تكون لكل الحواف التكلفة نفسها، لأنه يجد المسار الأقل حوافًا في زمن O(V + E) دون طابور أولوية. تكون خوارزمية Dijkstra ضرورية عندما تحمل الحواف أوزانًا مختلفة؛ فتشغيل BFS الصرف على رسم بياني موزون يعطي المسار الأقل قفزات، لا الأقل تكلفة.
لماذا يحتاج BFS إلى مجموعة مزارة؟
قد تحتوي الرسوم البيانية على دورات، لذا بدون مجموعة مزارة سيضيف BFS العقدة نفسها إلى الطابور مرارًا ويدور إلى ما لا نهاية. كما أن وضع علامة على العقدة عند إضافتها إلى الطابور أول مرة (لا عند إخراجها) يمنع إضافة العقدة نفسها إلى الطابور مرتين من جيران مختلفين.
هل أضع علامة على العقدة كمزارة عند الإضافة إلى الطابور أم عند الإخراج منه؟
ضع العلامة عند الإضافة إلى الطابور. إذا انتظرت حتى الإخراج، فقد تُضاف العقدة إلى الطابور عدة مرات من جيران مختلفين قبل معالجتها، مهدرًا الذاكرة والوقت. وضع العلامة عند الإضافة يضمن دخول كل عقدة إلى الطابور مرة واحدة بالضبط.
Coddy programming languages illustration

أتقن الخوارزميات مع Coddy

ابدأ الآن