COMPUTER ENGINEER

← BlogDATA STRUCTURES / ALGORITHMSPython örnek paketi ↓

Graf temelleri ve yollar · 26 / 53

BFS, DFS ve traversal invariant’ları

Anla → iz sür → uygula → gerekçelendir

2 dk okuma · uygulama için ayrıca zaman ayır

BFS queue ile katman katman ilerler. Ağırlıksız graf veya tüm kenarlar eşit maliyetliyse ilk keşif minimum edge sayısını verir. Visited işaretini dequeue'da değil enqueue'da koymak aynı düğümün tekrar tekrar kuyruğa girmesini önler. Parent map en kısa yolun kendisini geri kurar.

DFS stack/recursion ile bir dalı takip eder. Discovery/finish zamanları, recursion stack rengi, back edge ve topological order gibi yapıları ortaya çıkarır. Yönsüz graf cycle testinde parent edge'i geri kenar sanma; parallel edges için edge ID gerekebilir. Recursive DFS'nin derinliği V'ye ulaşabilir.

BFS ve DFS bütün grafı işlemek için her unvisited düğümden tekrar başlatılmalıdır. Komşu sırası traversal çıktısını değiştirir ama doğru BFS distance'ını değiştirmez. BFS minimum maliyet yolu ağırlıklı graf için genel olarak bulmaz; path length ile cost'u ayır.

Adım adım iz sürme

A→B,C; B→D; C→D. BFS A0, B1,C1,D2 verir. D ilk B'den enqueue edilir, C'den tekrar eklenmez.

Maliyet ve varsayımlar

Adjacency list ile O(V+E) zaman, O(V) ek alan. Matrix ile O(V²) tarama.

Ç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.

Python 3
from collections import deque

def bfs(g, start):
    distance, parent = {start: 0}, {start: None}
    q = deque([start])
    while q:
        u = q.popleft()
        for v in g[u]:
            if v not in distance:
                distance[v], parent[v] = distance[u]+1, u
                q.append(v)
    return distance, parent
assert bfs({"A":["B","C"],"B":["D"],"C":["D"],"D":[]},"A")[0]["D"] == 2

KAVRADIĞINI KONTROL ET

Sıra sende

Bir edge maliyeti100, iki edge maliyeti1+1 ise BFS hangi yolu seçer?

Çözümün mantığını göster

Tek edge'i seçebilir; edge sayısını azaltır ama maliyeti minimize etmez. Nonnegative weighted graph için Dijkstra uygundur.

Bir adım ileri

  1. Örneği değiştirmeden önce girdi sözleşmesini ve invariantı yaz.
  2. Uygun olan boş, sınır, tekrar ve adversarial girdileri ekle. Basit bir oracle ile karşılaştır.
  3. 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 ↗
İlerlemeden önce alıştırmayı çöz.