BFS (Breadth-First Search)
البحث بالعرض BFS (Breadth-First Search)
BFS يزور كل جيران العقدة الحالية أولًا قبل التعمّق لأبعد منها، باستخدام طابور (Queue) — يضمن أقصر مسار بعدد القفزات في رسم بياني غير موزون.
بعكس DFS التي تتعمّق بفرع واحد حتى نهايته، BFS تُوسّع دائرة البحث مستوى تلو مستوى (كموجة تنتشر من نقطة البداية) — لهذا أول مرة تصل فيها لعقدة الهدف، يكون المسار المقطوع هو الأقصر ممكن بعدد الأضلاع (بشرط أن الرسم البياني غير موزون، أو كل أضلاعه بنفس الوزن).
الصياغة
from collections import deque
queue = deque([start])
visited = {start}
while queue:
node = queue.popleft()
for neighbor in graph[node]:
if neighbor not in visited:
visited.add(neighbor)
queue.append(neighbor)📄 مثال
from collections import deque
def bfs_shortest_path(graph, start, target):
visited = {start}
queue = deque([(start, [start])])
while queue:
node, path = queue.popleft()
if node == target:
return path
for neighbor in graph[node]:
if neighbor not in visited:
visited.add(neighbor)
queue.append((neighbor, path + [neighbor]))
return None
graph = {"A": ["B", "C"], "B": ["D"], "C": ["D"], "D": []}
print(bfs_shortest_path(graph, "A", "D")) # ['A', 'B', 'D']أهم النقاط
| النقطة | الوظيفة |
|---|---|
| التعقيد الزمني | O(V + E) — تزور كل عقدة وكل ضلع مرة واحدة تقريبًا |
| الهيكل المساعد | طابور (Queue) بمبدأ FIFO |
| أقصر مسار؟ | نعم، لكن فقط في رسم بياني غير موزون (أو أوزان متساوية) |
💡 نصائح عملية
- استخدم BFS كلما احتجت أقصر مسار بعدد القفزات برسم غير موزون — أبسط وأسرع إعدادًا من Dijkstra لهذه الحالة تحديدًا
⚠️ أخطاء شائعة
- نسيان تسجيل العقدة في visited فور إضافتها للطابور (لا عند إخراجها) — يسبب إضافتها للطابور عدة مرات ويُبطئ الخوارزمية
خصائص ذات صلة
🎓 تريد فهم الصورة الكاملة خطوة بخطوة؟ ابدأ من مسار DSA الكامل بالعربي.