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

DFS (Depth-First Search)

البحث بالعمق DFS (Depth-First Search)

DFS يتعمّق في فرع واحد من الرسم البياني حتى نهايته قبل التراجع لتجربة فرع آخر، باستخدام مكدّس (أو التعاوديّة).

على عكس BFS التي توسّع مستوى كاملاً قبل الانتقال للتالي، DFS تختار جارًا واحدًا وتتعمّق فيه بالكامل أولًا، ثم تتراجع (backtrack) لتجرّب الجيران الآخرين. مفيدة لاستكشاف كل المسارات الممكنة، كشف الدورات، والترتيب الطوبولوجي.

الصياغة

def dfs(graph, node, visited):
    visited.add(node)
    for neighbor in graph[node]:
        if neighbor not in visited:
            dfs(graph, neighbor, visited)

📄 مثال

def dfs_iterative(graph, start):
    visited = set()
    stack = [start]
    order = []
    while stack:
        node = stack.pop()
        if node in visited:
            continue
        visited.add(node)
        order.append(node)
        for neighbor in reversed(graph[node]):
            if neighbor not in visited:
                stack.append(neighbor)
    return order

graph = {"A": ["B", "C"], "B": ["D"], "C": ["D"], "D": []}
print(dfs_iterative(graph, "A"))  # ['A', 'B', 'D', 'C']

أهم النقاط

النقطةالوظيفة
التعقيد الزمنيO(V + E)
الهيكل المساعدمكدّس (Stack) — صراحة، أو ضمنيًا عبر مكدّس الاستدعاءات التعاودية
استخداماتها المميزةكشف الدورات، الترتيب الطوبولوجي، استكشاف كل المسارات (كالمتاهات)

💡 نصائح عملية

  • النسخة التعاودية أبسط بالكتابة، لكن النسخة التكرارية (بمكدّس صريح) أأمن مع رسوم بيانية كبيرة جدًا لتفادي تجاوز حد مكدّس الاستدعاءات (stack overflow)

⚠️ أخطاء شائعة

  • استخدام DFS لإيجاد أقصر مسار بعدد القفزات — لا تضمن ذلك أبدًا (بعكس BFS)، قد تجد أي مسار صالح وليس الأقصر

خصائص ذات صلة

🎓 تريد فهم الصورة الكاملة خطوة بخطوة؟ ابدأ من مسار DSA الكامل بالعربي.