Materi Pertemuan 9 SD 1 - Hash

Post on 10-Jun-2015

596 views 4 download

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