CA01-003


Hashing Table and Binary Tree
 Hashing adalah pengubahan dari sebuah string of characters ke sebuah ‘kunci’ yang mewakili string awal. Hashing dilakukan untuk memberikan index dan mengambil item yang ada di suatu database karena pencarian akan lebih cepat melalui hash ‘key’ nya yang sudah disingkat, dibandingkan mencari secara keseluruhan.
            Hashing juga biasa digunakan untuk mengencrypt sebuah data. Hash key yang dibentuk biasanya berdasarkan suatu hitungan matematika. Saqlah satu contohnya adalah dengan message. Dari message yang akan dikirim, akan dibuat sebuah hash, dan juga enkripsi untuk pesan itu sendiri. Pesan yang telah dienkripsi dan hash yang telah dibuat akan diterima di end yang lain. Setetalh diterima, maka receiver akan mendecrypt hash dan pesan tersebut. Setelah itu, receiver akan mengenerate hash sesuai dengan pesan yang didecrypt. Jika hash yang di generate receiver sama dengan hash dari sender, maka keduanya akan tersambung.
            Hash table adalah sebuah array/data structure yang menyimpan isi asli dari data tersebut, index table tersebut adalah hash key dari data tersebut, dan value nya adalah data asli yang membuat hash key.
            Hash Function adalah function untuk memetakan data dari beragam ukuran ke sebuah value yang berukuran sama, biasanya berupa integer. Value yang akan dikembalikan dari function tersebut adalah hash key.
            Dalam data structure, ada beberapa hash function yang sering digunakan.
1.      Division Method
Hash key dibuat melalui pembagian modulus dari data tersebut. Function memilike bentuk sebagai berikut:

H(a) = a %(mod) i
H(a) adalah hash key yang dihasilkan dari a. adalah data original yang telah diubah ke dalam angka, i adalah pembaginya. i disini biasanya memiliki sesuatu yang pasti, misalnya angka prima, ukuran dari hash table, ukuran memory yang digunakan, dll.
Dimisalkan ada data berupa 12,90.34.56 dan pembaginya adalah ukuran tablenya, dimisalkan 10. Maka hash key yang akan dibentuk adalah:
            Untuk 12, 12%10 = 2
            Untuk 90, 90%10 = 0
Untuk 34, 34%10 = 4
            Untuk 56, 56%10 = 6
Maka dari itu, 12 ada di indeks 2, 90 ada di indeks 0, 34 ada di indeks 4, dan 56 ada di indeks 6.
             


2.      Mid -Square Method

Hash key dibuat dengan mengubah type data yang ingin disimpan ke bentuk integer, lalu hasilnya dipangkat dua. Setelah dipangkat, diambil nilai tengah. Dimisalkan ada sebuah data dengan nilai integer 25 dalam kelompok data yang berisi 10. Maka 25^2 adalah 625. Dari situ, 2 diambil menjadi hash key/indeksnya. Maka dari itu:

h(25) = 2

3.      Folding

Hash key dibuat dengan membagi ke beberapa bagian integer tersebut. Setelah dilipat menjadi bagian yang ditentukan, hasil lipatan tersebut ditambah. jika hasil penambahan tersebut lebih besar dari banyaknya kelompok data, maka angka di depan tidak dimasukkan, sampai hasilnya lebih kecil dari jumlah kelompok data tersebut. Dimisalkan integer-nya adalah 1234567 dalam sebuah kelompok data berjumlah 100, dan akan dipecah menjadi 3 bagian:
           
            Maka hasil fold dari 1234567 adalah: 123, 456, 7
            Angka-angka tersebut dijumlahkan, yang hasilnya :586
            Maka hash key yang dihasilkan adalah 86 (5 tidak dihiraukan karena melebihi jumlah data)
            Maka : h(1234567) = 86

4.      Digit Extraction
Hash key dibuat dari digit integer yang sudah ditentukan. Dimisalkan integer-nya adalah 1732. Hash key yang dihasilkan ada diambil dari digit ke-2, ke-4, dan ke-6. Maka:

H(173259)= 729

5.      Rotating Hash
Hash key dibuat dari hasil untuk hash key lain. Kemudian, anngka dari hasil tersebut akan digeser digit-nya sesuai dengan keinginan. Misalkan diambil dari digit extraction di atas dan digeser 2 kali.
            h(173259) = 729.
            Maka h(173259) = 297
            Tentunya ada kemungkinan hash key yang dihasilkan memiliki nilai yang sama. Misalkan menggunakan digit extraction dengan digit ke-4 dan ke-3. Jika ada 2 integer yaitu 2812 dan 7512, keduanya memiliki hash key yang sama, yaitu 21. Hal ini dinamakan tabrakan/collision.
            Maka dari itu, hash function yang baik harus memiliki ciri-ciri sebagai berikut:
1.      Hash key yang dihasilkan dari hash values yang mirip memberikan hasil yang berbeda
2.      Hash function tersebut mudah dimengerti dan mudah untuk dicompute
3.      Hash key yang dihasilkan harus seragam dalam sebuah array/linked list
4.      Hash function yang baik seharusnya menggunakan semua input data

Namun, jika collision terjadi, ada beberapa method untuk menangani collision:
1.       Linear Probing

Linear probing adalah menggeser hash key yang sama ke indeks kosong yang tersedia. Maka, jika diambil dengan permasalahan di atas:

h(2812) = 21

h(7512) = 22

Linear Probing memiliki kerugian untuk search complexity. Jika ada integer 2812,3812,3412,2312,3612,9812 , semuanya memiliki hash key yang sama, yaitu 21, dalam sebuah kelompok data berjumlah 100, dan semuanya terletak di tempat yang berbeda-beda. Maka ketika dilakukan search untuk 9812, harus dilakukan iterasi dari 2312, dan bergeser astu langkah terus sampai menemukan 9812.
                                   
2.       Quadratic Probing

Quadratic Probing memiliki prinsip yang sama, tetapi dengan mengkalikan hash key tersebut dengan pangka yang dimulai dari angka 1, yang kemudian akan di modulus dengan jumlah data.
Formula kalkulasinya adalah sebagai berikut:

H(key)=(H(key)+x*x)%Ukuran data



                Maka h(2312) = (21+1*1)%20 = 1
                Maka h(2812) = (21+2*2)%20 = 5
                Maka h(3412) = (21+3*3)%20 = 10
                Maka h(3612) = (21+4*4)%20 = 17
                Maka h(3812) = (21+5*5)%20 = 6
                9812 tidak memiliki indeks karena (21+6*6)%20 adalaha= 17, yaitu sama dengan hash key 3612. Maka dari itu, Quadratic Probing memiliki beberapa syarat, yaitu:
1.       Tabel data harus berjumlah bilangan prima.
2.       Table data tidak boleh lebih penuh dari setengah kapasitasnya.

                3. Double Hashing           
                Double Hashing adalah menggunakan hash function yang lain, jika terjadi collision dalam fungsi hash yang pertama. Namun, ada beberapa syarat yang harus dipenuhi hash function sekunder. Syarat tersebut adalah:
1.                   Tidak  boleh memeriksa ke indeks 0
2.                   Indeks tersebut sudah dibentuk dan kosong

                4. Chaining
                Chaining adalah menjadikan data yang memiliki hash key yang sama ke sebuah linked list. Jika diambil data 2812,3812,3412,2312,3612,9812 yang memiliki jumlah data 20.  Semuanya memiliki hash key 21 dari digit extraction. Maka, integer tersebut akan dihubungkan menjadi satu linked list. Sehingga ketika dilakukan search dilakukan, hanya perlu dilakukan penggeseran dari integer yang memiliki hash key yang sama.
Konsep Hashing digunakan dalam Cryptocurrency. Hashing yang digunakan dalam Crypto adalah sebagai suatu ‘puzzle’ yang harus diselesaikan untuk mendapatkan akses ke block yang disimpan. Blok ini yang akan dikumpulkan dan disambungkan ke blockchain. Blok-blok tersebut memiliki tingkat enkripsi/hash yang berbeda-beda.
Binary Tree
                Tree dalam data structures adalah sebuah struktur yang memiliki tingkatan/hierarki. Konsep Tree sudah sering digunakan dalam sehari-hari, seperti dalam organisasi, makalah, jurnal, dan lain-lain. Dalam computer sendiri, tree digunakan dalam sistem folder dan subfolder.
 Beberapa konsep dalam tree adalah:
1.  Node paling atas dinamakan root                      2.  Garis penghubung antara parent dan keturunannya dinamakan edge                                                                       3.  Node yang tidak memiliki keturunan dinamakan leaf                                                                     
4.  Node yang berasal dari parent yang sama dinamakan sibling                                                               
5.  Degree adalah jumlah keturunan dari node utama/root                                                              6. Height/Depth adalaah degree maksimum dari sebuah tree                                                                                                                               
7. Ancestor adalah semua node sebelum node tersebut yang terhubung/ sedabgkan descendant adalah semua node setelah node tersebut
                Binary Tree sendiri adalah sebuah tree yang nodenya paling banyak memiliki 2 keturunan. Nama keturunan ini biasa dinamakan keturunan kiri dan kanan. Sama seperti tree, node yang tidak memiliki keturunan dinamakan leaf.
                Binary Tree memiliki beberapa jenis yaitu:
1.       Perfect Binary Tree, Binary Tree yang di setiap tingkat punya depth yang sama
2.       Complete Binary Tree, Binary Tree yang semua tingkatan terisi, memilik kemungkinan untuk tingkat terakhir tidak terisi semua, dan semua nodenya paling banyak di sisi kiri. Perfect Binary Tree termasuk Complete Binary Tree
3.       Skewed Binary Tree, Binary Tree yang paling banyak memilik satu keturunan di tiap node-nya.
4.       Balanced Binary Tree, Binary Tree yang memilik depth yang sama

Beberapa property dari Binary tree adalah:
1.       Node paling banyak di tingkat x adalah 2x
2.       Jumlah node maksumym yang dimiliki binary tree dengan height h adalah 2h+1-1
3.       Height maksimum dari sebuah binary tree dengan jumlah node n adalah n-1
4.       Height minimu dari sebuah binary tree dengan jumlah node n adalah 2log(n)
Binary Tree dapat diimplementasikan dengan array, maupun dengan linked list. Struktur dari binary tree adalah sebagai berikut:
                struct node {
                int data;
                struct node *left;
                struct node *right;
                struct node *parent;
};
struct node *root = NULL;
Konsep Binary Tree digunakan dalam infix, prefix, dan postfix. Konsep tersebut dinamakan Expression Tree.
Prefix    : *+ab/-cde
Postfix : ab+cd-e/*
Infix       : (a+b)*((c-d)/e)
















Binary Tree juga memiliki variasi lain. Binary tree ini memiliki NULL pointer di setiap nodenya, yaitu Threaded Binary Tree



Threaded binary tree memiliki 2 jenis berdasarkan arah threading dari pointer node tersebut adalah:
1.       One-way Threading Binary Tree, dimana node sebelumnya hanya dapat ditunjuk oleh salah satu mode keturunannya, jika ada 2 node.


2.       Two-way Threading Binary tree, dimana node sebelumnya dapat ditunjuk dua node keturunannya.




Komentar

Postingan populer dari blog ini

CA01-011 Heap & Tries

CA01-006

CA01-004