5.3 Pencarian Biner
3. Fungsi Hashing untuk Data String
Fungsi hash untuk data yang berupa string diperlukan nilai dari suatu karakter, yang biasanya digunakan berdasar kode ASCII. ASCII singkatan dari American Standard Code for Information Interchange. Komputer hanya dapat memahami bilangan, sehingga kode ASCII adalah representasi numerik dari karakter seperti 'a' atau '@' atau beberapa macam tindakan. Di bawah ini adalah tabel karakter ASCII dan ini termasuk deskripsi dari 32 karakter pertama non-cetak. Tabel ASCII selengkapnya dapat dilihat pada Tabel 5.1
Ada berbagai cara untuk mengkonversi suatu string menjadi suatu bilangan bulat, fungsi hash untuk data string memerlukan konversi tersebut. Misalkan metode hash yang dipilih adalah metode pembagian (modulo atau mod) dengan menggunakan beberapa rumus fungsi hash dari suatu data string, secara umum fungsi hashnya dinyatakan dalam bentuk :
H(string) = nilai_hash mod P + 1 dengan
nilai_hash adalah bilangan bulat positif yang ditentukan berdasar stringnya. P adalah ukuran tabel hash yaitu bilangan prima ≥ banyak data key.
68 Tabel 5.1 Tabel ASCII (http://www.asciitable.com)
Nilai_hash di atas dapat ditentukan dengan berbagai rumus, pada penelitian ini digunakan 3 rumus penentuan nilai_hashnya, yaitu antara lain :
a. Fungsi Hash H1
Fungsi hash H1 dihitung berdasarkan rumus berikut :
Nilai_hash = (nilai_string[0] + nilai_string[1] + ... + nilai_string[n-1])
dengan n adalah panjang dari string, nilai_string[i] ditentukan dengan menggunakan Tabel 5.1 Tabel ASCII
Sebagai gambaran :
Jika string = ‘byte’ maka nilai_hash = 98 + 121 + 116 + 101 = 436 Jika string = ‘RAM’ maka nilai_hash = 82 + 65 + 77 = 224 b. Fungsi Hash H2
Fungsi hash H2 dihitung berdasarkan rumus berikut :
Nilai_hash = (((nilai_string[0] + nilai_string[n-1])/2) * n)
dengan n adalah panjang dari string, nilai_string[i] ditentukan dengan menggunakan Tabel 5.1 Tabel ASCII.
69 Sebagai gambaran :
Jika string = ‘byte’ maka nilai_hash = ((98 + 101)/2 ) * 4 = 398 Jika string = ‘RAM’ maka nilai_hash = ((82 + 77 )/2) * 3) = 238 c. Fungsi Hash H3
Fungsi hash H3 dihitung berdasarkan rumus iterasi sebagai berikut : nilai_hash = 0;
for i = 0 to n-1 do nilai_hash = (nilai_hash *3 + nilai_string[i]) mod P;
dengan n adalah panjang dari string, P adalah ukuran tabel hash yaitu bilangan prima ≥ banyak data key, nilai_string[i] ditentukan dengan menggunakan Tabel 5.1 Tabel ASCII Sebagai gambaran :
Dengan nilai P = 239,
Jika string = ‘byte’ maka nilai_hash = 121 Jika string = ‘RAM’ maka nilai_hash = 54
Tujuan dari pemilihan fungsi hash adalah untuk menempatkan rekaman pada alamat tertentu, sehingga bisa dihindari terjadinya tabrakan (collision resolution), yaitu suatu keadaan dimana dua buah atau lebih rekaman yang mempunyai data kunci yang berbeda mampunyai alamat hash yang sama. Meskipun demikian, kemungkinan adanya tabrakan selalu tetap saja terjadi, meskipun fungsi hashnya sudah dipilih yang cukup baik. Dengan demikian, diperlukan satu cara untuk mengatasi tabrakan yang mungkin terjadi.
Terdapat 2 metode atau cara untuk mengatasi tabrakan, dimana kedua cara tersebut mempunyai kelebihan dan kekurangan, yaitu antara lain :
a. Closed hashing (Open Addressing)
Metode Open adressing baik yang Linear Probing, Quadratic Probing maupun Double hashing mempunyai kelebihan yaitu penggunaan memorynya lebih sedikit, akan tetapi kelemahannya adalah waktu pencariannya lebih lambat
b. Open hashing (Separate Chaining)
Metode Separate Chaining atau linked mempunyai kelebihan yaitu waktu pencariannya lebih cepat, sedangkan kekurangannya penggunaan memorynya lebih banyak. Misalkan digunakan metode Separate Chaining, yaitu dengan membuat struktur data untuk tabel hash menggunakan linked list (pointer), yang dapat digambarkan sebagai berikut :
70
Gambar 5.1 Struktur Data untuk Tabel Hash
Pada studi kasus data kamus, untuk menyimpan ke dalam tabel hash diperlukan langkah-langkah sebagai berikut :
1. Menentukan ukuran tabel hash, yaitu nilai P merupakan bilangan prima yang lebih besar atau sama dengan banyaknya data key.
2. Untuk setiap data key X[i].key
Hitung nilai indeks IH, yaitu nilai fungsi hash H untuk data key X[i].key
Tempatkan data key X[i].key pada tabel hash H[i].data.key
Jika terjadi tabrakan tempatkan pada linkednya yang masih kosong.
Kode program untuk menyimpan data kamus pada tabel hash adalah sebagai berikut : // Menentukan bilangan prima P, ukuran tabel hashnya
long prima(int N) {long p; bool prima; do {
if ((N==2)||(N==3)) prima=true;
else if ((N%2==0)||(N<2)) prima=false;
1 Account
Akun
2 Byte browse cancel
Bita jelajah batal
. . . P RAM copy Memory utama salin
71 else
{ p=3;prima=true; do {
if ((N%p)==0) prima=false; else p=p+2; } while ( prima && p<=(sqrt(N)+1));}
if (!prima) N++; } while (!prima); return N;
}
//Menentukan nilai fungsi hash, ada 3 macam fungsi hash int nilai1(strg s,int p) {
int sum=0;
for(int i=0;i<strlen(s);i++) sum +=s[i]; return sum%p+1;
}
int nilai2(strg s,int p) { int sum=0;
sum =((s[0]+s[strlen(s)-1])*strlen(s))/2; return sum%p+1;
}
int nilai3(strg s,int p) { int sum=0;
for(int i=0;i<strlen(s);i++) { sum = (sum*3 + s[i])%p;} return sum%p+1;}
//Menempatkan data kamus pada tabel hash H
void hashing(datakamus X[1000], int N, larik H, int &p) { int IH,I,t=0;list Q,b;
p=prima(N);
72 strcpy(H[i].data.key,"");H[i].next=NULL; } for(int i=1;i<=N;i++) { IH = nilai1(X[i].key,p); if (strcmp(H[IH].data.key,"")==0) H[IH].data=X[i]; else { b=new node;b->data=X[i];b->next=NULL; if (H[IH].next==NULL) H[IH].next=b; else { Q=H[IH].next;
while (Q->next!=NULL) Q=Q->next; Q->next=b;
} }
} }
Sedangkan cuplikan program untuk menampilkan isi tabel hash sekaligus menghitung rerata probe adalah sebagai berikut :
cout<<"TABEL HASH : \n"; for (int I=1;I<=p;I++) { cout<<I<<" "; if (strcmp(H[I].data.key,"")!=0) {s++;cout<<H[I].data.key<<" , ";} if(H[I].next!=NULL) { Q=H[I].next;t=2; while(Q!=NULL) { s+=t; t++; cout<<Q->data.key<<" , "; Q=Q->next; } }
73 Untuk mencari data kamus tertentu pada tabel hash diperlukan langkah-langkah sebagai berikut :
1. Membaca data key tertentu, misalkan a
2. Menghitung nilai indeks IH dari data key a, kemudian mencari data key a di tabel hash dengan indeks IH.
Kode program untuk mencari data kamus pada tabel hash adalah sebagai berikut : void cari(larik H,int p)
{int lokasi,i,k=1;list q;bool ada;strg a="";
cout<<"\nmasukkan data yg dicari : ";gets(a);cout<<endl; i= nilai1(a,p);
ada=false;
if (strcmp(a,"")!=0 && strcmp(H[i].data.key,a)==0) {ada=true;lokasi=i;cout<<H[i].data.info<<endl<<endl;} else
if (H[i].next!=NULL) { q=H[i].next;ada=false;
while (q!=NULL && !ada) { if (strcmp(q->data.key,a)==0) { ada=true;lokasi=i;k++; cout<<q->data.info<<endl<<endl;} else {q=q->next;k++;} } } else ada=false;
if (ada) {cout<<"data ada di "<<lokasi<<" ke "<<k<<endl;} else cout<<"data tidak ada";
74
5.5 Latihan Soal
1. Buatlah program untuk menyimpan sejumlah N data mahasiswa yang terdiri dari NIM,