You are on page 1of 35

Arama Algoritmaları,

Hashing Tekniği ve Uygulaması


Kaynak
• Algoritma Geliştirme ve Veri Yapıları, Toros Rifat ÇÖLKESEN,
Papatya Yayıncılık, 3. Basım
• http://www.pcpolytechnic.com/it/ppt/data-
structure/CH6_Hashing-1.ppt
• Uygulama Yazılımı: Dev-C++
(https://sourceforge.net/projects/orwelldevcpp/)
Arama
• Arama algoritmaları bir veri kümesi içerisinde herhangi bir verinin varlığını
arama veya verinin bir parçası ile kalan diğer bütününü arayıp bulmak için
kullanılır. Bir dizi üzerinde bir elemanı arama ya da bir graf üzerinde en kısa
yolu bulma gibi işlemlerde arama algoritmaları kullanılır.
• Arama işleminin yapılış şekli, bilgiye ait verilerin düzenlenmesi ve bellekte
tutulması şekline göre farklılık gösterir.
• En basit arama tekniği veri kümesindeki bilgilere baştan başlayarak tek tek
bakma esasına dayanır. Buna ardışıl arama (sequantial search) denir. Bu
yöntemde arama algoritmasının yazılması basit ancak arama hızı düşüktür.
• Arama hızını arttıracak bir yöntem ikili arama olarak isimlendirilen arama
algoritmasıdır. Diğer ve en hızlı arama algoritması ise hash (çırpı)
fonksiyonu olarak tanımlanan aramadır.

1. Ardışıl Arama
2. İkili Arama
3. Hash (Çırpı) Fonksiyonu ile Arama
Ardışıl Arama
• Ardışıl arama en basit arama algoritmasıdır. İlk elemandan
başlanarak aranan eleman bulununcaya ya da veri kümesinin
sonuna erişinceye kadar aramaya devam edilen algoritmadır.
• Ardışıl aramanın en kötü durumdaki algoritman karmaşıklığı
𝑂(𝑛) dir.
aranan

Bu mu?
Bu mu? Evet

v1 v2 v3 v4 v5
Ardışıl Arama (Örnek Kod)
#include <iostream>
using namespace std;
ardisilArama(int A[], int N, int aranan){
for(int k=0;k<N;k++){
if(A[k]==aranan) return k;}
return -1;}
int main(){
int B[]={13,12,4,5,9,24,36,2,0,-9}, ara, indis;
cout<<"Aranan Sayiyi Giriniz : "; scanf("%d",&ara);
indis=ardisilArama(B,10,ara);cout<<endl;
if(indis==-1)
cout<<"Aranan Bulunamadi :(";
else
printf("Aranan Sayi %d indisli elemandir",indis);
}
İkili Arama Algoritması
• İkili arama halihazırda sıralı olan veriler üzerinde çalışan bir algoritmadır,
yani bu algoritmanın kullanılması için üzerinde arama yapılacak veri
önceden sıralanmış olmalıdır. Bu açıdan bakıldığında bir telefon rehberi
veya sözlükte aramaya benzer.
• İkili aramanın algoritma karmaşıklığı 𝑂 log 𝑁 dir. Kayıt sayısı çok fazla
olan veriler için uygundur. Örneğin 1000000 tane veri içeren bir kümede
arama işlemi log 2 1000000 ≅ 20 olduğundan arama işlemi yaklaşık 20
işlem sonucunda tamamlanacaktır. Aynı işlem ardışıl sıralama ile
yapılsaydı, en kötü durumda 1000000 işlem gerekirdi.
• Aşağıdaki örnekte 45 aranandır. Dizi ikiye bölünür ve ortadaki eleman ile
aranan karşılaştırılır. Eğer bulunursa değer geri gönderilir. Değilse sağ ve
sol indisler aranandan küçük veya büyük olmasına göre hareket ettirilir
ve tekrar ortadaki elemana bakılır. Döngü bu şekilde devam eder.

Resim Kaynak: Data Structures and Algorithm


Analysis, Clifford A. Shaffer
İkili Arama (Örnek Kod)
#include <iostream>
using namespace std;
int ikiliArama(int A[], int N, int aranan){
int ortadaki, sol=0, sag=N-1;
while(sol<=sag){
ortadaki=(sol+sag)/2;
if(aranan==A[ortadaki]) return ortadaki;
else if (aranan>A[ortadaki]) sol = ortadaki+1;
else sag = ortadaki-1;}
return -1;}
int main(){// İkili arama için dizi sıralı olmalıdır.
int B[]={-9,0,2,4,5,9,12,13,24,36},ara;int indis;
cout<<"Aranan Sayiyi Giriniz : ";scanf("%d",&ara);
indis=ikiliArama(B,10,ara);cout<<endl;
if(indis==-1)
cout<<"Aranan Bulunamadi :(";
else
printf("Aranan Sayi %d indisli elemandir",indis);}
Hash (Çırpı) Fonksiyonu
• Hash fonksiyonu arama işlemini bir çırpıda yakmak ve aranana
doğrudan ulaşmak için kullanılan bir yöntemdir.
• Hash fonksiyonuna kümedeki herbir veri için bir anahtar girilir ve bu
anahtara karşılık bir sayı elde edilir. Bu sayı indis gibi kullanılarak
aranan veriye erişilir.
• Hash fonksiyonuyla aranan anahtar elemana doğrudan
erişilebilmektedir.
• Hash fonksiyonu, bir anahtar bilgisinin tabloda bulunduğu indisi
hesaplamaktadır
• Hashing işleminde idealde zaman karmaşıklığı 𝑂(1) dir. Ancak her
zaman ideal bir Hash fonksiyonu bulmak mümkün değildir. Dolayısıyla
bazı durumlarda idealden sapmalar olmaktadır.
• Bütünüyle bir hashing uygulaması hash fonksiyonu, hash tablosu ve
çarpışmaların önlenmesi uygulaması olarak üç kısımdan oluşur.
• Çatışmaların çözülmesi, hash fonksiyonunun iki farklı veri için aynı
sayıyı üretmesi durumunda uygulanan stratejidir.
Hash Tabloları
• Hash tablosu oluşturmaya hashing denir.
• Hash tabloları, arama ekleme ve silme işlemleri için
kullanılabilirler.
• Ancak elemanların sıralanmasını gerektiren durumlar(en
büyük veya en küçük bulma gibi) için uygun değillerdir.
• İdeal bir hash tablosu basit bir dizi şeklinde düşünülebilir.
• Veri kümesinde yer alan bir veri hash fonksiyonunda
kullanılmak üzere adına anahtar denilen bir bilgi içermek
zorundadır. Anahtar o veri için hash fonksiyonundan indis
hesaplanması için kullanılacaktır.
• Anahtar, integer bir sayı veya string olabilir örneğin bir
öğrenci listesi için öğrenci numarası anahtar olabilir.
• Dizi Boyutu Tablo Boyutudur ve hash tablosunda
saklanacak bir veri 0 ile TabloBoyutu-1 arasında indislenir.
Örnek
Hash Tablosu

0
1 Metin 111
Dizi Elemanları
2 Hasan 122
Metin 111
3
Hasan 122 anahtar Hash
4 Ali 133
Fonksiyonu
Ali 133 5
Mehmet 144 6 Mehmet 144
Recep 155 7
8 Recep 155
Anahtar bilgisi
9
Hash Fonksiyonu
• Hash Fonksiyonu ;
• Hesaplama açısından basit olmalıdır.
• Anahtar bilgisi için indis üretir
• Muhtemel Problemler:
• Anahtar bilgisi numerik olmayabilir.
• Farklı anahtarlar aynı indisi üretebilir (çarpışma).
• Eğer çok fazla çarpışma olursa hash fonksiyonunun
performansı dramatik olarak düşer.
• Eğer anahtar verisi integer ise en basit hash fonksiyonu
Anahtar mod TabloBoyutu şeklinde olabilir.
• Eğer anahtar string bir veri ise bu durumda daha dikkatli olmak
gerekir. Örneğin string önce bir sayısal değere dönüştürülüp
ardından hash fonksiyonuna gönderilebilir.
Hash Fonksiyonu (Örnek)
Örneğin Hash Fonksiyonu H(x) = x % 21 ise aşağıda
verilen x değerleri için H(x) değerleri ne olur ?
x = 22 214 45 1253 5 28
H(x) = 1 4 3 14 5 7

Anahtarların diziye yerleşimi aşağıdaki gibi olur:


0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20

22 45 214 5 28 1253

Diziye 49 bilgisi geldiğinde bu durumda hash fonksiyonu 49 için de 7


verisini üretecektir. Bu durum çarpışma (collision) olarak isimlendirilir ve
çarpışmalar çözülmelidir !
Çarpışmalar ve Çözümleri
• Bir çarpışma iki farklı anahtarın aynı hash değerine sahip
olduğu durumda ortaya çıkar.
• Tekbir veri hücresinde iki farklı veriyi saklayamayız.
Dolayısıyla çarpışmayı çözmeliyiz.
• Çarpışmayı çözmek için iki farklı yaklaşım kullanılabilir.
• Ayrık Zincirleme(Separate Chaining) : Çarpışan veriler bir
bağlı liste yardımı ile birbirlerine bağlanırlar.
• Açık Adresleme: Dizideki boş hücreler aranır ve veri
bulunan ilk boş hücreye yerleştirilir.
Ayrık Zincirleme
H(a) = H(d)
• Çarpışma olduğunda, çaprışma olunan hücreye
yeni gelen eleman bir bağlı liste yardımı ile H(e) = H(b)
mevcut elemana bağlanır. 0
• Dizi elemanları listelerin ilk düğümlerini
gösteren işaretçilerdir.
• Yeni gelen eleman listenin başına/sonuna 1 a d
eklenir.
• Avantajları
• Basit çakışma çözümü (bağlı liste üzerinde
2
arama)
• Hash tablosunun maksimum eleman 3 e b
sayısından daha fazla eleman eklenebilir.
• Silme işlemi listeden silme ile aynıdır.
• Dezavantajları 4
• Tablonun bazı kısımları hiç
kullanılmamaktadır. 5 c
• Eğer bağlı liste boyutları büyürse
performans düşer.
• Dizi haricinde ekstra veri yapısı olan bağlı 6
liste kullanılır.
Örnek
Anahtarlar: 0, 1, 5, 12, 16, 49, 6, 9, 52, 71
hash(anahtar) = anahtar % 10.
0 0

1 71 1
2 52 12
3

5 5
6 6 16
7

9 49 9
Ayrık Zincirleme Üzerinde İşlemler
• Başlangıç: Tüm dizi eşemanları bir bağlı liste için işaretçi olarak
tanımlanır ve başlangıçta NULL değeri atanır.
• Arama:
– İlk önce hash fonksiyonu ile ilgili dizi hücresi bulunur.
– Ardından o hücredeki işaretçinin gösterdiği listede arama yapılır.
• Ekleme:
– İlk önce hash fonksiyonu ile ilgili dizi hücresi bulunur.
– Ardından o hücredeki işaretçinin gösterdiği listenin başına yeni
elemanı ekle.
• Silme:
– İlk önce hash fonksiyonu ile ilgili dizi hücresi bulunur.
– Ardından o hücredeki işaretçinin gösterdiği listede ilgili elemanı
sil.
Tek Yönlü Bağlantılı Liste ile Ayrık Zincirleme Uygulaması

#include <iostream>
#include<stdlib.h>
using namespace std;

typedef struct topluluk {


int bilgi;
struct topluluk *arka;
}BAGLISTE;
int boyut=10;
// HASH DİZİSİ
BAGLISTE
*HASHDIZI[10]={NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL};
BAGLISTE *ara(int), *sil(int);
BAGLISTE *okuKlavye();
int hash(int val);void hash_kur();
void yazEkrana(BAGLISTE *yazilicak);
void ekle(BAGLISTE *ki);
void listele();
// Devami arka sayfada
Tek Yönlü Bağlantılı Liste ile Ayrık Zincirleme Uygulaması

int main()
{
BAGLISTE *eklenecek, *ki;
int bilgi, sonuc;
char secim;
while(1){// Ekrana Menü çıkarılıyor
cout<<endl<<"Ekleme"<<endl<<"Listeleme"<<endl<<"Arama"<<endl<<"Silme"<<endl<<"Cikis"<<endl<<"Seciminiz ?"<<endl;
cin>>secim;
switch(secim)
{
case 'E':
{ eklenecek=okuKlavye(); //ekleme secildi
if (eklenecek!=NULL) ekle(eklenecek);
else cout<<endl<<"Ekleme icin bellek dolu ! "<<endl;
break;
}
case 'L':// listeleme seçildi
{ listele();
//if (sonuc==1) cout<<endl<<"Bos Liste ! "<<endl;
break;
}
// Devami arka sayfada
Tek Yönlü Bağlantılı Liste ile Ayrık Zincirleme Uygulaması
case 'A': // Arama secildi
{ cout<<endl<<"Aranan: ";
scanf("%d",&bilgi);
ki=ara(bilgi);
if (ki==NULL) cout<<endl<<"Aranan Bulunamadi ! "<<endl;
else yazEkrana(ki);
break;
}
case 'S': // Silme secildi
{ cout<<endl<<"Silinecek: ";
scanf("%d",&bilgi);
ki=sil(bilgi);
if (ki!=NULL) cout<<endl<<"Silindi ! "<<endl;
else cout<<"Silinmek istenen veri listede yok ! "<<endl;
break;
}
case 'C':// Çıkış seçildi
{ cout<<"HOSCAKAL :) "<<endl;
exit(0);

}
default:cout<<"Yanlıs Secim !! "<<endl;
}
}
system("pause");
return 0;
}// Devami arka sayfada
Tek Yönlü Bağlantılı Liste ile Ayrık Zincirleme Uygulaması
// fonksiyonlar
void yazEkrana(BAGLISTE *yazilacak){
printf(" %d ",yazilacak->bilgi);}

void ekle(BAGLISTE *ki){


int indis=hash(ki->bilgi);
BAGLISTE *p = HASHDIZI[indis];
if (p == NULL) {
HASHDIZI[indis] = ki;return;
}
else
{ BAGLISTE *ilk = HASHDIZI[indis];
ki->arka=ilk; HASHDIZI[indis]=ki;
return;
}
// ARKAYA EKLEME
//while(p->arka != NULL) { // p = p->arka; //} //p->arka = ki;}
void listele(){
BAGLISTE *p; p=new BAGLISTE;
for (int i=0;i<boyut;i++)
{ p=HASHDIZI[i];if(p!=NULL) cout<<endl;
while(p!=NULL){
yazEkrana(p);cout<<"-->";
p=p->arka;}
}
}
// Devami arka sayfada
Tek Yönlü Bağlantılı Liste ile Ayrık Zincirleme Uygulaması
BAGLISTE *ara(int aranan)
{ BAGLISTE *p;
p = new BAGLISTE;
int indis=hash(aranan);
p = HASHDIZI[indis];
while(p!=NULL){
if(p->bilgi==aranan) return p;
p=p->arka;}
return NULL;delete(p);
}
BAGLISTE *sil(int silinecek)
{ BAGLISTE *p, *bironceki;p = new BAGLISTE;
bironceki = new BAGLISTE;int indis=hash(silinecek);
p = HASHDIZI[indis];bironceki=NULL;
while(p!=NULL){
if(silinecek==p->bilgi) break; bironceki=p; p=p->arka; }
if (p!=NULL){
if(bironceki==NULL){
if (p->arka==NULL)
HASHDIZI[indis]=NULL;
else
HASHDIZI[indis]=p->arka;}
else{bironceki->arka=p->arka;}
return p;}
else
return NULL;}
// Devami arka sayfada
Tek Yönlü Bağlantılı Liste ile Ayrık Zincirleme Uygulaması

BAGLISTE *okuKlavye(){
BAGLISTE *okunan;
okunan=new BAGLISTE;
if (okunan==NULL)
return NULL;
cout<<"Bilgi Giriniz"<<endl;
scanf("%d",&(okunan->bilgi));
okunan->arka=NULL;
return okunan;

}
int hash(int val){
int ind=val%10;
return ind;
}
Ayrık Zincirleme Analizi

• Çarpışma olasılığı nedir ve hash fonksiyonunun çarpışma


oluşmasındaki etkisi nedir?
• Herbir liste ne kadar uzun olabilir?
• Yüklenme faktörü 𝜆:
– Hash tablosundaki eleman sayısının hash tablosu boyutuna
oranı
• 𝜆 = N/TabloBoyutu
– Ortalama liste uzunluğu da 𝜆 olabilir veya >1 de olabilir.
Ayrık Zincirlemede Arama Maliyeti

 Maliyet = Hash fonksiyonu süresi (sabit)+ liste üzerinde dolaşma süresi


 Başarısız arama:
 Tüm liste dolaşılır ve ortalama 𝜆 tane düğüm karşılaştırılır.
 Başarılı arama:
 Listede aranan düğüm ile birlikte 0 veya daha fazla sayıda başka düğüm
vardır.
 Aranan dışındaki ortalama düğüm sayısı 
 Ortalama kontrol edilecek dugum sayısı aranan düğüm sayısının yarısıdır.
 Dolayısıyla ortalama arama maliyeti = 1 +/2
• Bu sonuçlar bize tablo boyutunun önemli olmadığını önemli olanın yükleme faktörü
olduğunu gösterir.
• Tablo boyutu yükleme faktörünü 1 civarında tutmak için hash tablosuna eklenmesi
tahmin edilen eleman sayısı kadar olmalıdır.
Açık Adresleme
• Ayrık zincirleme tabloya ek olarak liste yapısını kullandığı için
dezavantajlıdır.
• Çünkü ikinci bir veri yapısı kullanımı gerekir.
• Açık adreslemede gelen tüm veri hash tablosunda tutulur.
• Dolayısıyla Büyük Boyutlu bir tablo gerekir
• Genel olarak tablo boyutu yükleme faktörünü 0.5 civarında
tutacak şekilde seçilmelidir.
• Bir çarpışma gerçekleştiğinde tablodaki boş hücreler aranır ve
bulunan ilk boş hücreye veri yerleştirilir.
• Üç tane çarpışma çözme stratejisi kullanılır.
• Doğrusal araştırma (Linear probing)
• Karesle araştırma (Quadratic probing)
• Çift Hashleme (Double hashing)
Doğrusal Araştırma
• Doğrusal araştırmada çarpışmalar ardışıl arama ile boş bir hücre
bulunana kadar devam eder ve boş bir hücre bulunduğunda veri o
hücreye yerleştirilir.
• Çarpışma fonksiyonu doğrusaldır f(i)= i.
• Örnek:
– 89, 18, 49, 58, 9 şeklinde verilen veriyi boş bir hash tablosuna
yerleştiriniz.
– Tablo boyutu 10.
– Hash fonksiyonu hash(x) = x mod 10.
• f(i) = i;
Şekil
Doğrusal araştırmada
her veri yerleşiminden
sonra tablonun durumu
Arama ve Silme
• Arama algoritması ekleme ile aynı tekniği kullanır.
– 58 verisi için 4 araştırma gerekir.
– 19 verisi için 5 araştırma gerekir.
• Silme işleminde tembel silme (lazy deletion) yapıyoruz. Yani
elemanları silindi olarak işaretliyoruz.
– Standard silme (verinin fiziksel olarak silinmesi, yapılamaz,
neden?)
– Tembel Silme İçin;
Dizinin herbir hücresi için 3 durum bilgisi tut:
– Dolu, Boş ve Silindi
– Arama ve silmede hash fonksiyonundan dönen indise sahip hücre
durumu Boş ise aramayı sonlandır, Silindi ise devam et.
Arama ve Silme (Örnek)
• Yanda verilen hash tablosunda
Tablo Veri
aşağıda verilen işlemleri yapınız İndis
(H(x)=x%10) 0 43
1 37
• İşlemler: 2
• Ekle(13,36,43,27,37) 3 13
• Ara (13, 52) 4
5
• Sil 13
6 36
• Bul 43 7 27
• Eğer 13 ü silersek 43 ü bulamayız! 8

• Çözüm silme ama silindi olarak 9


işaretle.
Kümelenme Problemi
• Tablo yeterince büyük olduğu sürece daima boş bir hücre bulunabilir ama arama
süresi uzar.
• Daha kötüsü eğer tablo boş alanlar çok olsa da bazı bölümlerde dolu hücre blokları
oluşmaya başlar.
• Bu duruma birincil kümelenme denir. Küme ile aynı indis değerine sahip bir veri
geldiğinde bu veri için birden fazla hareket gerekecek ve sonunda da o veri de
kümeye eklenecektir.

x x x x x x x x x x x x x x x
Karesel (Quadratic) Araştırma
• Karesel araştırma birincil kümelenme problemini çözmek için
geliştirilmiştir.
• Çarpışma fonksiyonu kareseldir: 𝑓 𝑖 = 𝑖2
• Eğer hash fonksiyonunun ürettiği indis(ℎ) sonuç üretmezse bu durumda
bir sonraki indis(ler) ℎ + 12 , ℎ + 22 …. ℎ + 𝑖2 şeklinde bir sırayla seçilir.
– Örneğin karesel araştırmada hash fonksiyonu ile elde edilen indis h=0
olursa ve sonuç elde edilememişse bir sonraki indis 1, 4, 9 şeklinde
gider.
• Şunu unutmayalım ki sonraki indisler orijinal indisin kareleri şeklinde
ilerler.
Örnek
Karesel araştırmada her
veri yerleşiminden sonra
tablonun durumu
Karesel Araştırma-Analiz
• Problem:
– Tablodaki tüm hücrelerin araştırılacağından emin olamayız.
– Eğer Tablo Boyutu asal bir sayı değilse bu problem daha da muhtemeldir.
• Teorem: Eğer Tablo Boyutu bir asal sayı seçilirse ve yükleme faktörü 0.5 ten büyük değilse gelecek
herhangi bir veri mutlaka tabloya yerleşecektir.
• Teorem ispatı: Varsayalım ki Tablo Boyutu M olsun ve M asal olsun. Hedefimiz ilk M/2 adet
hücrenin ayrık olduğunu göstermek.
• Bu hücrelerin iki tanesi h+i2 ve h+j2 olsun ve i ve j için 00 ≤ 𝑖, 𝑗 ≤ 𝑀/2 olsun; Zıtlıkla ispat etmek
için varsayalım ki bu iki hücre aynı ama i ≠ 𝑗 olsun; Buradan;
ℎ + 𝑖2 = ℎ + 𝑗2 (𝑚𝑜𝑑 𝑀)
𝑖2 = 𝑗2 (𝑚𝑜𝑑 𝑀)
𝑖2 − 𝑗2 = 0 (𝑚𝑜𝑑 𝑀)
(𝑖 − 𝑗)(𝑖 + 𝑗) = 0 (𝑚𝑜𝑑 𝑀)
• Bu sonuçlara göre M asal olduğu için ne (𝑖 − 𝑗) ne de (𝑖 + 𝑗) M in bir bölenidir. Dolayısıyla burada
bir zıtlık vardır.
• Bu zıtlık bize eğer tablonun en fazla yarısı doluysa (yükleme faktörü 0.5) ilk M/2 sayıdaki
hücrelerin tamamının ayrık olduğunu ve tabloda m/2 tane boş hücre olduğu için gelecek bir
verinin tabloya yerleşeceğini garanti eder.
Bazı Önemli Noktalar
– Doğrusal araştırma kolayca uygulanabilir. Karesel araştırma çarpma ve mod
alma gerektirir.
– Eğer yükleme faktörü çok büyürse ne yapabiliriz?
– Tablo Boyutunu yükleme faktörünü 0.5 civarında tutacak şekilde dinamik
olarak değişecek olarak belirle. Bu işleme tekrar hashleme denir.
– Tablo boyutunu daima bir öncekinin yaklaşık iki katı olan bir asal sayıya
eşitle
– Taabloyu genişletirken, eski tabloyu yeni tabloya yeni hash fonksiyonu
yardımıyla yerleştir.
– Karesel araştırma birincil kümelenme için bir çözümdür ancak peki ikincil bir
kümelenme olursa;
– Çift Hashleme (Double Hashing) kullan
 Araştırma Ödevi: Double Hashing
Hashing Uygulama Örnekleri ve Özet
 Derleyiciler kullanıcı tarafından tanımlanan değişkenlerde kullanılan
sembollerin tablosunu tutmak için hash tablosunu kullanırlar.
 Oyun programlarında hareketli nesnelerin uğradığı pozisyonların takibi için
hash tabloları kullanılır.
 ÖZET:
 Hash tabloları ortalama bir sürede bir tabloya veri ekleme ve arama için
kullanılabilirler.
 Arama süresi tablonun boyutuna değil yükleme faktörüne bağlıdır.
 Tablo boyutu belirlenirken asal sayı olan bir boyut seçmek önemlidir. Ayrıca
doğru hash fonksiyonu ve uygun yükleme fonksiyon değeri de önemlidir.
 Eğer ayrık zincirleme kullanılacaksa yükleme faktörü 1’e yakın olmalıdır.
 Eğer açık adresleme yapılacaksa bu durumda yükleme faktörü 0.5 i
geçmemelidir.

You might also like