Graf temelleri ve yollar · 28 / 53
Dijkstra, 0–1 BFS ve A*
Anla → iz sür → uygula → gerekçelendir
3 dk okuma · uygulama için ayrıca zaman ayırDijkstra nonnegative kenarlarda en küçük geçici distance'ı kesinleştirir. Relaxation d[v]>d[u]+w ise iyileştirme yapar. Negatif kenar, kesinleşmiş düğümün daha sonra ucuzlamasına yol açabilir ve ispatı bozar. “Bütün cycle'+'’lar pozitif” varsayımı tek başına yeterli değildir.
Heap uygulamasında bir düğüme yeni distance yazınca yeni entry ekle; eski entry çekilince d!=dist[u] ise atla. İlk enqueue'da visited yapma; Dijkstra'da bir düğümün ilk görülen yolu en iyi olmayabilir. Hedefi erken durdurma ancak geçerli minimum entry extract edildiğinde uygundur.
0/1 ağırlıkta deque ile0–1 BFS O(V+E) çalışır. A* f=g+h kullanır; admissible heuristic hedef maliyetini aşmaz. Graph search'te consistency, kapatılmış düğümü yeniden açmadan optimalite için önemlidir; inconsistent heuristic uygun reopening ister. A*, Dijkstra'+'’nın h=0 özel durumunu geneller; gerçek navigasyon ürünleri çok daha fazla preprocessing ve trafik modeli kullanır.
Relaxation neden güvenilir?
s→a=4, s→b=1, b→a=2 olsun. Önce tentative a=4, b=1. Heap b'yi çıkarır ve a'yı 3'e indirir. Daha sonra a=3 finalize edilir. Heap'te kalan a=4 eski kayıttır; distance != best[node] kontrolüyle atlanır. Parent da başarılı relaxation'da güncellenir; distance tek başına path'i vermez.
Dijkstra'nın temel kanıtı nonnegative edge varsayımına bağlıdır. Minimum tentative node'u finalize ederken henüz seçilmemiş bir node üzerinden daha ucuz yol gelemez; çünkü o yolun prefix'i zaten en az bu tentative değere sahiptir ve kalan ağırlıklar negatif değildir. Negatif kenar bu çıkarımı bozar. Negatif edge var ama negative cycle yoksa Bellman-Ford veya uygun Johnson reweighting düşünülebilir.
A* priority f=g+h kullanır. Admissible heuristic kalan gerçek maliyeti aşmaz; consistent heuristic h(u)≤w(u,v)+h(v) koşulunu sağlar. Closed node'ları yeniden açmayan graph-search uygulamasında consistency önemli olabilir. h=0 Dijkstra'ya döner. Haritadaki düz çizgi mesafesi yalnız cost modeli uygunken lower bound'dur; zaman veya ücret metriğinde gelişigüzel kullanılamaz.
Temel: Yukarıdaki stale heap kaydını elle izle. Orta: Zero-weight ve unreachable testlerini ekle. İleri: Inconsistent ama admissible heuristic ile reopen ihtiyacını göster; expanded-node sayısını ve doğru distance'ı ayrı ölç.
Adım adım iz sürme
A→B10,A→C1,C→B2: önceB10 aday, C1 çıkar veB3 olur; eskiB10 entry stale olarak atlanır.
Maliyet ve varsayımlar
Binary heap ile O((V+E) log V) yaygın sınır; lazy duplicate heap'te alan O(V+E), log E etkisi vardır.
Çalıştırılabilir örnek
Python 3 ile çalıştır. Assert küçük bir örneği denetler; genel doğruluk ispatı değildir. Bazı ileri örnekler özellikle küçük model veya referans oracle'dır; tam üretim uygulaması değildir.
import heapq
def dijkstra(g, start):
if any(w < 0 for edges in g.values() for _,w in edges):
raise ValueError("negative edge")
dist = {u: float("inf") for u in g}; dist[start] = 0
q = [(0,start)]
while q:
d,u = heapq.heappop(q)
if d != dist[u]: continue
for v,w in g[u]:
if d+w < dist[v]:
dist[v] = d+w; heapq.heappush(q,(dist[v],v))
return dist
assert dijkstra({"A":[("B",10),("C",1)],"B":[],"C":[("B",2)]},"A")["B"] == 3KAVRADIĞINI KONTROL ET
Sıra sende
A* heuristic gerçek uzaklığın iki katıysa optimalite garantisi var mı?
Çözümün mantığını göster
Hayır. Overestimate iyi yolu gereğinden pahalı gösterir. Admissible/consistent koşullar ile reopening politikasını açıkça belirle.
Bir adım ileri
- Örneği değiştirmeden önce girdi sözleşmesini ve invariantı yaz.
- Uygun olan boş, sınır, tekrar ve adversarial girdileri ekle. Basit bir oracle ile karşılaştır.
- Belirtilen modelde maliyeti çıkar; farklı girdi büyüklüklerini ölç ve farkları gerekçelendir.
Temel kaynaklar ve ders notları
Bu eğitimde özgün anlatım kullanıldı; aşağıdaki kaynaklar ispatlar ve ileri okumalar sunar. Bağlantılar daha geniş ders modülünü kapsayabilir.
MIT 6.006 · Introduction to Algorithms ↗Princeton · Algorithms, Sedgewick & Wayne ↗