Bölüm 12: Kümeler ve Union-Find

Üyelik, birleşim ve ayrık bileşenler
Küme ADTÜyelikBirleşimKesişimAyrık kümelerYol sıkıştırma
C ile Veri Yapıları · İki ciltlik ders notları temel alınmıştır

Hazırlık

Başlamadan Önce

C ön bilgisi

Dizi, gösterge, struct, fonksiyon ve dinamik bellek temellerini hatırla.

İlk kavram

Küme ADT ve Üyelik

Bu bölümün hedefi

Tekrarsız üyelik ve temel küme işlemlerini tanımlamak.

Başlangıç sorusu

Kümenin listeden temel farkı nedir?

Giriş

Öğrenme Çıktıları

Küme sözleşmesini kurmak

Tekrarsız üyelik ve temel küme işlemlerini tanımlamak.

Gösterim seçmek

Bit kümesi, hash tablosu ve arama ağacı seçeneklerini karşılaştırmak.

Union-Find uygulamak

find ve union işlemleriyle ayrık bileşenleri yönetmek.

Optimizasyonu açıklamak

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.

contains(x)

x üye mi?

add(x)

x yoksa ekle.

union(A,B)

Her iki kümenin tüm üyeleri.

intersection(A,B)

Yalnız ortak üyeler.

Temel Kavramlar

Kavram Haritası

1Küme ADT
2Üyelik
3Birleşim
4Kesişim
5Ayrık kümeler
6Yol sıkıştırma
Bir öğe ya kümenin üyesidir ya değildir; aynı öğenin ikinci kez eklenmesi yapıyı değiştirmez.

Gösterim

Union-Find her bileşeni köklü ağaçla gösterir

öğe01122334455

union(0,1), union(1,2), union(3,4)

Aynı köke ulaşan öğeler aynı ayrık kümededir. 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;
Tür tanımı veri yapısının bellekteki biçimini; yordamlar ise bu yapı üzerindeki davranışı kurar.

C ile Gerçekleştirim

C'de Bellek ve Sahiplik

Sahip kim?

Ayrılan belleği hangi yapı veya yordamın bırakacağını baştan belirle.

Yaşam süresi

Yerel değişken adresini fonksiyon dışına taşırma; dinamik belleği gerektiği kadar yaşat.

Sınırlar

Boyut, kapasite ve geçerli indisleri her işlemde koru.

Boş durum

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);
}
Kod örnekleri C99/C11 uyumlu olacak biçimde küçük ve tek sorumluluklu tutulmuştur.

Temel İşlemler

Kodu Okurken

Ön koşul

Kümenin listeden temel farkı nedir?

Değişmez

Her adımda contains(x) kuralı korunuyor mu?

Son koşul

Bit kümesi, hash tablosu ve arama ağacı seçeneklerini karşılaştırmak.

Hata yolu

DSU'yu genel amaçlı öğe silme yapısı sanmak

Adım Adım

Ağırlıklı union ve yol sıkıştırma

Kökleri bul

ra = find(a), rb = find(b). Eşitse işlem biter.

Küçüğü bağla

Daha küçük ağacın kökü daha büyük ağacın köküne bağlanır.

Boyutu güncelle

Yeni kökün boyutu iki kümenin toplamıdır.

Yolu sıkıştı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

İşlemZamanEk bellek
Bit kümesinde üyelikO(1)O(U)
Hash kümesinde üyelik, ort.O(1)O(n)
Ağaç kümesinde üyelikO(log n)O(n)
DSU find/union amortizeO(α(n))O(n)
n öğeyi başlatmaO(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?

Bit kümesi

Anahtar evreni küçük ve tamsayı aralığı biliniyorsa.

Hash kümesi

Hızlı üyelik ve sırasız dolaşım yeterliyse.

Arama ağacı kümesi

Sıralı dolaşım ve aralık sorgusu gerekiyorsa.

Union-Find

Bileşenler yalnız birleşiyor ve sık sık aynı küme sorgusu yapılıyorsa.

Dikkat

Sık Yapılan Hatalar

1Kümede tekrarları ayrı öğe saymak
2DSU'yu genel amaçlı öğe silme yapısı sanmak
3union öncesi kökleri bulmadan doğrudan düğümleri bağlamak
4Boyut/rank bilgisini yanlış kökte güncellemek

Alıştırmalar

Kendini Sına

  1. Kümenin listeden temel farkı nedir?
  2. Bit kümesi ne zaman uygundur?
  3. find ne döndürür?
  4. Ağırlıklı birleşim neyi engeller?
  5. Yol sıkıştırma ne zaman uygulanır?
Cevapları göster
  1. Sıra önemli değildir ve tekrar yoktur.
  2. Evren küçük, yoğun ve indislenebilirse.
  3. Öğenin ait olduğu kümenin temsilci kökünü.
  4. Uzun ve çarpık ağaçların oluşmasını.
  5. find işlemi sırasında ziyaret edilen yolu doğrudan köke bağlarken.

Uygulama

Mini Laboratuvar

1 · Çiz

Kümenin listeden temel farkı nedir?

2 · Kodla

find ne döndürür?

3 · Ölç

Yol sıkıştırma ne zaman uygulanır?

Teslim: küçük bir C modülü, üç uç test ve zaman/bellek karmaşıklığı tablosu.

Özet

Bölüm Özeti

Üyelik merkezlidir

Sıra ve tekrar anlam taşımaz.

Gösterim probleme göre

Evren, sıra ihtiyacı ve işlem profili seçimi belirler.

DSU çok hızlıdır

Ağırlık ve yol sıkıştırmayla amortize maliyet neredeyse sabittir.

Özet

Kaynaklar ve Devam

Son

Bölüm 12: Kümeler ve Union-Find
Ders planına dön
1 / 1 C ile Veri Yapıları