تمثيل الرسم البياني
شبكة صداقات:
┌───┐
┌────│أحمد│────┐
│ └───┘ │
▼ ▼
┌───┐ ┌───┐
│سارة│ │خالد│
└───┘ └───┘
│ │
▼ ▼
┌───┐ ┌───┐
│نور│ │ليلى│
└───┘ └───┘
تمثيله في الكود (قائمة جوار):
graph = {
"أحمد": ["سارة", "خالد"],
"سارة": ["أحمد", "نور"],
"خالد": ["أحمد", "ليلى"],
"نور": ["سارة"],
"ليلى": ["خالد"]
}
BFS — البحث باتساع (Friends Network)
الفكرة: ابدأ من عقدة، زر كل الجيران أولًا، ثم جيران الجيران، وهكذا.
تستخدم Queue — FIFO (First In, First Out)
BFS من "أحمد":
الخطوة 1: الخطوة 2: الخطوة 3:
Queue Queue Queue
┌───────┐ ┌───────┐ ┌───────┐
│ أحمد │←OUT │ سارة │←OUT │ نور │←OUT
├───────┤ ├───────┤ ├───────┤
│ │ │ خالد │ │ ليلى │
└───────┘ └───────┘ └───────┘
الترتيب النهائي: أحمد → سارة → خالد → نور → ليلى
from collections import deque
def bfs(graph, start):
visited = set()
queue = deque([start])
visited.add(start)
while queue:
node = queue.popleft()
print(node, end=" → ")
for neighbor in graph[node]:
if neighbor not in visited:
visited.add(neighbor)
queue.append(neighbor)
BFS يجد أقصر طريق في شبكة غير موزونة:
أحمد → خالد: خطوتين
أحمد → ليلى: 3 خطوات (أحمد → خالد → ليلى)
DFS — البحث بعمق (Maze Solving)
الفكرة: اذهب بعمق في كل مسار قبل الرجوع.
تستخدم Stack — LIFO (Last In, First Out)
DFS من "أحمد" — كأنك تستكشف متاهة:
أحمد
│
├──→ سارة
│ │
│ └──→ نور
│
└──→ خالد
│
└──→ ليلى
الترتيب: أحمد → سارة → نور → خالد → ليلى
def dfs(graph, start, visited=None):
if visited is None:
visited = set()
visited.add(start)
print(start, end=" → ")
for neighbor in graph[start]:
if neighbor not in visited:
dfs(graph, neighbor, visited)
DFS مع مكدس صريح:
Stack
┌───────┐
│ أحمد │←POP → نزور أحمد
├───────┤
│ سارة │←PUSH (جيران أحمد)
│ خالد │
└───────┘
┌───────┐
│ سارة │←POP → نزور سارة
├───────┤
│ خالد │
│ نور │←PUSH (جيران سارة)
└───────┘
┌───────┐
│ نور │←POP → نزور نور
├───────┤
│ خالد │←POP → نزور خالد
└───────┘
┌───────┐
│ ليلى │←POP → نزور ليلى
└───────┘
⚠️ BFS يضمن أقصر طريق في رسم غير موزون. DFS يستهلك ذاكرة أقل لكن لا يضمن أقصر طريق.
BFS vs DFS — مقارنة بصرية
BFS (موجة): DFS (حفر):
○ ← ○ ← ○ ○ — ○ — ○
↓ ↑ ╲ ╱
○ → ○ → ○ ○ — ○ — ○
انتشار كالموجة حفر كالنفق
ذاكرة: O(width) ذاكرة: O(depth)
أقصر طريق: نعم أقصر طريق: لا
حل متاهة — تطبيق عملي
المتاهة:
S = البداية, E = النهاية, # = جدار, . = مسار
S . . # . . .
# # . # . # .
. . . . . # .
# # # # . # .
. . . . . . E
BFS يجد أقصر مسار (عدد الخطوات):
S → . → . → # → . → . → .
# → # → . → # → . → # → .
. → . → . → . → . → # → .
# → # → # → # → . → # → .
. → . → . → . → . → . → E
المسار الأمثل: 14 خطوة
تطبيقات واقعية
| التطبيق | الخوارزمية | الشرح |
|---|---|---|
| GPS / خرائط | BFS / Dijkstra | أقصر طريق بين نقطتين |
| شبكات التواصل | BFS | اقتراح أصدقاء (Friends of friends) |
| Web Crawling | BFS / DFS | زحف محركات البحث على الإنترنت |
| تحليل التبعيات | DFS | ترتيب حزم البرامج (Topological Sort) |
| الألعاب | BFS | تحريك الشخصيات في المتاهات |
| الذكاء الاصطناعي | DFS | استكشاف شجرة القرارات (Game AI) |
شبكة الويب العالمية كرسم بياني:
┌───────────┐
│ google.com │
└─────┬─────┘
│
┌─────────┼─────────┐
▼ ▼ ▼
┌───────┐ ┌───────┐ ┌───────┐
│ github│ │stack │ │youtube│
│ .com │ │overflow│ │ .com │
└───────┘ └───────┘ └───────┘
│ │ │
▼ ▼ ▼
┌───────┐ ┌───────┐ ┌───────┐
│ more │ │ more │ │ more │
│ links │ │ links │ │ links │
└───────┘ └───────┘ └───────┘
BFS → crawl بالعرض (صفحات قريبة أولاً)
DFS → crawl بعمق (مسار كامل قبل الانتقال)
الخلاصة
- BFS: أصدقاء مباشرين أولًا → Queue
- DFS: أعمق صديق أولًا → Stack
- BFS لأقصر طريق، DFS لذاكرة أقل
- كلاهما أساس خوارزميات الذكاء الاصطناعي والخرائط
🎯 التالي: خوارزمية Dijkstra — إيجاد أقصر مسار بين نقطتين برسم بياني موزون.