Hashing (Çırpılama)
Pek çok uygulama sözlük tarzı EKLEME, ÇIKARMA ve ARAMA gibi işlemleri gerçekleştirecek veri yapılarına ihtiyaç duyarlar. Örneğin bir derleyici, program içerisindeki tanımlayıcıları (identifier) bir tabloda tutarak yönetir. Veri tabanı uygulamaları
Hash tablosu, veriye bir anahtar (key) yardımı ile erişilen basit bir dizi çalışmasıdır.
Anahtar bir index üretmek için kullanılır ve bu indeks ile dizideki veriye ulaşılır
Anahtar tekildir yani bir başka kayıtta aynı anahtar olamaz. Ancak veri aynı olabilir.
TC Kimlik numaralarımız bunun için iyi bir örnektir. Herkesin sadece kendine ait bir kimlik numarası vardır. Ancak aynı isme sahip yüzlerce kişi olması mümkündür. Burada TC Kimlik numarası anahtardır; kişi bilgileri ise, bu anahtara ait veridir.
Bir hash fonksiyonu basit hesaplanabilmeli ve birbirinden farklı anahtar değerlerini farklı indislere yerleştirmelidir.
Uygulamada mümkün olduğunca her farklı anahtarı farklı indise yerleştirecek ideal bir hash fonksiyonu bulunmaya çalışılır.
İbrahim 1 Müberra 2 Ali 3 Melda 4 Hasan 5 6 Elif 7 8 Mustafa 9 10 11 Zeynep
hash(x)= X mod(TabloMaxElemanSayısı) Elemanların tamsayı olması halinde hash fonksiyonunu elde etmek kolaydır. Elemanları sayı olan bir tablo için hash fonksiyonu aşağıdaki gibi tanımlanabilir: hash(x)= X mod(TabloMaxElemanSayısı) Tablo boyutu
{85, 73, 20, 45, 11, 69 } elemanları için hash tablosu Hash(x)=xMod(11) 11 1 45 2 3 69 4 5 6 7 73 8 85 9 20 10 {85, 73, 20, 45, 11, 69 } elemanları için hash tablosu
Hash fonksiyonunun iki anahtarı aynı hücreye yerleştirmesi durumuna çakışma (collision) denir. Çakışmalar hash uygulamalarında istenmeyen bir durumdur ve giderilmelidir. Bunun için: Açık Çırpılama(Ayrık Zincirleme) Açık Adresleme (Kapalı Çırpılama) olmak üzere iki yöntem kullanılmaktadır.
Hashing yöntemleri Açık Çırpılama (Ayrık Zincirleme) Kapalı Çırpılama (Açık Adresleme)
Açık Çırpılama (Ayrık Zincirleme) Bu yöntemde aynı değere hash edilen elemanların bir listesi tutulur. Temel olarak tablodaki her bir bölümü liste olarak tanıtarak bağlı liste kullanılmaktadır. Bir veri eklenmek istendiğinde, hash fonksiyonu bu veri için daha önceki bir verinin indeksini üretiyorsa, yani çatışma oluyorsa tablodaki her indeksin bir listenin başı olduğunu varsayarak aynı özellikteki elemanlar aynı listeye eklenir. Her eleman listenin başına eklenirse ekleme maliyeti sabit zaman maliyetine indirgenir.
Yöntemin çalışması incelendiğinde bir eleman aranmak istendiğinde önce index bulunacaktır. İndex bulunduktan sonra bu andan itibaren bir bağlı liste ile ilgiliyiz ve arayacağımız elemanı bağlı listenin arama fonksiyonu ile bulmamız söz konusudur. Bu ise lineer bir arama olacaktır. Böylece genel arama zaman maliyetimiz bu noktadan itibaren sabit zaman maliyetinden uzaklaşmaya başlayacaktır.
En kötü durumda bütün elemanların index değeri aynı ise elemanların hepsi aynı noktada birikecek ve n elemanlı bağlı bir listede arama yapıyormuş gibi olunacak ve zaman maliyetimiz O(n) olacaktır.Ayrıca bağlı liste kullanımından dolayı göstergeçlerle (pointerlerle) çalışmadan dolayı programın implementasyonuda zorlaşmaktadır. Çünkü malloc() ve free() işlemleri sabit zaman maliyetli olarak kabul edilse de gerçekte çalışma zamanını olumsuz olarak etkilemektedir. Genel olarak bir arama işlemi gerçekleştirmenin maliyeti, çırpı fonksiyonun hesaplanması için gereken sabit zaman ve listede ilerlemek için gereken sürelerin toplamıdır.
Böyle bir durumun ortaya çıkmaması için yani hash tablosunda kötü bir dağılım oluşmaması için tablo Eleman sayısı değerinin iyi seçilmesi gerekir. Eşit dağılım (uniform hash) için, tablo boyutu olarak asal sayı tercih edilmelidir. Böylece tablo boyuna bağlı yığılmaların önüne geçilmiş olunur. Bu değerin asal sayı seçilmesi durumunda daha az çakışma oluşacaktır.
Kapalı Çırpılama (Açık Adresleme) Kapalı Hashing (Çırpılama) yönteminde bir çakışma oluştuğu zaman, boş bir hücre bulunana kadar başka hücreler denenir. Hash tablosunun her satırında bir eleman vardır yada bu satır boştur. Bir eleman aranacağı zaman belirlenen bir fonksiyonla sınamalar yapılır ve boş bir satıra rastlandığında çıkılır. Böyle bir elemanın olmadığına karar verilir.
Ayrık çırpılamadan farklı olarak elemanlar yerleştirilirken bir listeye zincir biçiminde değil de , fonksiyona göre boş bir yeri bulunca buraya yerleştirilir. Böylece ayrık çırpılamada oluşan dezavantajların da önüne geçilmiş olunur. Çünkü burada liste veri yapısı gibi yeni yapı oluşturulmamaktadır.
( hi(x)= (hash(x)+F(i)) mod(tabloMaxElemanSayısı) h0(),h1(x),h2(x) F fonksiyonu çakışma çözme yöntemidir ve başlangıç durumunda F(0)= 0 dır.
Doğrusal Sınama Yöntemi Hash fonksiyonu ile tabloya bir değer eklenirken çakışma oluşuyorsa eleman tabloda birer hücre aşağı inerek bulunan ilk boş hücreye yerleştirilir.
Doğrusal sınama 44 86 57 45 54 31 57 72 45 35 44 86 h(x) = x mod 13 31 54 35 57 72 45 44 86 44 86 57 45 54 31 57 72 45 35 44 86 h(x) = x mod 13
Teşekkürler