پیمایش عمقی (DFS)

پیمایش عمق اول با پشته و بازگشت: رفتن تا عمق ممکن، تشخیص دور در گراف و مقایسه با BFS

DFS چیست؟

پیمایش عمق اول (Depth-First Search) تا جای ممکن در یک شاخه به عمق می‌رود؛ وقتی به بن‌بست رسید، برمی‌گردد (Backtrack) و شاخه بعدی را امتحان می‌کند — مثل کاوش ماز!

دو ابزار: پشته یا بازگشت

DFS با پشته (LIFO) یا به‌صورت بازگشتی (که خودش از پشته فراخوانی استفاده می‌کند) پیاده می‌شود:

  1. رأس فعلی را بازدید و علامت بزن
  2. به اولین همسایه دیده‌نشده برو (بازگشتی)
  3. وقتی همسایه دیده‌نشده نبود، برگرد

مثال گام‌به‌گام

گراف:  A - B - D
       |       |
       C - E - F

DFS از A:
A -> B -> D -> E -> C (برگشت) -> F

ترتیب: A, B, D, E, C, F  (عمق اول!)

مقایسه با BFS همان گراف: A, B, C, D, E, F — دو شخصیت متفاوت!

پیچیدگی

معیارپیچیدگی
زمان (لیست همسایگی)O(V + E)
حافظهO(V) — پشته/بازگشت

BFS یا DFS؟

مسئلهانتخاب
کوتاه‌ترین مسیر بدون وزنBFS ✓
وجود مسیرهر دو
تشخیص دورDFS ✓
ترتیب توپولوژیکDFS ✓
اجزای همبندهر دو
حل مازDFS ✓
نزدیک‌ترین همسایه‌هاBFS ✓

تشخیص دور با DFS

در گراف جهت‌دار: اگر در حین DFS به رأسی برسیم که در حال پردازش است (در پشته فعلی)، دور پیدا شد! این پایه تشخیص deadlock در سیستم‌عامل و وابستگی چرخه‌ای در build system هاست.

کاربردهای واقعی DFS

هشدار: DFS بازگشتی روی گراف بزرگ (ده‌ها هزار رأس) ممکن است پشته پایتون را سرریز کند (RecursionError)؛ در این حالت نسخه پشته‌ای (تکراری) استفاده کنید.

جمع‌بندی

این مبحث بخشی از دوره آموزش کامل ساختار داده و الگوریتم است.

ابزارهای مرتبط