Transcript Hashing
Hashing
Çırpı, kırpma, özetleme, adresleme
Hashing 2
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
Hashing 3
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
Hashing 4
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 5
Hashing
Genellikle, m << N.
h(Ki) = [0, …, m-1] bir tamsayıdır ve Ki nin hash değeri olarak isimlendirilir
Hashing 6
Ö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 7
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 8
Hashing
Problem:
İ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
collision (çarpışma - ihtilaf)
hesaplanması hızlı olan ve
çarpışmaların sayısını minimize edebilen.
Meydana geldikleri zaman çarpışmaları
çözebilecek bir metot geliştir.
Hashing 9
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.
örnek eğ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
örnek 2000 sayı tutacak bir hash tablosu, ve herbir hücrede ortalama olarak
3 eleman tutulacaksa
m=701
olarak seçilebilir.
Hashing 10
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.
Hashing 11
Hash Fonksiyonu...
a,…,z ve boşluk
Metot 2
272
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
KeySize1
i 0
Key[ KeySize i 1] * 37i
Anahtardaki bütün karakterleri içerir ve düzgün bir dağılım olması
beklenir.
Hashing 12
Ç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
Hashing 13
Ayrı Zincirleme
K
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.
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.
Hashing 14
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
Hashing 15
Açık adresleme:
İki soru vardır.
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.
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
Hashing 16
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
Hashing 17
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
( hash(K) + I ) mod m yı hesapla
T[L] boşsa, K yı ekle ve dur..
L =
Eğer K yı ekleyecek boş bir yer bulunamazsa, tablo dolu
demektir ve hata mesajı verilir.
Hashing 18
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]
Hashing 19
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.
Hashing 20
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]
Hashing 21
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
Hashing 22
Ç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
Hashing 23
Ç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]
Hashing 24
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.
Hashing 25
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)