Bölüm 9: Hash Tabloları

Anahtardan adrese, çakışmadan çözüme
Hash fonksiyonuKovaÇakışmaZincirlemeAçık adreslemeYeniden boyutlama
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

Hash fonksiyonu ve Kova

Bu bölümün hedefi

Anahtarın dizi indisine dönüştürülmesini anlatmak.

Başlangıç sorusu

Çakışma neden tamamen önlenemez?

Giriş

Öğrenme Çıktıları

Hashlemeyi açıklamak

Anahtarın dizi indisine dönüştürülmesini anlatmak.

Çakışmayı çözmek

Zincirleme ve açık adresleme yöntemlerini karşılaştırmak.

Yük faktörünü izlemek

Tablonun doluluk oranının performansa etkisini yorumlamak.

C'de sahipliği yönetmek

Anahtar kopyalama, silme işareti ve yeniden boyutlama kararlarını güvenle uygulamak.

Temel Kavramlar

Hash tablosu olası konumu doğrudan tahmin eder

İyi bir hash fonksiyonu anahtarları kovalar arasında dengeli dağıtır; çakışma yine de kaçınılmazdır.

Hash fonksiyonu

Anahtarı sabit aralıklı tamsayıya dönüştürür.

Kova

Bir veya daha çok kaydın yerleştirildiği tablo hücresi.

Çakışma

Farklı anahtarların aynı kovaya düşmesi.

Yük faktörü

α = öğe sayısı / kova sayısı.

Temel Kavramlar

Kavram Haritası

1Hash fonksiyonu
2Kova
3Çakışma
4Zincirleme
5Açık adresleme
6Yeniden boyutlama
İyi bir hash fonksiyonu anahtarları kovalar arasında dengeli dağıtır; çakışma yine de kaçınılmazdır.

Gösterim

Anahtar → hash → kova

"ali""eda""can"
hash(key) % 7 →
0—1ali2—3eda → can4—
Zincirleme yönteminde aynı kovaya düşen kayıtlar küçük bir bağlı listede tutulabilir.

C ile Gerçekleştirim

Zincirlemeli tablo

typedef struct Kayit {
    char *anahtar;
    int deger;
    struct Kayit *sonraki;
} Kayit;

typedef struct {
    Kayit **kova;
    size_t kapasite, adet;
} HashTablo;
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 hash değerini doğrudan dizi indisi sanmak riskiyle birlikte test et.

Temel İşlemler

Dize anahtar için basit hash

size_t hash_dize(const char *s) {
    size_t h = 5381;
    unsigned char c;
    while ((c = (unsigned char)*s++) != 0)
        h = ((h << 5) + h) ^ c;
    return h;
}

size_t indis = hash_dize(anahtar) % tablo->kapasite;
Kod örnekleri C99/C11 uyumlu olacak biçimde küçük ve tek sorumluluklu tutulmuştur.

Temel İşlemler

Kodu Okurken

Ön koşul

Çakışma neden tamamen önlenemez?

Değişmez

Her adımda hash fonksiyonu kuralı korunuyor mu?

Son koşul

Zincirleme ve açık adresleme yöntemlerini karşılaştırmak.

Hata yolu

strcmp yerine gösterge adreslerini karşılaştırmak

Adım Adım

Çakışmalı ekleme

Hashle

ali ve veli aynı indis 3'e düşsün.

Kovayı tara

Anahtar zaten varsa değer güncellenir.

Yeni kayıt

Anahtar yoksa yeni düğüm kovadaki zincirin başına eklenir.

Yükü denetle

α eşik değeri aşarsa daha büyük tabloya yeniden hashleme yapılır.

Sınıf Notu

Dersten Sesler

“Depolamak ayrı konudur; o veri üzerinde çalışacak algoritmaların etkinliği ayrı konudur.”
“Çözümünüz işletilmeden anlaşılamıyorsa tasarımınız hatalıdır. Kodun fikri görünür olmalı.”

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
Arama, ortalamaO(1)O(1)
Ekleme, ortalamaO(1)O(1)
Silme, ortalamaO(1)O(1)
En kötü çakışmaO(n)O(1)
Yeniden boyutlamaO(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?

Zincirleme

Silme kolaylığı ve değişken kova uzunluğu isteniyorsa.

Açık adresleme

Bellek yerelliği önemli ve tablo kontrollü dolulukta tutulabiliyorsa.

Arama ağacı

Anahtarların sıralı dolaşımı da gerekiyorsa.

Doğrudan adresleme

Anahtar evreni küçük ve yoğunsa hash gerekmeyebilir.

Dikkat

Sık Yapılan Hatalar

1Hash değerini doğrudan dizi indisi sanmak
2strcmp yerine gösterge adreslerini karşılaştırmak
3Açık adreslemede silinen hücreyi boş gibi işaretlemek
4Yeniden boyutlamada eski indisleri kopyalamak; yeniden hashlememek

Alıştırmalar

Kendini Sına

  1. Çakışma neden tamamen önlenemez?
  2. Yük faktörü neyi ölçer?
  3. Zincirlemede bir kovada ne tutulur?
  4. Açık adreslemede silme işareti neden gerekir?
  5. Hash tablosu neden sıralı dolaşım sağlamaz?
Cevapları göster
  1. Anahtar uzayı genellikle kova sayısından çok büyüktür.
  2. Öğe sayısının kova sayısına oranını.
  3. Aynı indise düşen kayıtların zinciri.
  4. Arama zincirini erken kesmemek için.
  5. Hash fonksiyonu anahtar sırasını korumaz.

Uygulama

Mini Laboratuvar

1 · Çiz

Çakışma neden tamamen önlenemez?

2 · Kodla

Zincirlemede bir kovada ne tutulur?

3 · Ölç

Hash tablosu neden sıralı dolaşım sağlamaz?

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

Özet

Bölüm Özeti

Ortalama O(1)

İyi dağılım ve uygun yük faktörüyle.

Çakışma normaldir

Doğru çözüm stratejisi tasarımın parçasıdır.

Sahiplik önemlidir

Anahtarların kim tarafından ayrılıp bırakıldığı açık olmalıdır.

Özet

Kaynaklar ve Devam

Son

Bölüm 9: Hash Tabloları
Ders planına dön
1 / 1 C ile Veri Yapıları