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

KeySize1
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)