COMPUTER ENGINEER

← BlogDATA STRUCTURES / ALGORITHMSPython örnek paketi ↓

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ır

DAG'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.

Python 3
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

  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.

Jeff Erickson · Algorithms ↗
İlerlemeden önce alıştırmayı çöz.