Dijkstra algoritması nasıl çalışır? Ağırlıklı grafikte en kısa yolu bulun.
Cevap
Dijkstra, negatif olmayan ağırlıklı bir grafikte bir kaynaktan tüm düğümlere en kısa mesafeyi bulur. Açgözlü (greedy) bir algoritmadır: her adımda kesinleşmemiş düğümler arasında mesafesi en küçük olanı seçer ve komşularını gevşetir (relax).
Adımlar
- Kaynağın mesafesi 0, diğerleri sonsuz.
- Min-heap'e
(0, kaynak)eklenir. - Heap'ten en küçük mesafeli düğüm çıkarılır; eski (güncel olmayan) kayıtsa atlanır.
- Her komşu için
dist[u] + w < dist[v]isedist[v]güncellenir ve heap'e eklenir. - Heap boşalana kadar devam edilir.
import heapq
def dijkstra(graph, src):
# graph: {düğüm: [(komşu, ağırlık), ...]}
dist = {node: float("inf") for node in graph}
dist[src] = 0
pq = [(0, src)]
while pq:
d, u = heapq.heappop(pq)
if d > dist[u]:
continue # eski kayıt
for v, w in graph[u]:
nd = d + w
if nd < dist[v]:
dist[v] = nd
heapq.heappush(pq, (nd, v))
return dist
g = {"A": [("B", 4), ("C", 1)], "C": [("B", 2), ("D", 5)],
"B": [("D", 1)], "D": []}
dijkstra(g, "A") # {'A': 0, 'B': 3, 'C': 1, 'D': 4}Yolun kendisi isteniyorsa her düğüm için prev[v] = u tutulur ve hedeften geriye gidilir.
Karmaşıklık
- Binary heap ile `O((V + E) log V)`, bellek
O(V + E).
Ne zaman başka algoritma?
| Durum | Algoritma |
|---|---|
| Ağırlıksız grafik | BFS, O(V + E) |
| Negatif ağırlık var | Bellman-Ford, O(V·E) |
| Tüm çiftler arası | Floyd-Warshall, O(V³) |
| Hedef belli, iyi bir sezgisel var | A* |
Negatif kenarda Dijkstra yanlış sonuç verir, çünkü kesinleşmiş bir düğüme sonradan daha kısa yol bulunabilir.
İlgili Algoritmalar & Veri Yapıları soruları
- Binary search'ün zaman karmaşıklığı nedir ve neden?
- Two Sum: toplamı hedefe eşit olan iki elemanın indekslerini bulun.
- Bir parantez dizisinin geçerli olup olmadığını kontrol edin: "({[]})"
- Tek yönlü bağlı listeyi ters çevirin.
- BFS ve DFS arasındaki fark nedir? Hangisini ne zaman kullanırsınız?
- get ve put işlemleri O(1) olan bir LRU Cache tasarlayın.
Bu konuda başka bir soru biliyor musun?
Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.