الگوریتم دایکسترا (Dijkstra)
الگوریتم دایکسترا: کوتاهترین مسیر در گراف وزندار با صف اولویتدار (هیپ) — همان کاری که GPS میکند
مسئله: کوتاهترین مسیر وزندار
BFS کوتاهترین مسیر را فقط در گراف بدون وزن مییابد. اما در واقعیت، جادهها فاصله/زمان متفاوت دارند! اینجاست که دایکسترا میدرخشد: کوتاهترین مسیر در گراف وزندار با وزنهای نامنفی.
ایده اصلی — طمعکارِ هوشمند
همیشه رأسِ کمترین فاصلهٔ فعلی را پردازش کن؛ وقتی رأسی پردازش شد، فاصلهاش قطعی است (چون وزنها نامنفیاند، راه کوتاهتری از این وجود ندارد!).
الگوریتم
- فاصله شروع = ۰، بقیه = بینهایت
- رأس با کمترین فاصله را از صف اولویتدار بردار
- فاصله همسایهها را از طریق این رأس بهروزرسانی (Relax):
اگر dist[u] + وزن(u,v) < dist[v]→ بهروزرسانی - تکرار تا پردازش همه رأسها (یا رسیدن به هدف)
مثال گامبهگام
گراف وزندار (فاصله کیلومتر):
4
A -------- B
| / |
2| 3/ |5
| / |
C -- D --- E
1 7
دایکسترا از A:
dist = {A:0, B:∞, C:∞, D:∞, E:∞}
پردازش A: C=2, B=4
پردازش C: D=3 (2+1)
پردازش D: B=6? خیر 3+3=6 > 4 نه! E=10 (3+7)
پردازش B: E=9 (4+5) ✓ بهبود از 10!
پردازش E: تمام
نتیجه: A->B:4, A->C:2, A->D:3, A->E:9 (از B)
پیچیدگی
| پیادهسازی | پیچیدگی |
|---|---|
| آرایه ساده | O(V²) |
| هیپ دودویی + لیست همسایگی | O((V + E) log V) ✓ |
محدودیت مهم: وزن منفی ممنوع!
با یال منفی، فرض «پردازششده = قطعی» میشکند و دایکسترا جواب غلط میدهد. برای وزن منفی، الگوریتم Bellman-Ford لازم است (O(V·E)).
کاربردهای واقعی
- GPS و مسیریابی: بلیدر، نشان، گوگلمپ
- شبکه: مسیر بهینه بستهها (OSPF)
- بازیها: مسیر هوشمند شخصیتها
- لجستیک: کمهزینهترین مسیر تحویل
نکته: دایکسترا = BFS + صف اولویتدار بهجای صف ساده + عملیات Relax. این مقایسه، درک هر دو را عمیق میکند!
جمعبندی
- کوتاهترین مسیر وزندار با وزن نامنفی
- هسته: همیشه کمترین فاصله فعلی را پردازش کن (هیپ)
- O((V+E) log V) با هیپ
- وزن منفی؟ → Bellman-Ford
این مبحث بخشی از دوره آموزش کامل ساختار داده و الگوریتم است.