Graf temelleri ve yollar · 27 / 53
Topological sort, Tarjan ve Kosaraju
Anla → iz sür → uygula → gerekçelendir
2 dk okuma · uygulama için ayrıca zaman ayırDAG'de topological order her u→v kenarı için u'yu önce getirir. Kahn algoritması indegree0 düğümleri çıkarır; V'den az düğüm ürettiyse cycle vardır. Birden çok0-indegree düğümü olduğunda sıra benzersiz değildir. Bu, build bağımlılıkları ve ders önkoşulları için uygundur.
Strongly connected component yönlü graf içinde her düğümün diğerine ulaşabildiği maksimal kümedir. SCC'leri tek düğüm yapınca condensation graph DAG olur. Kosaraju önce finish order, ardından transpose graf üzerinde ters finish order traversal yapar. “Düğümleri rastgele sırada ikinci kez gez” doğru değildir.
Tarjan tek DFS'te index ve low-link değerlerini tutar; active stack üyeliği önemlidir. Daha önce bitmiş SCC'ye kenar low-link'i yanlış düşürmemelidir. low[u]==index[u] olunca stack'ten u'ya kadar bir SCC çıkar. Articulation/bridge low-link kuralları benzer görünür ama farklı problemdir; eşitsizliklerini kopyalama.
Adım adım iz sürme
A↔B, B→C, C↔D: SCC'+'’ler {A,B},{C,D}; condensation tek yönlü iki düğümdür. Her SCC'nin içinde cycle olabilir, DAG'+'’da olamaz.
Maliyet ve varsayımlar
Kahn, Tarjan, Kosaraju adjacency list ile O(V+E) zaman; stack/metadata O(V).
Ç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.
from collections import deque
def topo(g):
degree = {u: 0 for u in g}
for u in g:
for v in g[u]: degree[v] += 1
q, out = deque(u for u in g if degree[u] == 0), []
while q:
u = q.popleft(); out.append(u)
for v in g[u]:
degree[v] -= 1
if degree[v] == 0: q.append(v)
if len(out) != len(g): raise ValueError("cycle")
return out
assert topo({"A":["B"],"B":[]}) == ["A","B"]KAVRADIĞINI KONTROL ET
Sıra sende
SCC bulmak cycle olan grafı topolojik sıralar mı?
Çözümün mantığını göster
Orijinal düğümlerin topological order'+'’ı yoktur. SCC condensation DAG sıralanır; bileşen içindeki cycle ayrı çözülmelidir.
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.
Jeff Erickson · Algorithms ↗