تخطَّ إلى المحتوى

🧮 شرح هياكل البيانات والخوارزميات

خوارزميات الرسم البياني — BFS و DFS بالصور

الدرس 29 من 32· ⏱ 4 دقائق قراءة

تمثيل الرسم البياني

شبكة صداقات:
        ┌───┐
   ┌────│أحمد│────┐
   │    └───┘    │
   ▼             ▼
 ┌───┐         ┌───┐
 │سارة│         │خالد│
 └───┘         └───┘
   │             │
   ▼             ▼
 ┌───┐         ┌───┐
 │نور│         │ليلى│
 └───┘         └───┘

تمثيله في الكود (قائمة جوار):

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 CrawlingBFS / 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 — إيجاد أقصر مسار بين نقطتين برسم بياني موزون.

شرح خوارزميات الرسم البياني — BFS و DFS بالصور — هياكل البيانات والخوارزميات بالعربي
خوارزميات الرسم البياني — BFS و DFS بالصورهياكل البيانات والخوارزميات بالعربي · The Code Fix

📚 لمزيد من التعمّق في هياكل البيانات والخوارزميات، راجِع هياكل البيانات على ويكيبيديا.

هل كان هذا الدرس مفيدًا؟