Bölüm 9: Hash Tabloları
Hazırlık
Başlamadan Önce
Dizi, gösterge, struct, fonksiyon ve dinamik bellek temellerini hatırla.
Hash fonksiyonu ve Kova
Anahtarın dizi indisine dönüştürülmesini anlatmak.
Çakışma neden tamamen önlenemez?
Giriş
Öğrenme Çıktıları
Anahtarın dizi indisine dönüştürülmesini anlatmak.
Zincirleme ve açık adresleme yöntemlerini karşılaştırmak.
Tablonun doluluk oranının performansa etkisini yorumlamak.
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.
Anahtarı sabit aralıklı tamsayıya dönüştürür.
Bir veya daha çok kaydın yerleştirildiği tablo hücresi.
Farklı anahtarların aynı kovaya düşmesi.
α = öğe sayısı / kova sayısı.
Temel Kavramlar
Kavram Haritası
Gösterim
Anahtar → hash → kova
"ali""eda""can"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;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 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;Temel İşlemler
Kodu Okurken
Çakışma neden tamamen önlenemez?
Her adımda hash fonksiyonu kuralı korunuyor mu?
Zincirleme ve açık adresleme yöntemlerini karşılaştırmak.
strcmp yerine gösterge adreslerini karşılaştırmak
Adım Adım
Çakışmalı ekleme
ali ve veli aynı indis 3'e düşsün.
Anahtar zaten varsa değer güncellenir.
Anahtar yoksa yeni düğüm kovadaki zincirin başına eklenir.
α 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
| İşlem | Zaman | Ek bellek |
|---|---|---|
| Arama, ortalama | O(1) | O(1) |
| Ekleme, ortalama | O(1) | O(1) |
| Silme, ortalama | O(1) | O(1) |
| En kötü çakışma | O(n) | O(1) |
| Yeniden boyutlama | 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?
Silme kolaylığı ve değişken kova uzunluğu isteniyorsa.
Bellek yerelliği önemli ve tablo kontrollü dolulukta tutulabiliyorsa.
Anahtarların sıralı dolaşımı da gerekiyorsa.
Anahtar evreni küçük ve yoğunsa hash gerekmeyebilir.
Dikkat
Sık Yapılan Hatalar
Alıştırmalar
Kendini Sına
- Çakışma neden tamamen önlenemez?
- Yük faktörü neyi ölçer?
- Zincirlemede bir kovada ne tutulur?
- Açık adreslemede silme işareti neden gerekir?
- Hash tablosu neden sıralı dolaşım sağlamaz?
Cevapları göster
- Anahtar uzayı genellikle kova sayısından çok büyüktür.
- Öğe sayısının kova sayısına oranını.
- Aynı indise düşen kayıtların zinciri.
- Arama zincirini erken kesmemek için.
- Hash fonksiyonu anahtar sırasını korumaz.
Uygulama
Mini Laboratuvar
Çakışma neden tamamen önlenemez?
Zincirlemede bir kovada ne tutulur?
Hash tablosu neden sıralı dolaşım sağlamaz?
Özet
Bölüm Özeti
İyi dağılım ve uygun yük faktörüyle.
Doğru çözüm stratejisi tasarımın parçasıdır.
Anahtarların kim tarafından ayrılıp bırakıldığı açık olmalıdır.
Özet
Kaynaklar ve Devam
- Ders planındaki Hash Tabloları bölümü; C gerçekleştirim yaklaşımıyla tamamlayıcı sunum
- Horowitz, Sahni ve Anderson-Freed, Fundamentals of Data Structures in C.
- Kernighan ve Ritchie, The C Programming Language.