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ırSpanning 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.
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
- Ö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.
Princeton · Algorithms, Sedgewick & Wayne ↗Jeff Erickson · Algorithms ↗