250 likes | 509 Views
Hashing Çırpı, kırpma, özetleme, adresleme. Hash tablosu. Aşağıdaki operasyonları destekler Bul Ekle Sil . ( Bazı uygulamalarda silme gereksiz olabilir. ) İkili arama ağacında, AVL ağacında ve B+-ağacından olduğu gibi aşağıdaki işlemler yapılamaz : Minimum ve Maksimum Halef ve selef
E N D
Hash tablosu • Aşağıdaki operasyonları destekler • Bul • Ekle • Sil. (Bazı uygulamalarda silme gereksiz olabilir.) • İkili arama ağacında, AVL ağacında ve B+-ağacından olduğu gibi aşağıdaki işlemler yapılamaz: • Minimum ve Maksimum • Halef ve selef • Belirli bir aralıktaki verinin listelenmesi • Verinin sıralanmış olarak listelenmesi
Realistik olmayan Çözüm • Her hücre (slot) anahtarlar arasından bir anahtara denk gelir. • T[k], k anahtarlı bir elemana karşılık gelir. • Eğer kümede k anahtarlı eleman olmazsa, T[k]=NULL
Realistik olmayan Çözüm • Ekle, sil ve bul işlemlerinin hepsi O(1)’dir (En kötü durum) • Problem: • Depolanacak olan elemanların sayısı göz önüne alındığında, eğer uzay çok büyük ise bu yapı çok fazla yer israf eder. • Örnek. Öğrenci numaraları 8-rakamlı olsun. Dolayısı ile uzay 108,olacak, ancak biz sadece 32000 öğrenciye sahibiz.
Hashing Genellikle, m << N. h(Ki) = [0, …, m-1] bir tamsayıdır ve Kinin hash değeri olarak isimlendirilir
Örnek Uygulamalar • Derleyiciler tanımlanan değişkenleri takip etmek için hash tabloları (symbol table) kullanır. • On-line kelime imlası kontrolü. Bütün sözlüğü hash ettikten sonra, herbir kelime sabit bir zamanda kontrol edilebilir ve hatalı yazılan kelimeler için öneriler verilebilir. • Giriş anahtarları sıralı bir şekilde gelen uygulamalarda kullanışlıdır. İkili arama ağacı için bu kötü bir durumdur. AVL ve B+ ağaçları için gerçekleştirilmesi zordur ve etkili değildir.
Hashing • Hashing ile, k anahtarının bir elemanı T[h(k)] içerisinde depolanmıştır. • h: hash fonksiyonu • U anahtar kümesini bir hash tablosunun hash table T[0,1,...,m-1] içerisindeki bölmelere eşleştirir. • k anahtarının bir elemanı bölme h(k)’ ya hash eder. • h(k) , k anahtarının hash değeridir
Hashing • Problem: collision (çarpışma - ihtilaf) • İki anahtar aynı bölmeyi hash edebilir • İki farklı anahtarın farklı hücreleri kullanmasını sağlayabilir miyiz? • Hayır, eğer |U|>m, m hash tablosunun boyutu • İyi bir hash fonksiyonu tasarla • hesaplanması hızlı olan ve • çarpışmaların sayısını minimize edebilen. • Meydana geldikleri zaman çarpışmaları çözebilecek bir metot geliştir.
Hash Fonksiyonu • Bölme metodu • h(k) = k mod m • örnek m=12, k=100, h(k)=4 sadece tekbir bölme işlemi gerektirir (oldukça hızlı) • m ‘ in bazı değerlerinden kaçınılabilinir. • örnekeğer m=2p, öyleyse h(k) k nın en düşük p bitine karşılık gelir, hash bağlı olmaz. • Benzer şekilde, eğer anahtarlar ondalıklı sayı ise m’i 10 un kuvveti şeklinde ayarlamamalıyız. • m değerini asal sayı olarak ayarlama en iyi yoldur. • m için iyi değerler: 2’nin katlarına çok yakın olmayan asal sayı seçimi • örnek2000 sayı tutacak bir hash tablosu, ve herbir hücrede ortalama olarak 3 eleman tutulacaksa • m=701 olarak seçilebilir.
Hash Fonsiyonu... • Anahtarlar string olabilirmi? • Hash fonksiyonlarının çoğu anahtarların doğal sayılar olduğunu varsayar. • Eğer anahtarlar doğal sayı değilse, bu değerlerin doğal sayı olarak değerlendirilmesi için bir yol bulunmalıdır. • Metot 1 • Stringteki karakterlerin ASCII değerlerini topla. • Problemler: • Aynı karakterlerin farklı permutasyonları aynı hash değerlerine sahip olacaktır. • Eğer tablo boyutu büyükse, anahtarlar düzgün dağılmayacaktır.
Hash Fonksiyonu... • Metot 2 • Eğer ilk 3 karakter random ise ve tablo boyutu 10,0007 ise => güzel bir dağılım vardır demektir. • Problem • İngilizce / Türkçe random değildir. • Sadece tablonun %28’i gerçekten hash edilebilir. (tablo boyutunun 10,007 olduğu varsayımı var) • Metot 3 • Hesapla • Anahtardaki bütün karakterleri içerir ve düzgün bir dağılım olması beklenir. a,…,z ve boşluk 272
Çarpışma İdaresi: (1) Ayrı Zincirleme • Hash tabloları yerine, bağlantılı liste tablosu kullanılır.- • Aynı değere hash eden anahtarları bağlantılı liste ile tut. h(K) = K mod 10
Ayrı Zincirleme • K anahtarını ekleme • Hangi listeyi gezmeyi belirlemek için h(K) yi hesapla • Eğer T[h(K)] null pointer içeriyorsa, sadece K değerini içerecek olan bağlantılı listeye bu girişi ilklendir • Eğer T[h(K)] dolu bir liste ise, bu listenin en başına K yı ekleriz. • K anahtarını silmek için • h(K) hesapla , T[h(K)] daki liste için de K anahtarını ara. Eğer bulunduysa K anahtarını sil.
Ayrı Zincirleme • n anahtar depolayacağımızı varsayalım.Öyleyse m i bir sonraki en büyük asal sayı yapmalıyız. Eğer hash fonksiyonu, herbir bağlantılı listedeki anahtar sayısı küçük bir sabit olacaktır. • Böylece, Herbir arama, ekleme, ve silme işleminin sabit zamanda yapılacağını bekleriz. • Dezavantajı: Bağlantılı listedeki hafıza yer ayırma işlemi programı yavaşlatacaktır. • Avantaj: silme kolaydır.
Çarpışma İdaresi:(2) Açık Adresleme • Açık adresleme: • Eğer eklenecek K anahtarı varolan bir anahtar ile çarpışırsa K anahtarının yerini tekrar hesapla. Yani, K anahtarını T[h(K)]’ dan farklı bir yerde tutarız. • İki soru vardır. • Tekrar yer bulma işlemi nasıl olacak? • K değerini daha sonra nasıl arayacağız? • Açık adreslemedeki çarpışmaları çözmek için üç bilinen yöntem vardır. • Doğrusal araştırma - Linear probing • Karesel araştırma - Quadratic probing • Çift hashing - Double hashing
Açık Adresleme • K anahtarını eklemek için, h0(K) hesapla. Eğer T[h0(K)] boşsa, oraya ekle. Eğer çarpışma olursa, alternatif hücre h1(K), h2(K), .... Ara, ta ki boş bir hücre bulunana kadar.. • hi(K) = (hash(K) + f(i)) mod m, f(0) = 0 ile • f: çarpışma çözüm stratejisi
Doğrusal Araştırma • f(i) =i • Hücreler ard arda araştırılır. (with wraparound) • hi(K) = (hash(K) + i) mod m • Ekleme: • K eklenecek yeni bir anahtar olsun. hash(K) yı hesapla • For i = 0 to m-1 • L = ( hash(K) + I ) mod m yı hesapla • T[L] boşsa, K yı ekle ve dur.. • Eğer K yı ekleyecek boş bir yer bulunamazsa, tablo dolu demektir ve hata mesajı verilir.
Doğrusal Araştırm • hi(K) = (hash(K) + i) mod m • Örnek 89, 18, 49, 58, 69 anahtarlarını ekle, hash(K)=K mod 10 kullanarak Ekle 58, araştır T[8], T[9], T[0], T[1] Ekle 69, araştır T[9], T[0], T[1], T[2]
Primary Clustering • We call a block of contiguously occupied table entries a cluster • On the average, when we insert a new key K, we may hit the middle of a cluster. Therefore, the time to insert K would be proportional to half the size of a cluster. That is, the larger the cluster, the slower the performance. • Linear probing has the following disadvantages: • Once h(K) falls into a cluster, this cluster will definitely grow in size by one. Thus, this may worsen the performance of insertion in the future. • If two cluster are only separated by one entry, then inserting one key into a cluster can merge the two clusters together. Thus, the cluster size can increase drastically by a single insertion. This means that the performance of insertion can deteriorate drastically after a single insertion. • Large clusters are easy targets for collisions.
Karesel Araştırma • f(i) = i2 • hi(K) = ( hash(K) + i2 ) mod m • Örnek., 89, 18, 49, 58, 69 ekle, hash(K) = K mod 10 kullanarak ekle 58, araştır T[8], T[9], T[(8+4) mod 10] ekle 69, araştır T[9], T[(9+1) mod 10], T[(9+4) mod 10]
Karesel Araştırma • Farklı başlangıç noktaları olan iki anahtar farklı araştırma sıralarına sahip olacaktır. • örnek m=101, h(k1)=30, h(k2)=29 • K1 için araştırma sırası: 30,30+1, 30+4, 30+9 • K2 için araştırma sırası : 29, 29+1, 29+4, 29+9 • Eğer tablo boyutu asal ise, her zaman yeni bir anahtar eklenebilir, ancak ve ancak en az tablonun yarısı boş ise. • Secondary clustering • Keys that hash to the same home position will probe the same alternative cells • Simulation results suggest that it generally causes less than an extra half probe per search • To avoid secondary clustering, the probe sequence need to be a function of the original key value, not the home position
Çift Hashing • Kümeleme problemlerinden kaçmak için, bir anahtarın araştırma sırası ilk pozisyonundan bağımsız olmalıdır. => iki hash fonksiyonu kullan: hash() ve hash2() • f(i) = i * hash2(K) • Örnek hash2(K) = R - (K mod R), R bir asal sayıdır ve m den küçüktür
Çift Hashing • hi(K) = ( hash(K) + f(i) ) mod m; hash(K) = K mod m • f(i) = i * hash2(K); hash2(K) = R + (K mod R), • Örnke: m=10, R = 7 ve 89, 18, 49, 58, 69 anahtarlarını ekle 49 eklemek için , hash2(49)=7, ikinci araştırma T[(9+7) mod 10] 58 eklemek için, hash2(58)=5, 2. araştırma T[(8+5) mod 10] 69 eklemek için, hash2(69)=1, 2. araştırma T[(9+1) mod 10]
hash2() fonksiyonunun seçimi • Hash2() must never evaluate to zero • K anahtarı için, bağıl olarak tablo boyutu m ‘ e asal olmalıdır. Yoksa, aynı tablo girişleri üretilebilecektir. • Örnek, eğer hash(K) = 0 ve hash2(K) = m/2, sadece T[0], T[m/2], girişleri bulunacaktır başkası değil! • m asal yapmanın ve R değerini m’den küçük bir asal seçmenin bir yolu hash2(K) = R + (K mod R) • Karesel araştırma, fakat, ikinci hash fonksiyonunun kullanılmasına ihtiyaç duymaz. • Praktikte daha hızlı ve basittir.
Açık Adreslemede Silme • Gerçek silme açık adresleme hash tablolarında gerçekleştirilemez. • Yoksa bu işlem araştırma sırasının bozulmasına yol açabilir. • Çözüm: Herbir bölmeye silinen elemanı göstermek için bir bayrak koy DELETED (tombstone)