Thursday, March 19, 2020

Binary Search Tree

Binary Search Tree

Binary search tree dpt dimengertikan sebagai sebuah struktur data yang dapat kita gunakan untuk mengurutkan angka - angka. BST juga dapat dimengertikan sebagai binary tree yang dimana setiap node hanya memiliki value terkecil pada subtree kiri dan value yang terbesar pada subtree kanan serta node dari kedua subtree juga merupakan BST. Contohnya seperti yang berikut ini :

A tree having a right subtree with one value smaller than the root is shown to demonstrate that it is not a valid binary search tree
Binary tree kanan salah dikarenakan node dengan value 3 lebih kecil dari pada node key utama.

Akan dikatakan sebagai binary tree jika setiap node dari tree memiliki maksmimal 2 anak. Akan dikatakan sebagai search tree jika tree tersebut dapat mencari value dari 0(log(n)) kali.

Terdapat 2 operasi basic, yaitu insertion dan deletion :

Insertion
  • Dimulai dari awal (root).
  • Bandingkan value (x) yang ingin diinsert dengan root.
    • Jika lebih kecil, maka cek x dengan subtree kiri dan lakukan secara berulang(rekursif).
    • Jika lebih besar, maka cek x dengan subtree kanan dan lakukan secara berulang(rekursif). 
  • Lakukan sampai ditemukan node yang kosong untuk dimasukkan value x (sebagai leaf).
Jika dilakukan insert node dengan value 40 akan menjadi :
Deletion
  • Terdapat 3 kemungkinan dalam operasi deletion
    • Jika node yang dihapus adalah leaf (Langsung hapus dari tree).

Jika dilakukan delete pada node 40 akan menjadi :



    • Jika node yang dihapus memiliki 1 anak (Copy anak tersebut pada node yang akan dihapus dan hapus nodeny)
Jika dilakukan delete pada node 30 akan menjadi :



    • Jika node yang dihapus memiliki 2 anak (Cari inorder successor, yaitu value yang lebih besar daripada value node dan memiliki selisih paling kecil, lalu copy isi inorder successor pada node dan hapus node tersebut)
Jika dilakukan delete pada node 20 akan menjadi :




Tuesday, March 10, 2020

Hashing Table & Binary Tree

Hashing Table

Hash table adalah suatu data struktur yang menyimpan data secara teratur yang saling berhubungan. Pada sebuah hash table, data disimpan dalam bentuk array, dimana setiap value dari suatu data memiliki index value uniknya sendiri. Pengaksesan data menjadi lebih cepat jika kita mengetahui index dari data tersebut.

Maka, akan menjadi sebuah data struktur yang dimana operasi insertion dan search menjadi lebih cepat walaupun data tersebut memiliki ukuran yang besar. Hash table memakai sebuah array sebagai storage dan memakai teknik hash untuk membuat sebuah index dimana suatu elemen diinsert atau dicari.

Hashing

Hashing adalah teknik untuk mengconvert value key - key menjadi index - index array. Contohnya jika terdapat hash table dengan size 20 maka berlaku rumus H(x) = [ x % 20 ]. Jika list yang ingin diconvert adalah List = [ 21, 22, 23, 24, 25 ].

Maka pada hash table akan berisi seperti berikut :

Contoh pengkodingan insert dan delete:
Insert
void insert(int key, int data) {

   struct DataItem *item = (struct DataItem*) malloc(sizeof(struct DataItem));
   item->data = data;  
   item->key = key;

   int hashIndex = hashCode(key);

   while(hashArray[hashIndex] != NULL && hashArray[hashIndex]->key != -1) {
      ++hashIndex;
      hashIndex %= SIZE;
   }
   hashArray[hashIndex] = item;
}

Delete
struct DataItem* delete(struct DataItem* item) {
   int key = item->key;
   int hashIndex = hashCode(key);

   while(hashArray[hashIndex] != NULL) {
      if(hashArray[hashIndex]->key == key) {
         struct DataItem* temp = hashArray[hashIndex]; 
         hashArray[hashIndex] = dummyItem; 
         return temp;
      }
      ++hashIndex;
      hashIndex %= SIZE;
   }      
   return NULL;        
}

Binary Tree

Binary tree adalah suatu data struktur yang digunakan untuk menyimpan data. Suatu binary tree memiliki kondisi dimana setiap node paling maksimum memiliki 2 anak.
Terdapat 3 jenis binary tree yaitu:
  • Full Binary Tree:
    Binary Tree yang tiap nodenya (kecuali leaf) memiliki dua child dan tiap subtree harus mempunyai panjang path yang sama.
  • Complete Binary Tree:
    Mirip dengan Full Binary Tree, namun tiap subtree boleh memiliki panjang path yang berbeda. Node kecuali leaf memiliki 0 atau 2 child.
  • Skewed Binary Tree:
    yakni Binary Tree yang semua nodenya (kecuali leaf) hanya memiliki satu child.

Binary Search Tree

Binary search tree adalah struktur data yang mengadopsi konsep Binary Tree namun terdapat aturan bahwa setiap clild node sebelah kiri selalu lebih kecil nilainya dari pada root node. Begitu pula sebaliknya, setiap child node sebelah kanan selalu lebih besar nilainya daripada root node.
Terdapat 3 cara untuk melakukan penelusuran data (traversal) pada BST:
  • PreOrder : Print data, telusur ke kiri, telusur ke kanan.
  • InOrder : Telusur ke kiri, print data, telusur ke kanan.
  • Post Order : Telusur ke kiri, telusur ke kanan, print data.
Contoh pengkodingan push, search, pre order, in order, dan post order:
Inisialisasi

struct data{
int number;
data *left, *right;
}*root;

Push
void push(data **curr, int number){
if((*curr)==NULL){
(*curr) = (struct data *)malloc(sizeof data);
(*curr)->number=number;
(*curr)->left = (*curr)->right = NULL;
}else if(number < (*curr)->number){
push(&(*curr)->left, number);
}else if(number >= (*curr)->number){
push(&(*curr)->right, number);
}
}

Pre Order
void preOrder(data **curr){
if((*curr)!=NULL){
printf("%d -> ", (*curr)->number);
preOrder(&(*curr)->left);
preOrder(&(*curr)->right);
}
}

In Order
void inOrder(data **curr){
if((*curr)!=NULL){
inOrder(&(*curr)->left);
printf("%d -> ", (*curr)->number);
inOrder(&(*curr)->right);
}
}

Post Order
void postOrder(data **curr){
if((*curr)!=NULL){
postOrder(&(*curr)->left);
postOrder(&(*curr)->right);
printf("%d -> ", (*curr)->number);
}
}

Search
void search(data **curr, int number){

if((*curr)!=NULL){
if(number<(*curr)->number){
search(&(*curr)->left,number);
}else if(number>(*curr)->number){
search(&(*curr)->right,number);
}else{
printf("%d", (*curr)->number);
}
}else{
printf("None");
}
}

Blockchain & Hashing

Hashing merupakan suatu proses yang ada pada blockchain dimana proses tersebut memiliki input item dengan panjang suatu output item pada panjang yang tetap. Contohnya, blockchain digunakan dalam cryptocurrency dimana suatu transaksi yang memiliki panjang yang berbeda - beda akan diproses menggunakan hashing algorithm.

References:
https://www.tutorialspoint.com/data_structures_algorithms/hash_data_structure.htm
https://www.tutorialspoint.com/data_structures_algorithms/tree_data_structure.htm
https://www.geeksforgeeks.org/hashing-data-structure/
https://www.geeksforgeeks.org/binary-search-tree-set-1-search-and-insertion/
https://www.mahirkoding.com/struktur-data-binary-search-tree-bst/
http://new-funday.blogspot.com/2012/12/struktur-data-tree-dan-penjelasaanya.html
https://www.onlinehashcrack.com/how-to-hashing-in-blockchain-explained.php

Tuesday, March 3, 2020

Linked List II


Untuk pertemuan kedua, rangkuman yang dapat saya jelaskan adalah sebagai berikut.
  •         Single Linked List

Untuk memulai membuat linked list, pertama – tama didefinisikan struktur node untuk linked listnya.
    • Malloc
Dilanjutkan dengan pengunaan Memory Allocation untuk secara dinamik mengalokasikan node baru dan memberikan value kepadanya, lalu dihubungkan dengan linked list.



    • Push (Insert)
Push digunakan untuk menginsert value baru kepada suatu linked list. Dalam push dapat dilakukan dengan 3 cara yaitu pushHead, pushTail, dan pushMiddle. Pengkodingan untuk push pada bagian head dan tail adalah sebagai berikut :

























Contoh : Data = 1 2 3, jika dilakukan ingin mengisi 4 dengan pushHead data akan menjadi 4 1 2 3. Jika mengisi 4 dengan pushHead maka menjadi 1 2 3 4.
Untuk pushMiddle adalah sebagai berikut :

























Contoh : Data = 10 20 30, jika mengisi 15 dengan pushMiddle akan membuar data menjadi 10 15 20 30
    • Pop (Delete)
Pop digunakan untuk menghapus suatu value dari linked list. Untuk pengkodingan sebagai berikut :

























Contoh : Data = 1 2 3, jika dilakukan popHead dan popTail data akan menjadi 2.


  • Double Linked List
Seperti pada single linked list, dimulai dengan pendefinisian struktur node sebagai berikut.

    • Malloc

    • Push
























    • Pop



























Reference :
PPT Binus