Materi Pertemuan 9 SD 1 - Hash
Transcript of Materi Pertemuan 9 SD 1 - Hash
Pertemuan 9. Hash
TI-FST-Universitas Sanata Dharma
2
Tujuan
Mahasiswa memahami hash Mahasiswa mampu
mengimplementasikan proses hashing
Problem
Sebuah universitas memiliki 10.000 data mahasiswa. Setiap mahasiswa memiliki 9 digit nomor mahasiswa. 2 digit untuk tahun masuk + 1 digit kode fakultas + 1 digit kode jurusan + 1 digit kode prodi + 1 digit kode jenjang + 3 digit nomor urut
Data mahasiswa tersebut disimpan dalam array. Bagaimana jika akan mencari data mahasiswa yang
sudah tersimpan. (pencarian dilakukan hanya dengan sekali langkah)
Contoh 1
Name VAL ID
Al-Otaibi, Ziyad 1.73 985926
Al-Turki, Musab Ahmad Bakeer 1.60 970876
Al-Saegh, Radha Mahdi 1.58 980962
Al-Shahrani, Adel Saad 1.80 986074
Al-Awami, Louai Adnan Muhammad 1.73 970728
Al-Amer, Yousuf Jauwad 1.66 994593
Al-Helal, Husain Ali AbdulMohsen 1.70 996321
Data akan dimasukkan dalam hash table berukuran 13, sehingga kode id akan dikonversi menjadi nilai 0 hingga 12 menggunakan hash function
Contoh 1
0 1 2 3 4 5 6 7 8 9 10 11 12
Hus
a in
You
s uf
Loua
i
Ziy
ad
Rad
ha
Mus
ab
Ade
l
Name ID hash(id) = id %13Al-Otaibi, Ziyad 985926 6Al-Turki, Musab Ahmad Bakeer 970876 10Al-Saegh, Radha Mahdi 980962 8Al-Shahrani, Adel Saad 986074 11Al-Awami, Louai Adnan Muhammad 970728 5Al-Amer, Yousuf Jauwad 994593 2Al-Helal, Husain Ali AbdulMohsen 996321 1
Contoh 2
CatDogElephantFrogGrasshopperHippopotamusHorseCougarCoyoteZebra
□ Menggunakan nilai posisi huruf dari huruf pertama sebuah kata. (mulai dari 0)
□ Hash Table berukuran 26 (26 bucket)
Indeks 2cat
cougar
coyote
Indeks 7horse
hippopotamus
Contoh 3
S101 bananas
S123 potatoes
S592 tomatoes
S199 plums
S102 apples
S213 pears
S541 peaches
S= 19
bucket 1
bucket 5
bucket 5
bucket 8
bucket 2
bucket 5
bucket 9
collision
Contoh 4
Hash(key) = (2 * int(key) modulus 10)
Cat
Dog
Elephant
Frog
(2* (3+1+20)) % 10 = 48 % 10 = 8
(2*(4+15+7)) % 10 = 52 % 10 = 2
(2*(5+12+5+16+8+1+14+20) )% 10 = 162 % 10 = 2
(2*(6+18+15+7)) % 10 = 92 % 10 = 2
Hash Tables
Hash Table adalah array satu dimensi dengan nilai indeksnya merupakan hasil fungsi dari data yang akan dimasukkan dalam array pada posisi indeks tersebut.
Fungsi yang digunakan disebut dengan Hash Function Penggunaan hash akan menyebabkan data dengan
jangkauan /range yang luas akan menjadi data dengan range yang lebih sedikit.
Untuk menyisipkan atau mencari data, maka diperlukan key dari setiap data untuk diolah dengan hash function -> operasi insert dan search akan menjadi cepat.
Hash Functions
Hash function, h, adalah fungsi yang mengubah key K ke dalam indeks dalam tabel/array berukuran n:
h: K -> {0, 1, ..., n-2, n-1} Sebuah key dapat angka, string atau yang lain.
Collision
Key yang berbeda dapat berada dalam lokasi / indeks yang sama.
Hal ini disebut collision dan key yang ber- colliding disebut synonyms.
Collision susah dihindari jika kita tidak memiliki pengetahuan sebelumnya tentang key yang ada.
Usaha / prosedur untuk memecahkan masalah yang timbul akibat collision disebut collision resolution
Load Factor
Load factor dari hash table adalah rasio jumlah key yang digunakan dengan ukuran hash table.
Load factor lebih dari 1.0, maka kemungkinan collision bertambah
Faktor yang mempengaruhi unjuk kerja Hash
Pemilihan fungsi hash Strategi Collision resolution Load Factor
Sifat Hash Function
Hash function yang bagus : Collision minimal. Mudah dan cepat menghitung. Mendistribusikan nilai key secara merata dalam
hash table. Menggunakan semua key untuk menghasilkan
nilai hash. Menghasilkan nilai yang sangat berbeda untuk
keys yang sama.
Metode Hash Function
Sisa hasil bagi bilangan prima Pemotongan /ekstraksi Lipatan / folding Konversi radiks Mid-square
Sisa Hasil Bagi Bilangan Prima
Menghitung nilai hash dari key yang ada menggunakan operator modulo (%).
Ukuran tabel yang merupakan nilai pangkat n dari 2 sebaiknya dihindari, karena akan menyebabkan collision yang semakin besar.
Nilai pangkat dari 10 juga dihindari menjadi ukuran tabel jika key merupakan nilai integer desimal.
Bilangan prima yang tidak mendekati pangkat dari 2 adalah ukuran tabel yang lebih baik.
Metode ini akan semakin baik jika digabungkan dengan pemotongan atau lipatan.
Pemotongan /ekstraksi Mendasarkan pada distribusi digit atau karakter
dalam key. Mengambil digit pada posisi tertentu secara merata.
Misal :
Phone no index
731-3018 338
539-2309 329
428-1397 217 Cepat, tetapi distribusi digit mungkin tidak sama.
Lipatan Membagi key menjadi 2 atau lebih kemudian
menggabungkan bagian tersebut untuk membuat alamat hash.
Untuk memetakan key 25936715 ke range 0 - 9999, maka : pecah angka menjadi 2 : 2593 dan 6715 tambahkan dua nilai tersebut menjadi 9308
Bagus jika key sangat besar Cepat dan sederhana khususnya untuk pola bit. Kemampuan yang bagus untuk mengubah key
non-integer menjadi integer.
Konversi Radiks Mengubah key ke bilangan dengan basis lain untuk
mendapatkan nilai hash BIasanya menggunakan basis bilangan selain basis
2 dan basis 10. Memetakan key 38652 dalam range 0 – 9999
menggunakan basis 11
3x114 + 8x113 + 6x112 + 5x111 + 2x110 = 5535411
Bilangan tersebut kemudian dipotong sehingga berada dalam range 0 – 9999 menjadi 5354.
Mid-Square Key di kwadrat dan nilai tengah dari hasil
diambil sebagai nilai hash. Contoh : key 3121 dimasukkan dalam hash
table ukuran 1000, maka : 31212 = 9740641 dan mengambil nilai 406 sebagai nilai hash
Efisien jika menggunakan hash table ukuran pangkat dari bilangan 2
Tidak digunakan jika key banyak mengandung nilai 0.
Teknik Collision Resolution
1. Separate Chaining : implementasi menggunakan linked list.
2. Open Addressing: implementasi menggunakan array.1. Linear probing (linear search)
2. Quadratic probing (nonlinear search)
3. Double hashing (Rehashing)
4. Random increments/decrements
3. Buckets methods: Kombinasi (1) dan (2)
Separate Chaining
Hash table di implementasikan sebagai array of linked lists.
Menyisipkan item, r, pada indeks i sama seperti menyisipkan ke dalam linked list pada posisi i.
Key yang sinonim akan di hubungkan dalam linked list yang sama.
Memperoleh item, r, dengan alamat hash, i, sama dengan mendapatkan item pada linked list posisi i.
Begitu juga dengan menghapus.
Separate Chaining
Menggunakan fungsi h(x)= x % 15 Setiap elemen array menjadi kepala dari
rantai linked list.
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 47 65 36 129 25 2501 35
Bgm menyimpan 29, 16, 14, 99, 127 ?
Separate Chaining
Menyimpan 29, 16, 14, 99, 127
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 16 47 65 36 127 99 25 2501 14 35 129 29
Kelemahan Separate Chaining
Sebagian array tidak pernah terpakai. Jika rantai yang terbentuk panjang maka
proses pencarian juga lama. Membuat node baru juga membutuhkan
waktu
Linear Probing Key x disimpan dengan fungsi linear biasa f(x)=t
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 47 35 36 129 25 2501 65(?)
Bgm jika terjadi collision ?Jika hash table tidak full, simpan key dalam posisi array
sesudahnya (kasus ini : (t+1)%15, (t+2)%15, (t+3)%15 …)
Sampai ditemukan tempat kosong.
Linear Probing
Dimana menyimpan 65 ?
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 47 35 36 65 129 25 2501 percobaan
Bagaimana dengan 29, 16?
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 16 47 35 36 65 129 25 2501 29
Linear Probing
Bagaimana dengan 14, 99 ? 0 1 2 3 4 5 6 7 8 9 10 11 12 13 1414 16 47 35 36 65 129 25 2501 29
0 1 2 3 4 5 6 7 8 9 10 11 12 13 1414 16 47 35 36 65 129 25 2501 99 29
Linear Probing
Menyelesaikan masalah pada separate chain (banyak tempat kosong dan biaya membangun node baru)
Muncul masalah baru : pengelompokan. Data cenderung mengelompok dalam interval tertentu.
Muncul masalah efisiensi pencarian. Menghapus menjadi susah….
Masalah menghapus
0123456789
H=KEY MOD 10 Insert 47, 57, 68, 18,
67 Find 68 Find 10 Delete 47 Find 57
Quadratic Probing
Key x disimpan dengan fungsi hash f(x)=t
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 47 35 36 129 25 2501 65(?)
Bagaimana jika terjadi collision?Jika hash table tidak full, simpanlah key dalam
array ke : (t+12)%N, (t+22)%N, (t+32)%N …sampai ditemukan tempat kosong.
Quadratic Probing
Dimana menyimpan 65 ? f(65)=t=5
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 47 35 36 129 25 2501 65 t t+1 t+4 t+9
Dimana menyimpan 29?
0 1 2 3 4 5 6 7 8 9 10 11 12 13 1429 47 35 36 129 25 2501 65 t+1 t
Quadratic Probing
Bgm dng 16? 0 1 2 3 4 5 6 7 8 9 10 11 12 13 1429 16 47 35 36 129 25 2501 65 t
Dimana menyimpan 14?
0 1 2 3 4 5 6 7 8 9 10 11 12 13 1429 16 47 14 35 36 129 25 2501 65 t+1 t+4 t
Quadratic Probing
99?
0 1 2 3 4 5 6 7 8 9 10 11 12 13 1429 16 47 14 35 36 129 25 2501 99 65 t t+1 t+4
127 ?0 1 2 3 4 5 6 7 8 9 10 11 12 13 1429 16 47 14 35 36 127 129 25 2501 99 65 t
Quadratic Probing
Key terdistribusi dengan lebih baik Mengurangi masalah pengelompokan Terdapat resiko loop yang tidakterbatas
saat proses menyisipkan. Misal : sisip key 16 ke dlm array ukuran
16, dengan posisi 0, 1, 4 dan 9 sudah digunakan.
Sehingga, ukuran tabel harus prima.
Double Hashing Menggunakan fungsi hash untuk
pengurangan nilai Hash(key, i) = H1(key) – (H2(key) * i)
Pengurangan merupakan fungsi dari key Slot yang dikunjungi dengan fungsi hash akan
bervariasi meskipun nilai awal slot sama Menghindari pengelompokan
Secara teoritis benar, tetapi dalam praktek lebih lambat dari quadratic probing, sebab perlu melakukan evaluasi dengan fungsi hash kedua.
Double Hashing
Key x disimpan dalam array dengan fungsi f(x)=t
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 47 35 36 129 25 2501 65(?)
Bgm jika terjadi collision?Tentukan fungsi hash kedua f2(x)=d. Simpan key
dalam array ke (t+d)%N, (t+2d)%N, (t+3d)%N … sampai ditemukan slot kosong.
Double Hashing Fungsi hash kedua yang biasa digunakan
f2(x)=R − ( x % R )
Dengan R adalah bilangan prima, R < N
Double Hashing
Dimana menyimpan 65 ? f(65)=t=5 f2(x)= 11 − (x % 11) f2(65)=d=1Cat: R=11, N=15
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 47 35 36 65 129 25 2501 t t+1 t+2
Double Hashing
Dimana menyimpan 29?f2(x)= 11 − (x % 11) f2(29)=d=4 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 47 35 36 65 129 25 2501 29 t
Bagaimana dengan 16?f2(x)= 11 − (x % 11) f2(16)=d=6
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 16 47 35 36 65 129 25 2501 29 t
Double Hashing
Dimana menyimpan 14f2(x)= 11 − (x % 11) f2(14)=d=8
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 14 16 47 35 36 65 129 25 2501 29 t+16 t+8 t
Dimana 99?Let f2(x)= 11 − (x % 11) f2(99)=d=11
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 14 16 47 35 36 65 129 25 2501 99 29 t+22 t+11 t t+33
Double HashingDimana menyimpan 127Let f2(x)= 11 − (x % 11) f2(127)=d=5
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 14 16 47 35 36 65 129 25 2501 99 29 t+10 t t+5
Infinite loop!
Bahan Diskusi display_Table(): void hash_Function(int) : int insert(DataItem item) : void delete(int key) : DataItem find(int key) : DataItem