Bölüm 12: Kümeler ve Union-Find
Hazırlık
Başlamadan Önce
Dizi, gösterge, struct, fonksiyon ve dinamik bellek temellerini hatırla.
Küme ADT ve Üyelik
Tekrarsız üyelik ve temel küme işlemlerini tanımlamak.
Kümenin listeden temel farkı nedir?
Giriş
Öğrenme Çıktıları
Tekrarsız üyelik ve temel küme işlemlerini tanımlamak.
Bit kümesi, hash tablosu ve arama ağacı seçeneklerini karşılaştırmak.
find ve union işlemleriyle ayrık bileşenleri yönetmek.
Ağırlıklı birleşim ve yol sıkıştırmanın ağaç yüksekliğini nasıl azalttığını göstermek.
Temel Kavramlar
Kümede sıra değil üyelik önemlidir
Bir öğe ya kümenin üyesidir ya değildir; aynı öğenin ikinci kez eklenmesi yapıyı değiştirmez.
x üye mi?
x yoksa ekle.
Her iki kümenin tüm üyeleri.
Yalnız ortak üyeler.
Temel Kavramlar
Kavram Haritası
Gösterim
Union-Find her bileşeni köklü ağaçla gösterir
union(0,1), union(1,2), union(3,4)
find(x) kökü bulur.C ile Gerçekleştirim
Ayrık kümeler yapısı
typedef struct {
int *ebeveyn;
unsigned *boyut;
size_t n;
} DSU;C ile Gerçekleştirim
C'de Bellek ve Sahiplik
Ayrılan belleği hangi yapı veya yordamın bırakacağını baştan belirle.
Yerel değişken adresini fonksiyon dışına taşırma; dinamik belleği gerektiği kadar yaşat.
Boyut, kapasite ve geçerli indisleri her işlemde koru.
NULL, boş yapı ve tek öğe durumlarını özellikle kümede tekrarları ayrı öğe saymak riskiyle birlikte test et.
Temel İşlemler
Yol sıkıştırmalı find
int find(DSU *d, int x) {
if (d->ebeveyn[x] != x)
d->ebeveyn[x] = find(d, d->ebeveyn[x]);
return d->ebeveyn[x];
}
bool ayni_kume(DSU *d, int a, int b) {
return find(d, a) == find(d, b);
}Temel İşlemler
Kodu Okurken
Kümenin listeden temel farkı nedir?
Her adımda contains(x) kuralı korunuyor mu?
Bit kümesi, hash tablosu ve arama ağacı seçeneklerini karşılaştırmak.
DSU'yu genel amaçlı öğe silme yapısı sanmak
Adım Adım
Ağırlıklı union ve yol sıkıştırma
ra = find(a), rb = find(b). Eşitse işlem biter.
Daha küçük ağacın kökü daha büyük ağacın köküne bağlanır.
Yeni kökün boyutu iki kümenin toplamıdır.
Sonraki find çağrıları düğümleri doğrudan köke bağlayarak yolu kısaltır.
Sınıf Notu
Dersten Sesler
“Ağacı ne kadar dejenere eder, bozar? Doğru çalışması yetmez; en kötü veriyi de soracağız.”
“Algoritmanızı doğru, etkili ve yazılım mühendisliği kurallarına göre yazacaksınız. Ama bitmiyor!”
Notlardaki sınıf içi anlatımdan, yazım ve uzunluk bakımından sunuma uyarlanmıştır.
Analiz
Karmaşıklık Özeti
| İşlem | Zaman | Ek bellek |
|---|---|---|
| Bit kümesinde üyelik | O(1) | O(U) |
| Hash kümesinde üyelik, ort. | O(1) | O(n) |
| Ağaç kümesinde üyelik | O(log n) | O(n) |
| DSU find/union amortize | O(α(n)) | O(n) |
| n öğeyi başlatma | O(n) | O(n) |
n: öğe sayısı · h: yükseklik · V: düğüm sayısı · E: kenar sayısı
Tasarım Kararı
Hangi Durumda Hangisi?
Anahtar evreni küçük ve tamsayı aralığı biliniyorsa.
Hızlı üyelik ve sırasız dolaşım yeterliyse.
Sıralı dolaşım ve aralık sorgusu gerekiyorsa.
Bileşenler yalnız birleşiyor ve sık sık aynı küme sorgusu yapılıyorsa.
Dikkat
Sık Yapılan Hatalar
Alıştırmalar
Kendini Sına
- Kümenin listeden temel farkı nedir?
- Bit kümesi ne zaman uygundur?
- find ne döndürür?
- Ağırlıklı birleşim neyi engeller?
- Yol sıkıştırma ne zaman uygulanır?
Cevapları göster
- Sıra önemli değildir ve tekrar yoktur.
- Evren küçük, yoğun ve indislenebilirse.
- Öğenin ait olduğu kümenin temsilci kökünü.
- Uzun ve çarpık ağaçların oluşmasını.
- find işlemi sırasında ziyaret edilen yolu doğrudan köke bağlarken.
Uygulama
Mini Laboratuvar
Kümenin listeden temel farkı nedir?
find ne döndürür?
Yol sıkıştırma ne zaman uygulanır?
Özet
Bölüm Özeti
Sıra ve tekrar anlam taşımaz.
Evren, sıra ihtiyacı ve işlem profili seçimi belirler.
Ağırlık ve yol sıkıştırmayla amortize maliyet neredeyse sabittir.
Özet
Kaynaklar ve Devam
- Veri Yapıları ve Algoritmalar 2, PDF s. 33-36
- Horowitz, Sahni ve Anderson-Freed, Fundamentals of Data Structures in C.
- Kernighan ve Ritchie, The C Programming Language.
Son
← → veya boşluk ile gezinin · F: tam ekran · Home/End: ilk/son slayt