Thursday, March 19, 2020

Data Structure (IV) BST(Binary Search Tree) Explanation

Binary Search Tree

Binary Search Tree adalah salah satu data struct yang mensupport kecepatan dalam function searching , sorting, dan deletion . BST merupakan salah satu jenis Binary Tree hanya saja BST hasilnya pasti sudah tersorting dimana untuk node x pada Tree itu untuk bagian kiri untuk elemen yang mempunyai nilai lebih kecil daripada x sedangkan untuk bagian kanan berisi elemen yang lebih besar daripada nilai x.

Basic Operation of Binary Search Tree :
  1. Searching 
  2. Insertion 
  3. Deletion ( Merupakan operasi yang cukup komplek dan memerlukan ketelitian dalam pemrograman supaya hasil sesuai dengan yang di harapkan)
Point utama yaitu pada Binary Search Tree tidak ada node yang sama atau terduplikasi.

200px-Binary_search_tree.svg
Gambaran penjelasan bentuk Binary Search Tree ( BST)

Searching Operation :

Merupakan operasi yang relatif lebih mudah daripada operasi lainnya karena hanya  mencari suatu data pada BST. Jika data yang dicari lebih kecil daripada root maka root akan lanjut ke kiri tapi jika sebaliknya maka root akan lanjut ke kanan selama data ditemukan atau setelah pengecekan data BST dimana akan dilakukan secara recursive function.

struct node* Searchdata(struct node* Node,int angka){
if(Node==NULL||Node->nilai==angka){
return Node;
}
if(angka < Node->nilai){
return Searchdata(Node->left,angka);
}else if(angka > Node->nilai){
return Searchdata(Node->right,angka);
}
}

Insertion Operation :

Operasi ini untuk memasukan data baru ke dalam Binary Search Tree. Dimana program akan berlangsung sampai data baru masuk ke dalam Binary Search Tree. Lokasi / letak dari data yang dimasukan tergantung dari besar nilainya. Jika nilai data baru lebih kecil daripada current root maka data baru akan terletak di bagian kiri jika tempat bagian kiri dari current root kosong dan sebaliknya jika lebih besar maka data baru tersebut akan terletak di bagian kanan jika tempat bagian kanan dari current root itu kosong. Poin penting yaitu jika nilai data baru merupakan nilai yang sama dengan data yang telah ada di dalam BST maka data tidak akan masuk kembali ke dalam data BST.

struct node *Insertdata(struct node* Node,int angka){
if(Node==NULL){
return createNode(angka);
}
if(angka < Node->nilai){
Node->left = Insertdata(Node->left,angka);
}else if(angka>Node->nilai){
Node->right = Insertdata(Node->right,angka);
}
return Node;
}

Deletion Operation :

Dalam delete operation ada 3 kemungkinan yang akan ditemui yaitu :
  1. Jika data yang ingin dihapus terletak pada leaf dari BST : Secara simpel tinggal menghapus data tersebut dengan free();
  2. Data yang ingin dihapus memiliki satu child : Mengkopi data child ke node dan menghapus node childnya
  3. Data yang ingin dihapus memiliki dua child : Penjelasan simpelnya seperti cara untuk data yang punya satu child tapi sebelumnya perlu mencari dahulu inorder successor / inorder predecessor dan mengkopi data tersebut ke node lalu menghapus inorder successor/ inorder predecessor nya.
struct node *deletion(struct node *Node,int angka){
if(Node==NULL){
return Node;
}
if(angka < Node->nilai){
Node->left = deletion(Node->left,angka);
}else if (angka > Node->nilai){
Node->right = deletion(Node->right,angka);
}else{
if(Node->left == NULL || Node->right == NULL){
struct node *tempNode = NULL;

if(Node->left!=NULL){
tempNode = Node->left;
}else{
tempNode = Node->right;
}
//gak ada child
if(tempNode==NULL){
tempNode = Node;
Node = NULL;
free(tempNode);
//child ada satu
}else{
*Node = *tempNode;
free(tempNode);
}
//case ada 2 anak
}else{
struct node *tempNode = predecessor(Node);

Node->nilai = tempNode->nilai;

Node->left = deletion(Node->left,tempNode->nilai);
}
}
return Node; 
}

Referensi :
https://www.geeksforgeeks.org/binary-search-tree-set-1-search-and-insertion/
https://www.geeksforgeeks.org/binary-search-tree-set-2-delete/

Wednesday, March 11, 2020

Data Structure(Hash Table ,Tree, &Binary Tree)

Hashing Table, Tree,& Binary

Hashing :

      Hashing adalah suatu teknik dalam pemrograman untuk menyimpan dan mengambil data itu kembali secara cepat menggunakan keys atau suatu kunci pengenal suatu data yang disimpan. Dalam hashing menggunakan index untuk mengambil data / item yang diinginkan dalam suatu database karena lebih cepat mendapatkan datanya dikarenakan menggunakan keys yang merupakan value yang lebih kecil daripada data aslinya.

      Dalam data linier (array) yang menggunakan keys pada setiap datanya disebut Hash Table sedangkan function yang menggunakan hashing disebut Hash Function. Dalam penggunaannya bisa dikatakan bahwa Hashing merupakan gabungan dari array dan Linked list.

Hash Function :

      Hash Function memiliki beberapa methods :

  • Mid-square : Dengan mengkuadratkan atau pow() key yang didapat lalu mengekstrak r bits tengah dari hasil sebelumya.

  • Division : Dimana paling umum digunakan dan lebih sederhana pemrogramanya. Yaitu dengan dari key yang didapat kita menjumlahkan valuenya lalu memoduluskannya dengan size memory atau batas array penyimpanan yang digunakan.

  • Folding : Membagi key value menjadi beberapa bagian lalu menjumlahkan value yang sudah terbagi itu dan kemudian mengambil dua digit terakhir dari hasil penjumlahan bagian-bagian value tersebut.

  • Digit Extraction : Digit yang diambil dianggap sebagai hash address dan mengekstrak beberapa digit dari address tersebut dan menjadikannya hash codenya. 

  • Rotating Hash : Method yang menggunakan method lainnya terlebih dahulu ( seperti division dan mid-square) untuk mendapatkan hash code/address kemudian melakukan pertukaran seperti contoh : hasil hash : 123 -> menjadi 321.

Collision :

Dalam Hash Function akan sering ditemui permasalahan seperti yang terutama tabrakan/ collision dimana ada data yang mempunyai key yang sama dengan data sebelumnya sudah ada di database.

Secara umum ada dua cara mengatasi nya dengan :

  • Linier Probing ( Array ) : Mencari slot kosong berikutnya dan mengisi data di slot tersebut. 

  • Chaining ( Linked List ) :  Memasukan data dalam slot menggunakan chain list.
Linier Probing relatif akan memiliki complexity searching paling buruk daripada chaining apabila mendapatkan banyak data collision.

Implementation in BlockChain Technology :

Dalam BlockChain ada yang namanya ekripsi dimana yang pada Hashing menggunakan key yang kemudian digunakan untuk tidak hanya sebagai pencari data juga sebagai penyimpan rahasia suatu data. 

Panjang suatu hash tidak bisa ditentukan sehingga dapat mencegah seseorang untuk melakukan crack pada database

Seperti pada Bitcoin dimana juga digunakan untuk mengecek track atau history dari transaksi yang dilakukan juga disaat ada data transaksi baru yang masuk akan masuk terlebih dahulu ke proses mining untuk mencocokan  dan validasi dengan kode yang digunakan database sehingga keamanan nya pun lebih aman.

Tree 

    Tree adalah non linier data struct yang menunjukan tingkatan atau hierakhi antar data satu dengan lainnya seperti sisilah keluarga pada makhluk hidup. Node dalam tree tidak perlu untuk disimpan secara terus menerus dan bisa disimpan dimana saja dan dihubungkan menggunakan pointer.

Tree Concept :

  • Node paling atas disebut root
  • Garis yang menghubungkan node parent dengan anak adalah edge
  • Node paling akhir / tidak mempunyai node anak disebut leaf
  • Total sub node dari node tersebut disebut degree
  • Maximum degree dari node atau maximum level nya disebut height

Binary Tree Concept

Data structure dari Tree yang dimana masing-masing node maksimal memiliki node anak 2. Dimana kedua anak tersebut biasa disebut node kiri dan node kanan. Node yang tidak mempunyai node anak disebut leaf.

Tipe dari Binary Tree :

  • PERFECT binary Tree : Binary Tree dimana setiap level nya memiliki height/ jumlah node anak yang sama 
  • Complete binary Tree : Binary Tree dimana setiap levelnya memiliki height yang sama kecuali untuk node terakhir yang paling ujung
  • Skewed binary Tree : Binary Tree dimana setiap node nya mempunyai satu node anak
  • Balanced binary Tree : Binary Tree yang dimana tidak ada leaf yang lebih jauh ke root daripada ke leaf berikut nya.
Maximum height dari sebuah  h Tree adalah 2^(h+1) -1. Sedangkan untuk minimumnya adalah ^2 log(n).

Implementation Tree :

  1. Menggunakan Array dimana index 0 menjadi root nya dan index anak kiri adalah 2p+1 dan untuk index anak kanan 2p+2. Dan untuk mencari index parent (p-1)/2.
  2. Menggunakan Linked List 
struct node {
  int data;
  struct node *left;
  struct node *right;
  struct node *parent;
};
struct node *root = NULL;

Expression of Tree Concept :
  • Postfix
  • Infix
  • Prefix
Threaded Binary Tree concept :
Binary Tree merupakan threaded apabila semua anak kiri dan kanan yang awalnya akan menunjuk ke NULL point ke penerus dari node nya atau pendahulunya
  • One-way = Dimana setiap node nya akan menunjuk ke node penerusnya atau ke pendahulu ( Bisa node kiri maupun kanan) sehingga masih akan ada node anak kiri dan kanan menunjuk ke node yang sama.
Image result for threaded binary tree

  • Two-way = Sedangkan untuk Two-way dimana nodenya menunjuk ke node penerus dan pendahulu yang berlaku untuk node kiri dan kanan.
Image result for threaded binary tree two way


Tuesday, March 3, 2020

Data Structre (II) Linked List and Array List

  Stack Concept
   Stack adalah data structure yang penting dimana element nya disusun secara berurut yang saling menumpuk ke atas. Stack adalah data structure linier yang dapat diimplementasikan dalam Array List maupun Linked List. Penyusunan data dalam bentuk LIFO (Last in First Out).

   Stack dalam Array :
Stack dalam array mempunyai 2 variabel :

  • Top : Untuk menyimpan address dari suatu data / elemen terakhir
  • Max : Menyimpan batas banyak suatu baris data.
   Stack dalam Linked List :
Perbedaannya dengan Stack pada array list adalah dimana banyak datanya untuk array list harus dideklarasikan terlebih dahulu sebelum run suatu program. Dalam Linked List Stack ada dua Node yang dibutuhkan yaitu :

  • Satu untuk menyimpan data
  • Satu lagi untuk menyimpan alamat dari data lain atau berikutnya
Berikut ada 3 Stack Operation :

  1. Push () : Untuk menambahkan suatu data dalam suatu List
  2. Pop () : Merupakan suatu operasi penghapusan data dalam List sehingga data itu                         hilang dari daftar List tersebut.
  3. Top()/Peek() : Untuk mencari tau data mana yang berada diatas . Data awal pada                                     Stack merupakan data yang terletak paling bawah / pertama kali                                         masuk.
Penggunaan Stack Application :
  • Menukar balik urutan suatu data
  • Mengubah infix menjadi postfix dan sebaliknya
  • Mentracking masalah dari belakang
  • Digunakan dalam recursive function
  • Mengubah nilai desimal ke binary number
Queue
Merupakan suatu data secara berurut menyerupai Stack tapi berbeda cara urut dimana data pertama masuk maka data itu pun yang diproses terlebih dahulu. Seperti contoh dalam kehidupan sehari-hari : Berdiri mengantri untuk membeli tiket bioskop, menunggu kedatangan bis.

Queue dalam array List :
Mempunyai dua variabel yaitu; Depan , dan Belakang yang menunjuk posisi dimana dalam penghapusan dan pengisian data lebih lancar dan efektif.

Queue dalam Linked List :
Sebenarnya hampir sama dengan stack dalam Linked List hanya saja perbedaan dimana pointer pertamanya merupakan first / headnya, dan data akan berakhir pada rear/ tail.

Queue Operation :

  1. Push(x) = untuk memasukan data baru ke dalam suatu List.
  2. Pop(x) = untuk menghapus data yang sudah ada list menjadi keluar atau hilang dari                       List.
  3. Front(x) = Untuk melihat atau return elemen / data pertama dari List
Circular Queue :
Hampir sama dengan Queue hanya saja perbedaaanya pada data pertama dan akhir tidak menunjuk ke NULL melainkan menunjuk ke data lainnya / setiap data pada List harus menunjuk ke suatu elemen lain dalam suatu List.


Deque :
Merupakan suatu proses yang menggunakan Queue operation. Adalah List dimana elemen bisa dimasukan dan dihapus kembali ( lebih dikenal dengan head-tail Linked List).

Secara Kesimpulan pada Queue dan Stack adalah pada bentuk dari data nya dimana untuk Stack data yang pertama kali dimasukan menjadi data terakhir data suatu List sedangkan untuk Queue ,data pertama tetap menjadi data pertama dalam List tersebut.