• Tidak ada hasil yang ditemukan

Fungsi Hashing untuk Data String

Dalam dokumen BAB I ALGORITMA DAN STRUKTUR DATA (Halaman 67-74)

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,

Dalam dokumen BAB I ALGORITMA DAN STRUKTUR DATA (Halaman 67-74)

Dokumen terkait