32
HASHING LAPORAN PRAKTIKUM ALGORITMA DAN STRUKTUR DATA Disusun untuk Memenuhi Matakuliah Praktikum Algoritma dan Struktur Data Yang Dibimbing oleh I Made Wirawan, S.T., M.Eng. Oleh : Carolin Windiasri 110533430574 PTI OFF C 11 UNIVERSITAS NEGERI MALANG FAKULTAS TEKNIK JURUSAN TEKNIK ELEKTRO S1 PENDIDIKAN TEKNIK INFORMATIKA

Hashing

Embed Size (px)

Citation preview

Page 1: Hashing

HASHINGLAPORAN PRAKTIKUM ALGORITMA DAN STRUKTUR DATA

Disusun untuk Memenuhi Matakuliah Praktikum Algoritma dan Struktur Data Yang Dibimbing oleh I Made Wirawan, S.T., M.Eng.

Oleh :Carolin Windiasri

110533430574PTI OFF C 11

UNIVERSITAS NEGERI MALANG

FAKULTAS TEKNIK

JURUSAN TEKNIK ELEKTRO

S1 PENDIDIKAN TEKNIK INFORMATIKA

NOVEMBER 2012

Page 2: Hashing

MODUL XIHASHING

A. TUJUAN Mampu membuat dan mendeklarasikan struktur algoritma tabel hash Mampu menerapkan dan mengimplementasikan struktur algoritma tabel hash

B. DASAR TEORI Pengertian Hash Tabel

Hash Table adalah sebuah struktur data yang terdiri atas sebuah table dan fungsi yang bertujuan untuk memetakan nilai kunci yang unik untuk setiap record (baris) menjadi angka (hash) lokasi record tersebut dalam sebuah tabel.

Keunggulan dari struktur hash table ini adalah waktu aksesnya yang cukup cepat, jika record yang dicari langsung berada pada angka hash lokasi penyimpanannya. Akan tetapi pada kenyataannya sering sekali ditemukan hash table yang record-recordnya mempunyai angka hash yang sama (bertabrakan). Karena pemetaan hash function yang digunakan bukanlah pemetaan satu-satu, (antara dua record yang tidak sama dapat dibangkitkan angka hash yang sama) maka dapat terjadi bentrokan (collision) dalam mengatasi hal ini, maka perlu diterapkan penempatan suatu data record. Untuk kebijakan resolusi bentrokan (collision resolution policy) untuk menentukan lokasi bentrokan adalah dengan mencari record dalam tabel. Umumnya kebijakan resolusi lokasi tabel yang masih kosong pada lokasi setelah lokasi yang berbentrokan.

Operasi Pada Hash Tabel insert: diberikan sebuah key dan nilai, insert nilai dalam tabel find: diberikan sebuah key, temukan nilai yang berhubungan dengan key remove: diberikan sebuah key, temukan nilai yang berhubungan dengan key

kemudian hapus nilai tersebut getIterator: mengembalikan iterator, yang memeriksa nilai satu demi satu

Struktur dan Fungsi pada Hash TabelHash table menggunakan struktur data array asosiatif yang mengasosiasikan record dengan

sebuah field kunci unik berupa bilangan (hash) yang merupakan representasi dari record tersebut. Misalnya, terdapat data berupa string yang hendak disimpan dalam sebuah hash table. String tersebut direpresentasikan dalam sebuah field kunci k. Cara untuk mendapatkan field kunci ini sangatlah beragam, namun hasil akhirnya adalah sebuah bilangan hash yang digunakan untuk menentukan lokasi record.

Bilangan hash ini dimasukan ke dalam hash function dan menghasilkan indeks lokasi record dalam tabel.

k(x) = fungsi pembangkit field kunci (1)h(x) = hash function (2)

Contohnya, terdapat data berupa string “abc” dan “xyz” yang hendak disimpan dalam struktur hash table. Lokasi dari record pada tabel dapat dihitung dengan menggunakan h (k(“abc”)) dan h(k(“xyz”)).

Page 3: Hashing

Jika hasil dari hash function menunjuk ke lokasi memori yang sudah terisi oleh sebuah record maka dibutuhkan kebijakan resolusi bentrokan. Biasanya masalah ini diselesaikan dengan mencari lokasi record kosong berikutnya secara incremental.

Deklarasi utama hash tabel adalah dengan struct, yaitu:

typedef struct hashtbl{hash_size size;struct hashnode_s**nodes;hash_size(*hashfunc)(const char*);

}HASHTBL;

Anggota simpul pada hashtbl mempersiapkan penunjuk kepada unsur pertama yang terhubung dengan daftar. unsur ini direpresentasikan oleh struct hashnode:

struct hashnode_s{char *key;void *data;struct hashnode_s*next;

};

InisialisasiDeklarasi untuk inisialisasi hash tabel seperti berikut:

HASHTBL *hashtbl_create(hash_sizesize, hash_size(*hashfunc)(const char*)){

HASHTBL *hashtbl;

if(!(hashtbl=malloc(sizeof(HASHTBL))))return NULL;if(!(hashtbl->nodes=calloc(size, sizeof(struct hashnode_s*))))

{

Page 4: Hashing

free(hashtbl);return NULL;

}hashtbl->size=size;

if(hashfunc)hashtbl->hashfunc=hashfunc;else hashtbl->hashfunc=def_hashfunc;

return hashtbl;}

CleanupHash Tabel dapat menggunakan fungsi linked lists untuk menghapus element atau daftar

anggota dari hash tabel.Deklarasinya:

void hashtbl_destroy(HASHTBL *hashtbl){

hash_size n;struct hashnode_s*node, *oldnode;for(n=0; n<hashtbl->size; ++n){

node=hashtbl->nodes[n];while(node){

free(node->key);oldnode=node;node=node->next;free(oldnode);

}}free(hashtbl->nodes);free(hashtbl);

}

Menambah Elemen BaruUntuk menambah elemen baru maka harus menentukan ukuran pada hash tabel. Dengan

deklarasi sebagai berikut:

int hashtbl_insert(HASHTBL*hashtbl, const char *key, void *data){

struct hashnode_s *node;hash_size hash=hashtbl->hashfunc(key)%hashtbl->size;

Penambahan elemen baru dengan teknik pencarian menggunakan linked lists untuk mengetahui ada tidaknya data dengan key yang sama yang sebelumnya sudah dimasukkan, menggunakan deklarasi berikut:

node=hashtbl->nodes[hash];while(node){

if(!strcmp(node->key, key)){node->data=data;return 0;

}node=node->next;

}

Page 5: Hashing

Jika tidak menemukan key yang sama, maka pemasukan elemen baru pada linked lists dengan deklarasi berikut:

if(!(node=malloc(sizeof(struct hashnode_s))))return -1;if(!(node->key=mystrdup(key))){

free(node);return -1;

}node->data=data;node->next=hashtbl->nodes[hash];hashtbl->nodes[hash]=node;

return 0;}

Menghapus sebuah elemenUntuk menghapus sebuah elemen dari hash tabel yaitu dengan mencari nilai hash

menggunakan deklarasi linked list dan menghapusnya jika nilai tersebut ditemukan. Deklarasinya sebagai berikut:

int hashtbl_remove(HASHTBL *hashtbl, const char *key){

struct hashnode_s *node, *prevnode=NULL;hash_size hash=hashtbl->hashfunc(key)%hashtbl->size;

node=hashtbl->nodes[hash];while(node){

if(!strcmp(node->key, key)){free(node->key);if(prevnode)prevnode->next=node->next;else hashtbl->nodes[hash]=node->next;free(node);return 0;

}prevnode=node;node=node->next;

}return -1;

}

SearchingTeknik pencarian pada hash tabel yaitu dengan mencari nilai hash yang sesuai

menggunakan deklarasi sama seperti pada linked list. Jika data tidak ditemukan maka menggunakan nilai balik NULL. Deklarasinya sebagai berikut:

void *hashtbl_get(HASHTBL *hashtbl, const char *key){

struct hashnode_s *node;hash_size hash=hashtbl->hashfunc(key)%hashtbl->size;node=hashtbl->nodes[hash];while(node) {

if(!strcmp=(node->key, key)) return node->data;node=node->next;

Page 6: Hashing

}

return NULL;

}

ResizingJumlah elemen pada hash tabel tidak selalu diketahui ketika terjadi penambahan data. Jika

jumlah elemen bertambah begitu besar maka itu akan mengurangi operasi pada hash table yang dapat menyebabkan terjadinya kegagalan memory. Fungsi Resizing hash tabel digunakan untuk mencegah terjadinya hal itu. Deklarasinya sebagai berikut:

int hashtbl_resize(HASHTBL *hashtbl, hash_size size){

HASHTBL newtbl;hash_size n;struct hashnode_s *node,*next;

newtbl.size=size;newtbl.hashfunc=hashtbl->hashfunc;

if(!(newtbl.nodes=calloc(size, sizeof(structhashnode_s*))))return -1;for(n=0; n<hashtbl->size; ++n){

for(node=hashtbl->nodes[n];node;node=next){next=node->next;hashtbl_insert(&newtbl, node->key, node->data);hashtbl_remove(hashtbl, node->key);

}}

Page 7: Hashing

free(hashtbl->nodes);hashtbl->size=newtbl.size;hashtbl->nodes=newtbl.nodes;

return 0;}

Lookup pada Hash tableSalah satu keunggulan struktur hash table dibandingkan dengan struktur table

biasa adalah kecepatannya dalam mencari data. Terminologi lookup mengacu pada proses yang bertujuan untuk mencari sebuah record pada sebuah tabel, dalam hal ini adalah hash table.

Dengan menggunakan hash function, sebuah lokasi dari record yang dicari bias diperkirakan. Jika lokasi yang tersebut berisi record yang dicari, maka pencarian berhasil. Inilah kasus terbaik dari pencarian pada hash table. Namun, jika record yang hendak dicari tidak ditemukan di lokasi yang diperkirakan, maka akan dicari lokasi berikutnya sesuai dengan kebijakan resolusi bentrokan. Pencarian akan berhenti jika record ditemukan, pencarian bertemu dengan tabel kosong, atau pencarian telah kembalike lokasi semula.

Collision (Tabrakan)Keterbatasan tabel hash menyebabkan ada dua angka yang jika dimasukkan ke

dalam fungsi hash maka menghasilkan nilai yang sama. Hal ini disebut dengan collision.

contoh :Kita ingin memasukkan angka 6 dan 29.Hash(6) = 6 % 23 = 6Hash(29)= 29 % 23 = 6

Pertama-tama anggap tabel masih kosong. Pada saat angka 6 masuk akan ditempatkan pada posisi indeks 6, angka kedua 29 seharusnya ditempatkan diindeks 6 juga, namun karena indeks ke-6 sudah ditempati maka 29 tidak bias ditempatkan disitu, di sinilah terjadi collision. Cara penanganannya bermacam-macam:

a. Collision Resolution Open Addressing

1. Linear ProbingPada saat terjadi collision, maka akan mencari posisi yang kosong di bawah

tempat terjadinya collision, jika masih penuh terus ke bawah, hingga ketemu tempat yang kosong. Jika tidak ada tempat yang kosong berarti HashTable sudah penuh.

Contoh deklarasi program:

struct { ... } node;node Table[M]; int Free;/* insert K */Addr = Hash(K);if (IsEmpty(addr)) Insert(K,addr);else {/* see if already stored */test:

Page 8: Hashing

if (Table[addr].key == K) return;else {addr = Table[addr].link; goto test;}/* find free cell */Free = addr;do { Free--; if (Free<0) Free=M-1; }while (!IsEmpty(Free) && Free!=addr)if (!IsEmpty(Free)) abort;else {Insert(K,Free); Table[addr].link = Free;}}

2. Quadratic ProbingPenanganannya hampir sama dengan metode linear, hanya lompatannya tidak satu-satu, tetapi quadratic ( 12, 22, 32, 42, … )

3. Double HashingPada saat terjadi collision, terdapat fungsi hash yang kedua untuk menentukan posisinya kembali.

a. Collision Resolution Chaining Tambahkan keyand entry dimanapun dalam list (lebih mudah

dari depan) Keunggulan dibandingkan open addressing:

Proses insert dan remove lebih sederhana Ukuran Array bukan batasan (tetapi harus tetap

meminimalisir collision: buat ukuran tabel sesuai dengan jumlah key dan entry yang diharapkan)

Kerugian: Overhead pada memory tinggi jika jumlah entry sedikit

Macam - Macam Fungsi HashFungsi Hash (dilambangkan dengan h(k)) bertugas untuk mengubah k (key)

menjadi suatu nilai dalam interval [0....X], dimana "X" adalah jumlah maksimum dari record-record yang dapat ditampung dalam tabel. Jumlah maksimum ini bergantung pada ruang memori yang tersedia. Fungsi Hash yang ideal adalah mudah dihitung dan bersifat random, agar dapat menyebarkan semua key. Dengan key yang tersebar, berarti data dapat terdistribusi secara seragam bentrokan dapat dicegah. Sehingga kompleksitas waktu model Hash dapat mencapai O(1), di mana kompleksitas tersebut tidak ditemukan pada struktur model lain. Ada beberapa macam fungsi hash yang relatif sederhana yang dapat digunakan dalam penyimpanan database:a. Metode Pembagian Bersisa (division-remainder method)

Jumlah lokasi memori yang tersedi dihitung, kemudian jumlah tersebut digunakan sebagai pembagi untuk membagi nilai yang asli dan menghasilkan sisa. Sisa tersebut adalah nilai hashnya. Secara umum, rumusnya h(k)= k mod m. Dalam hal ini m adalah jumlah lokasi memori yang tersedia pada array. Fungsihash tersebut menempatkan record dengan kunci K pada suatu lokasi memori yang beralamat h(k). Metode ini sering menghasilkan nilai hash yang sama dari dua atau lebih nilai aslinya atau disebut dengan bentrokan. Karena itu, dibutuhkan mekanisme khusus untuk menangani bentrokan yang disebut kebijakan resolusi bentrokan.b. Melipat (folding)

Page 9: Hashing

Metode ini membagi nilai asli ke dalam beberapa bagian, kemudian menambahkan nilai-nilai tersebut, dan mengambil beberapa angka terakhir sebagai nilai hashnya. c. Transformasi Radiks (radix transformation)

Karena nilai dalam bentuk digital, basis angka atau radiks dapat diganti sehingga menghasilkan urutan angka-angka yang berbeda. Contohnya nilai desimal (basis 10) bisa ditransformasikan kedalam heksadesimal (basis 16). Digit atas hasilnya bisa dibuang agar panjang nilai hash dapat seragam.d. Pengaturan ulang digit (digit rearrangement)

Metode ini mengubah urutan digit dengan pola tertentu. Contohnya mengambil digit ke tiga sampai ke enam dari nilai aslinya, kemudian membalikan urutannya dan menggunakan digit yang terurut terbalik itu sebagai nilai hash. Fungsi hash yang bekerja dengan baik untuk penyimpanan pada database belum tentu bekerja dengan baik untuk keperluan kriptografi  atau pengecekan kesalahan. Ada beberapa fungsi hash terkenal yang digunakan untuk keperluan kriptografi. Diantaranya adalah fungsi hash message-diggest, contohnya MD2, MD4, dan MD5, digunakan untuk menghasilkan nilai hash dari tanda tangan digital yang disebut messagediggest. Ada pula Secure HashAlgorithm (SHA), sebuah algoritma standar yang menghasilkan message-diggest yang lebih besar (60-bit) dan serupa dengan MD4.

Bentrokan Pada Fungsi HashFungsi hash bukan merupakan fungsi satu-ke-satu, artinya

beberapa recordyangberbeda dapat menghasilkan nilai hash yang sama / terjadi bentrokan. Dengan fungsi hash yang baik, hal seperti ini akan sangat jarang terjadi, tapi pasti akan terjadi. Jika hal seperti ini terjadi, record-record tersebut tidak bisa menempati lokasi yang sama. Ada dua macam kebijakan resolusi bentrokan pada tabel hash, yaitu kebijakan resolusi bentrokan di luar tabel dan kebijakan resolusi bentrokan di dalam tabel. Harus diperhatikan juga teknik-teknik penempatan record agar mudah dicari jika dibutuhkan. Kebijakan resolusi bentrokan di luar tabel

Artinya tabel hash bukan lagi menjadi array of records, tetapi menjadi array of pointers. Setiap pointer menunjuk ke senarai berkait yang berisi record tersebut. Metode seperti ini dinamakan chaining. Dalam bentuk sederhananya berupa senarai berkait dari recordrecord yang menghasilkan nilai hash yang sama. Penambahan record dapat dilakukan dengan menambah senarai berisi record tersebut. Untuk pencarian pada tabel, pertama-tama dicari nilai hashterlebih dahulu, kemudian dilakukan pencarian dalam senarai berkait yang bersangkutan. Untuk menghapus suatu record, hanya menghapus senarainya saja. Kelebihan dari metode chaining ini chaining ini adalah proses penghapusan yang relarif mudah dan penambahan ukuran tabel hash bisa ditunda untuk waktu yang lebih lama karena penurunan kinerjanya berbanding lurus meskipun seluruh lokasi pada tabel sudah penuh. Bahkan, penambahan ukuran tabel bisa saja tidak perlu dilakukan sama sekali karena penurunan kinerjanya yang linier. Misalnya, tabel yang berisi record sebanyak dua kali lipat kapasitas yang direkomendasikan hanya akan lebih lambat dua kali lipat dibanding yang berisi sebanyak kapasitas yang direkomendasikan. Kekurangan dari metode chaining ini sama dengan kekurangan dari senarai berkait. Operasi traversal pada senarai berkait memiliki performa cache yang buruk. 

Page 10: Hashing

Struktur data lain dapat digunakan sebagai pengganti senarai berkait. Misalnya dengan pohon seimbang, kompleksitas waktu terburuk bisa diturunkan menjadi O(log n) dari yang  sebelumnya O(n). Namun demikian, karena setiap senarai diharapkan untuk tidak panjang, struktur data pohon ini kurang efisien kecuali tabel hash tersebut memang didesain untuk jumlah record yang banyak atau kemungkinan terjadi bentrokan sangat besar yang mungkin terjadi karena masukan memang disengaja agar terjadi bentrokan. Kebijakan resolusi bentrokan di dalam tabel

Berbeda dengan kebijakan resolusi bentrokan di luar tabel, pada kebijakan resolusi di dalam tabel data disimpan di dalam hash tabel tersebut, bukan dalam senarai berkait yang  bertambah terus menerus. Dengan demikian data yang disimpan tidak mungkin bisa lebih banyak daripada jumlah ruang pada table hash. Jika suatu record akan dimasukkan ke dalam tabel hash pada lokasi sesuai nilai hash-nya dan ternyata lokasi tersebut sudah diisi dengan record lain maka harus dicari lokasi alternatif yang masih belum terisi dengan cara tertentu. Cara ini disebut Open Addressing. 

Ada beberapa metode untuk menemukan lokasi baru yang masih kosong. Dalam proses menemukan lokasi baru ini harus menggunakan pola tertentu agar record yang disimpan tetap bisa dicari dengan mudah saat dibutuhkan kemudian. Metode-metode yang sering digunakan adalah:1. Linear probingDengan menambahkan suatu interval pada hasil yang diperoleh dari fungsi hash sampai ditemukan lokasi yang belum terisi.  2. Quadratic probing / squared probingHampir sama dengan linear probing, hanya saja pada quadratic probing, hasil yang diperoleh dari fungsi hash ditambahkan dengan kuadrat dari interval yang digunakan. 3. Double hashingPada metode double hashing, jika lokasi yang diperoleh dengan fungsi hash sudah terisi, maka dilakukan proses hash lagi sampai ditemukan lokasi yang belum terisi.  Perbandingan antara metode chaining dan open addressingKeunggulan metode chaining dibanding open addressing:1. Lebih mudah diimplementasikan dengan efektif dan hanya membutuhkan struktur

data dasar.2. Metode  chaining  tidak rawan terhadap data-data yang berkumpul di daerah

tertentu. Metode  open addressing  membutuhkan algoritma hash yang lebih baik untuk menghindari pengumpulan data di sekitar lokasi tertentu. 

3. Performa menurun secara linier. Meskipun semakin banyak record yang dimasukkan maka semakin panjang senarai berantai, tabel hash tidak akan penuh dan tidak akan menimbulkan peningkatan waktu pencarian record yang tibatiba meningkat yang terjadi bila menggunakan metode open addressing.

4. Jika record yang dimasukkan panjang, memori yang digunakan akan lebih sedikit dibandingkan dengan metode open addressing.  Perbandingan waktu yang diperlukan untuk melakukan pencarian. Saat tabel mencapai 80% terisi, kinerja pada linear probing (open addressing)menurun drastis. Untuk ukuran record yang kecil, keunggulan metode open addressing dibandingkan dengan chaining diantaranya: Ruang yang digunakan lebih efisien karena tidak perlu menyimpan pointer

atau mengalokasi  tempat tambahan di luar tabel hash. Tidak ada waktu tambahan untuk pengalokasian memori karena metode open

addressing tidak memerlukan pengalokasian memori.

Page 11: Hashing

Tidak memerlukan pointer. Sebenarnya, penggunaan algoritma apapun pada tabel hash biasanya cukup cepat, dan persentase kalkulasi yang dilakukan pada tabel hash rendah. Penggunaan memori juga jarang berlebihan. Oleh karena itu, pada kebanyakan kasus, perbedaan antar algoritma ini tidak signifikan.

Metode-metode lainSelain metode-metode yang sudah disebutkan di atas, ada juga beberapa metode

lain diantaranya:1. Coalesced hashing

Gabungan dari chaining dan open addressing. Coalesced hashing menghubungkan ke tabel itu sendiri. Seperti open addressing, metode ini memiliki keunggulan pada penggunaan tempat dan cache dibanding metode chaining. Seperti chaining, metode ini menghasilkan lokasi penyimpanan yang lebih menyebar, tetapi pada metode ini record yang disimpan tidak  mungkin lebih banyak daripada ruang yang disediakan tabel.2. Perfect hashing

Jika record yang akan digunakan sudah diketahui sebelumnya, dan jumlahnya tidak melebihi jumlah ruang pada tabel hash,  perfect hashing bisa digunakan untuk membuat tabel hash yang sempurna, tanpa ada bentrokan.3. Probabilistic hashing

Kemungkinan solusi paling sederhana untuk mengatasi bentrokan adalah dengan mengganti record yang sudah disimpan dengan record yang baru, atau membuang record yang baru akan dimasukkan. Hal ini bisa berdampak tidak ditemukannya record pada saat pencarian. Metode ini digunakan untuk keperluan tertentu saja.4. Robin Hood hashing

Salah satu variasi dari resolusi bentrokan double hashing. Ide dasarnya adalah sebuahrecord yang sudah dimasukkan bisa digantikan dengan record yang baru jika nilai pencariannya (probe count – bertambah setiap menemukan termpat yang sudah terisi) lebih besar daripada nilai pencarian dari record yang sudah dimasukkan. Efeknya adalah mengurangi kasus terburuk waktu yang diperlukan untuk pencarian

B. LATIHAN

1. Latihan 1 (Program Linear Probing)

File CLOSE.TXT

Simpan dalam 1 folder dengan direktori file *.cpp

Page 12: Hashing

Syntax:

//Carolin Windiasri/110533430574/PTI off C

//berkas header#include <stdio.h>#include <conio.h>

int hash[50];int hashFunction(int data,int m)//deklarasi variabel pada hashFunction{

int h;h=data%m;while (hash[h]!=NULL){h++;h%=m;}return h;

}

int main()//deklarasi fungsi menu utama{

int m,data,i,h;//deklarasi variabelFILE *in=fopen("CLOSE.TXT","r"); fscanf(in,"%d",&m); while(fscanf(in,"%d",&data)!=EOF){

h= hashFunction(data,m); //h adalah hashvaluehash[h]=data; //hashvalue digunakan untuk index hashtable

}printf("index\tdata\n");for(i=0;i<m;i++) printf("%i\t%i\n",i,hash[i]);getch();

}//akhir program

Output:

Page 13: Hashing

2. Latihan 2 (Program Separate Chaining)

File CLOSE.TXT

Simpan dalam 1 folder dengan direktori file *.cpp

Syntax:

//Carolin Windiasri/110533430574/PTI off C

//berkas header#include <stdio.h>#include <conio.h>#include <stdlib.h>

struct chain{

//deklarasi variabelint data;chain *next;

}*hashchain[50],*newchain,*printchain,*tempchain;

int main()//deklarasi fungsi menu utama{

int m,data,i,h;//deklarasi variabel

Page 14: Hashing

FILE *in=fopen("CLOSE.TXT","r"); fscanf(in,"%d",&m); while(fscanf(in,"%d",&data)!=EOF){

newchain=(chain*)malloc(sizeof(chain)); //membuat chain baru newchain->data=data;

newchain->next=NULL;h=data%m;if(hashchain[h]==NULL) hashchain[h]=newchain; //jika pada

array [h]else // belum ada data{

tempchain=hashchain[h]; //jika sudah ada datawhile(tempchain->next!=NULL) tempchain=tempchain->next;tempchain->next=newchain;

}}for(i=0;i<m;i++){

if(hashchain[i]==NULL) printf("NULL\n");else{

printf("%d",hashchain[i]->data);printchain=hashchain[i];while(printchain->next!=NULL){printf("->%d",printchain->next->data);printchain=printchain->next;}printf("\n");

}}getch();

}//akhir program

Output :

Page 15: Hashing

C. TUGAS

1. Program linked list

Syntax :

//Carolin Windiasri/110533430574/PTI off C

//berkas header# include <iostream.h># include <string.h># include <stdio.h># include <conio.h>

struct Node//membentuk sebuah simpul pada linked list{

//deklarasi variabelchar data;Node* Next;//deklarasi node nextNode* Back;//deklarasi node back

};

# define MAX_ENTRIES 2//mendeklarasikan ukuran hashtableNode* HashTable[MAX_ENTRIES]={NULL};Node* Top[MAX_ENTRIES]={NULL};const char generate_hash_key(const char data){ return (data%MAX_ENTRIES);}//inisialisasi fungsivoid insert_element()//deklarasi fungsi untuk insert{ char data;

cout<<"\nInput Data "<<endl;//untuk input data cout<<"Masukkan sebuah nilai : "; cin>>data;

//proses input data baru char index=generate_hash_key(data); Node* Entry=new Node; if(!Entry) {

cout<<"\nFatal Error : Tidak dapat mengalokasikan data baru."<<endl;

getch( ); return; }

if(HashTable[index]==NULL) { Entry->data=data; Entry->Next=NULL; Entry->Back=NULL; HashTable[index]=Entry; Top[index]=Entry; } else { Entry->data=data; Entry->Next=NULL; Entry->Back=Top[index]; Top[index]->Next=Entry;

Page 16: Hashing

Top[index]=Entry; } getch( );}

void print_element( )//deklarasi fungsi untuk cetak data{ cout<<"\nCetak Hashing Table Data"<<endl; Node* Print;

//proses untu cetak hash for(int index=0;index<MAX_ENTRIES;index++) {

if(index<2)cout<<" HashTable[0"<<index<<"] : ";elsecout<<" HashTable["<<index<<"] : ";Print=HashTable[index];if(Print!=NULL)

{while(Print!=NULL){

cout<<Print->data;Print=Print->Next;if(Print!=NULL)cout<<" , ";}cout<<endl;}elsecout<<"-"<<endl;

} getch( );} int main()//deklarasi fungsi menu utama{

{ char Key=NULL; do {

system("cls");//tampilan programcout<<"*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*"<<endl;cout<<"* PROGRAM HASHING TABLE & LINKED LIST *"<<endl;cout<<"*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*";

cout<<"\nMenu Pilihan :"<<endl<<endl; cout<<"'A' : Input Data"<<endl; cout<<"'B' : Cetak Hashing Table Data"<<endl; cout<<"'C' : Exit"<<endl;

Input:cout<<"Pilihan Anda: \n";

cout<<""; Key=getche(); if(int(Key)==27 || Key=='c' || Key=='C')

break; else if(Key=='a' || Key=='A')//pilihan untuk input data.

insert_element();else if(Key=='b' || Key=='B')//pilihan untuk cetak hashing table.print_element();

else

Page 17: Hashing

goto Input;}while(1);}

return 0;}//akhir program

Output :

Page 18: Hashing

2. Membuat sebuah hash table linear probing collision solver dengan ukuran aray 9

File TUGAS2.TXT

Simpan file TUGAS2.TXT dalam 1 folder dengan direktori file *.cpp

Syntax :

//Carolin Windiasri/110533430574/PTI off C

#include <stdio.h>

Page 19: Hashing

#include <conio.h>

int hash[9];int hashFunction(int data,int m){

int h;h=(data+2)%m;

while (hash[h]!=NULL){

h++;h%=m;

} return h;}

int main()//deklarasi fungsi menu utama{

int m,data,i,h;FILE *in=fopen("TUGAS2.TXT","r");fscanf(in,"%d",&m);while(fscanf(in,"%d",&data)!=EOF){

h= hashFunction(data,m); //h adalah hashvaluehash[h]=data; //hashvalue digunakan untuk index hashtable

}printf("*=*=**=*=*=*=*=*=*=*=*\n");printf("* Linear Probing *\n");printf("*=*=**=*=*=*=*=*=*=*=*\n");printf("\nindex\tdata\n");for(i=0;i<m;i++) printf("%i\t%i\n",i,hash[i]);

getch();}//akhir program

Output :

Page 20: Hashing

3. Program hash table yang mempunyai menu

Syntax :

//Carolin Windiasri/110533430574/PTI off C

//berkas header# include <iostream.h># include <string.h># include <stdio.h># include <conio.h>

struct Node//membentuk sebuah simpul pada linked list{

//deklarasi variabelchar data;Node* Next;Node* Back;

};

# define MAX_ENTRIES 10//mendeklarasikan ukuran hashtabelNode* HashTable[MAX_ENTRIES]={NULL};Node* Top[MAX_ENTRIES]={NULL};const char generate_hash_key(const char data){ return (data%MAX_ENTRIES);}//INISIALISASI FUNGSIvoid insert_element()//deklarasi fungsi insert untuk input data{ char data;

cout<<"\nInput Data "<<endl; cout<<"Masukkan sebuah nilai : "; cin>>data;

char index=generate_hash_key(data); Node* Entry=new Node; if(!Entry) {

cout<<"\nFatal Error : Tidak dapat mengalokasikan data baru."<<endl;

getch( );

Page 21: Hashing

return; }

if(HashTable[index]==NULL)

{ Entry->data=data; Entry->Next=NULL; Entry->Back=NULL; HashTable[index]=Entry; Top[index]=Entry; } else { Entry->data=data; Entry->Next=NULL; Entry->Back=Top[index]; Top[index]->Next=Entry; Top[index]=Entry; } getch( );}

void delete_element()//deklarasi fungsi delete untuk hapus data{ char data; cout<<"\nHapus Data"<<endl; cout<<"Masukkan nilai yang akan di hapus : "; cin>>data; int flag=0; int index=generate_hash_key(data); Node* Print=HashTable[index];

if(Print!=NULL) {

while(Print!=NULL){

if(Print->data==data){

if(Print->Back==NULL){Node* Temp=Print->Next;

HashTable[index]=Temp;

Print->Next = NULL;delete Print;Print=Temp;}else if(Print->Next==NULL)

{Top[index]=Print->Back;Top[index]->Next=NULL;Print->Back = NULL;delete Print;}else{

Node* TempBack=Print->Back;Node* TempNext=Print->Next;TempBack->Next=NULL;

Page 22: Hashing

Print->Back=NULL;TempBack->Next=TempNext;TempNext->Back=NULL;Print->Next=NULL;TempNext->Back=TempBack;delete Print;}flag++;

}else

Print=Print->Next; }

if (flag) cout<<""<<flag<<" Data telah dihapus!!";

} if (!flag) cout<<"Data tidak ditemukan!!"<<endl; getch( );}

void print_element()//deklarasi fungsi print untuk cetak data{ cout<<"\nCetak Hashing Table Data"<<endl; Node* Print; for(int index=0;index<MAX_ENTRIES;index++) {

if(index<10) cout<<" HashTable[0"<<index<<"] : ";

elsecout<<" HashTable["<<index<<"] : ";Print=HashTable[index];if(Print!=NULL){while(Print!=NULL){cout<<Print->data;Print=Print->Next;if(Print!=NULL)cout<<" , ";}cout<<endl;}elsecout<<"-"<<endl;}

getch();}

void search_element()//deklarasi fungsi search untuk pencarian data{ char data; cout<<"\nPencarian Data"<<endl; cout<<"Masukkan nilai yang dicari: "; cin>>data; int flag=0; char index=generate_hash_key(data);

Node* Print=HashTable[index]; if(Print!=NULL) { while(Print!=NULL)

Page 23: Hashing

{ if(Print->data==data) flag++;

Print=Print->Next; } if(flag)

cout<<"Data ditemukan..."<<flag<<" Data."; }

if(!flag) cout<<"Data tidak ditemukan..."<<endl; getch();} int main()//deklarasi fungsi menu utama{

{ char Key=NULL; do {

system("cls");//tampilan programcout<<"*=*=*=*=*=*=*=*=*=*=*=*=*=*=*"<<endl;cout<<"* PROGRAM HASHING TABLE *"<<endl;cout<<"*=*=*=*=*=*=*=*=*=*=*=*=*=*=*";

cout<<"\nMenu Pilihan:"<<endl<<endl; cout<<"'A' : Input Data"<<endl; cout<<"'B' : Hapus Data"<<endl; cout<<"'C' : Cetak Hashing Table Data"<<endl; cout<<"'D' : Pencarian Data"<<endl; cout<<"'E' : Exit"<<endl;

Input:cout<<"Pilihan Anda: \n";

cout<<""; Key=getche( ); if(int(Key)==27 || Key=='e' || Key=='E')

break; else if(Key=='a' || Key=='A')//pilihan untuk input data

insert_element( ); else if(Key=='b' || Key=='B')//pilihan untuk hapus data

delete_element( ); else if(Key=='c' || Key=='C')//pilihan untuk cetak data

print_element( ); else if(Key=='d' || Key=='D')//pilihan untuk pencarian data

search_element( ); else

goto Input; } while(1);} return 0;}//akhir program

Output :

Page 24: Hashing
Page 25: Hashing

D. KESIMPULANHash Table adalah sebuah struktur data yang terdiri atas sebuah table dan

fungsi yang bertujuan untuk memetakan nilai kunci yang unik untuk setiap record (baris) menjadi angka (hash) lokasi record tersebut dalam sebuah tabel. Operasi Pada Hash Tabel

insert: diberikan sebuah key dan nilai, insert nilai dalam tabel find: diberikan sebuah key, temukan nilai yang berhubungan dengan key remove: diberikan sebuah key, temukan nilai yang berhubungan dengan

key kemudian hapus nilai tersebut getIterator: mengembalikan iterator, yang memeriksa nilai satu demi satu

Metode-metode pada hash yang sering digunakan adalah:1. Linear probing2. Quadratic probing / squared probing3. Double hashing

Metode-metode lainSelain metode-metode yang sudah disebutkan di atas, ada juga beberapa metode

lain diantaranya:1. Coalesced hashing2. Perfect hashing3. Probabilistic hashing4. Robin Hood hashing

Page 26: Hashing

E. DAFTAR RUJUKAN

- http://syazdi ayhodian.blogspot.com/2011/06/hashing.html

- http://fieyanh.blogspot.com/2012/01/struktur-data-hash-table.htmlModul

- Praktikum Algoritma dan Struktur Data. 2010. Modul XI HASHING.