Hashing Table & Binary Trees
Hashing Table & Binary Trees
Hashing
Table
Adalah data structure mengelompokkan objek dalam
kelompok sama. Dalam hashing sebuah string panjang akan di ubah ke dalam key
yang merupakan index pada hash table, menggunakan hash function untuk
mendapatkan key tersebut. Misalnya untuk mendapatkan informasi mahasiswa kita
hanya perlu NIM, karna kata kunci yang banyak maka diperlukan hashing agar
lebih cepat.
Intinya Hashing adalah mentransformasi string panjang
menjadi sebuah key dan index untuk mencari suatu infromasi di database.
Hash
Function
- Mid-square
Dalam teknik ini untuk mendapatkan
key-nya,dilakukan pangkat dua pada valuenya kemudian kita bisa mengambil nilai
tengah dari hasilnya. Teknik ini memiliki kemungkinan collision yang kecil karena
key yang dihasilkan cukup unik. Overflow bisa terjadi misalnya pada
perpangkatan 6 digit menjadi 12 digit, maka perlu menggunakan tipe data long long
int atau string.
Contoh: kita ambil 4 digit angka
yaitu 1234.
Kuadrat
dari 1234 adalah 1522756.
Kita
ambil 4 digit tengahnya yaitu 2275 yang akan menjadi key barunya.
Langkah
ini dapat dilakukan terus demi mendapatkan key yang unik.
- Division
Ini adalah teknik yang paling
sering digunakan, yaitu membagi string dengan operasi modulus sesuai besar
memori atau hash table yang telah ditentukan.
Contoh: diberikan ukuran hash table
5, dengan nilai 22.
Maka
22%5 = 2, dihasilkan key atau index hash tablenya 2.
- Folding
Dalam teknik ini kita memecah
string per bagian kemudian ditambahkan untuk mendapatkan key-nya.
Contoh: diberikan nilai 1234.
Dipecah
menjadi 12 dan 34 kemudian ditambahkan.
12
+ 34 = 46, maka key nya adalah 46.
- Digit Extraction
Teknik ini mengambil digit yang
sudah ditentukan menjadi keynya.
Contoh: diberikan digit 1234.
Diambil
digit ke 1 dan 3 maka keynya menjadi 13.
- Rotating Hash
Teknik ini dapat menggunakan ke-4
teknik diatas, kemudian dilakukan shifting untuk mendapatkan key yang baru.
Contoh: keynya 21121 menjadi 12112
setelah di shift.
Collision
Seperti artinya yaitu tabrakan, dimana kita mau
memasukkan sejumlah string tetapi ada beberapa string yang memiliki hash key
yang sama. Ada 2 cara untuk mengatasi collision, yaitu:
- Linear Probing
Melakukan searching untuk
mendapatkan slot selanjutnya yang kosong lalu menempatkannya disana.
- Chaining
Cara ini sama seperti konsep linked
list jadi string yang memiliki hash key sama akan diletakkan pada satu slot
yang sama namun saling terhubung.
void put(char key[], int value){
Data
*curr = newData(key, value);
int
index = getHash(key) % TABLE_SIZE;
if(head[index]
== NULL){
head[index]
= curr;
}
else{
Data
*temp = head[index];
while(temp->next
!= NULL){
temp
= temp->next;
}
temp->next
= curr;
}
}
Bisa dilihat bahwa konsepnya sama
persis dengan single linked list hanya menambahkan index untuk proses maping
atau peletakkan pada hash tablenya.
Contoh implementasi hashtable
menggunakan teknik divison:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define TABLE_SIZE 15
struct Data{
char
key[100];
int
value;
Data
*next;
}*head[100];
Data *newData(char key[], int
value){
Data
*temp = (Data*)malloc(sizeof(Data));
strcpy(temp->key,
key);
temp->value
= value;
temp->next
= NULL;
return
temp;
}
int getHash(char key[]){
int
hash = 0;
for(int
i=0; i<strlen(key); i++){
hash
+= key[i];
}
return
hash;
}
void put(char key[], int value){
Data
*curr = newData(key, value);
int
index = getHash(key) % TABLE_SIZE;
if(head[index]
== NULL){
head[index]
= curr;
}
else{
Data
*temp = head[index];
while(temp->next
!= NULL){
temp
= temp->next;
}
temp->next
= curr;
}
}
void display(){
for(int
i=0; i<TABLE_SIZE; i++){
if(head[i]
!= NULL){
Data
*temp = head[i];
while(temp
!= NULL){
printf("
(%s, %d) -> ", temp->key, temp->value);
temp
= temp->next;
}
printf("\n");
}
else{
printf("
~~ \n");
}
}
printf("\n");
}
Data *get(char key[]){
int
index = getHash(key) % TABLE_SIZE;
Data
*temp = head[index];
while(temp
!= NULL && strcmp(key, temp->key) != 0){
temp
= temp->next;
}
return
temp;
}
int main(){
put("A",
20);
put("TEST",
15);
put("B",
10);
put("C",
25);
display();
Data
*found = get("C");
if(found
== NULL) printf("No data found\n");
else
printf("%s %d\n", found->key, found->value);
return
0;
}
Pada implementasi diatas saya
melakukan hashing dengan menambahkan ASCII dari string kemudian untuk
mendapatkan keynya saya melakukan teknik divison dengan modulus sesuai ukuran
hash table yang sudah ditentukan yaitu 15. Saya juga membuat kondisi collision
yaitu dengan chaining, apabila dijalankan akan menampilkan A menunjuk TEST.
Blockchain
Hash adalah fungsi mengubah input menjadi output
yang terenkripsi yang sangat penting dalam manajemen blockchain dan
cryptocurrency. Untuk mencegah suatu data dibobol atau dilihat orang lain maka
diperlukan suatu kode unik, contoh nya pada chatting dimana teks chattingan
akan dienkripsi emnggunakan suatu kode yang hanya bisa diakses kedua pihak. Contoh:
SHA-256, fungsi satu arah yang mengubah teks dengan
panjang apa pun menjadi string 256 bit, ini adalah fungsi hashing kryptografi yang
outputnya hanya memberi tahu sedikit inputnya. Ini sangat berguna dalam
transaksi misalnya bitcoin.
Binary
Tree
Adalah data structure pohon dimana memiliki dua node
anak, biasanya dibedakan anatara kiri dan kanan. Node yang memiliki anak
disebut parent dan node teratas disebut root.
- Full Binary Tree
Memiliki 2 child setiap node dan
memiliki panjang path yang sama.
- Complete Binary Tree
Memilik 0 atau 2 child setiap node dan
boleh memiliki panjang path yang berbeda.
- Skewed Binary Tree
Memiliki 1 child setiap node.
- Binary Search Tree
Memiliki data yang terurut unutk
memudahkan pencarian kembali data tersebut.
Operasi pada binary tree terdiri dari:
- Create : membuat binary tree baru.
- Clear : mengosongkan binary ree.
- Empty : memeriksa kekosongan bianry treee.
- Insert : memasukkan node baru ke tree.
- Find : mencari root, parent, dan child pada tree.
- Update : mengubah isi dari node yang ditunjuk.
- Retrieve : mengetahui isi dari node yang ditunjuk.
- Delete Sub : menghapus suatu sub yang ditunjuk.
- Characteristic : mengetahui karakteristik dari tree seperti size, height, dan length.
- Traverse : menjalani masing-masing node pada tree sekali.
Kesimpulan
Keuntungan hashing adalah membandingkan dua file
tanpa harus melihat isi dari file tersebut, membandingkan nilai hash yang
dihitung sehingga pemilik bisa mengetahui jika mereka berbeda.
Keuntungan binary tree adalah susunan data structure
yang lebih baik dan searching yang cepat karena O(logn) dan bisa melakukan
traverse untuk mendapatkan data yang terurut.
Comments
Post a Comment