COMPUTER ENGINEER

← BlogDATA STRUCTURES / ALGORITHMSPython örnek paketi ↓

Bağlantı, akış ve rotalar · 30 / 53

Prim, Kruskal ve disjoint set union

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

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

Spanning tree bütün düğümleri bağlayan, cycle içermeyen V−1 kenarlı yapıdır. MST toplam kenar maliyetini minimize eder; bir root'tan her düğüme en kısa yolu garanti etmez. Bağlantısız graf için minimum spanning forest vardır. Negatif kenarlar MST'yi bozmaz.

Cut property, bir kesiti geçen en ucuz kenarın uygun bir MST'ye güvenle eklenebileceğini söyler. Prim mevcut ağaca en ucuz kesit kenarını ekler. Kruskal bütün kenarları ağırlıkla sıralar ve farklı bileşenleri bağlayanları seçer. Eşit ağırlıklarda birden fazla MST olabilir.

DSU find ile temsilci, union ile bileşen birleştirme sunar. Path compression ve union by rank/size beraber uzun işlem dizilerinde amortize O(α(n)) verir; tam O(1) demek teknik olarak doğru değildir. DSU arbitrary silmeyi aynı kolaylıkla desteklemez. Rollback DSU gibi varyantlar compression politikasını farklı kurar.

Adım adım iz sürme

AB1,BC2,AC5: Kruskal AB,BC seçer; AC cycle yapar. Toplam3. A'danC'ye ağaç yolu3 olur; bu örnekte shortest ile eşleşse de genel garanti değildir.

Maliyet ve varsayımlar

Kruskal O(E log E) sıralama; DSU O(E α(V)). Binary-heap Prim O(E log 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
class DSU:
    def __init__(self, n): self.p=list(range(n)); self.size=[1]*n
    def find(self, x):
        while self.p[x] != x:
            self.p[x] = self.p[self.p[x]]; x = self.p[x]
        return x
    def union(self, a, b):
        a,b = self.find(a), self.find(b)
        if a == b: return False
        if self.size[a] < self.size[b]: a,b=b,a
        self.p[b]=a; self.size[a]+=self.size[b]
        return True
d=DSU(3)
assert d.union(0,1) and d.union(1,2) and not d.union(0,2)

KAVRADIĞINI KONTROL ET

Sıra sende

Bir edge'i DSU'dan çıkarmak neden zor?

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

Union bileşen bağlantısını özetler, alternatif yolları saklamaz. Edge silinince gerçekten bölündü mü bilgisi ayrı dynamic connectivity yapısı gerektirir.

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.

Princeton · Algorithms, Sedgewick & Wayne ↗Jeff Erickson · Algorithms ↗
İlerlemeden önce alıştırmayı çöz.