Thursday, March 19, 2020

Binary Search Tree


Sebelum kita masuk kedalam pengertian Binary Search Tree(BST) saya akan menjelaskan kembali apa sih Binary Tree itu? Binary Tree adalah pohon yang dimana setiap simpulnya hanya boleh memiliki dua anak/subtree kedua anak/subtree tersebut HARUS terpisahKegunaan dari binary tree ini sendiri adalah untuk mengurutkan data-data yang disusun secara ascending(dari kecil ke besar) maupun descending(dari besar ke kecil).

Sekarang kalian telah mengetahui apa itu Binary Tree, selanjutnya adalah Binary Search Tree(BST). Sebenarnya BST tidak berbeda dengan Binary Tree, Binary Search Tree atau biasa kita sebut dengan BST adalah struktur data yang mengadopsi konsep Binary Tree namun terdapat aturan bahwa setiap child 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.

Operasi-operasi yang terdapat dalam BST:
  • find(x) : untuk menemukan elemen x dalam BST.
  • insert(x) : untuk memasukan elemen baru x dalam BST.
  • remove(x) : untuk mengeluarkan/mendelete elemen x dalam BST.

Sekarang saya akan memberitahu kalian tentang aturan dalam memasukan/menginsert key dalam BST:
  1. Untuk root, kita bisa langsung memasukannya tanpa masalah.
  2. Untuk child, jika child yang kita masukkan nilainya lebih kecil daripada parent maka nilai tersebut akan dimasukan kedalam cabang/subtree kiri dan sebaliknya jika nilainya lebih besar daripada parent maka nilai tersebut akan dimasukkan kedalam cabang/subtree kanan.
untuk bagian deletion merupakan hal yang menurut saya lumayan ribet dan susah karena memiliki banyak sekali syarat.
contoh : 

25
/     \
20      30
/           \
10          45

Jika kita mau menghapus leaf(bagian dimana dia tidak memiliki cabang lagi biasanya berada di bagian paling bawah). Kita dapat langsung mendelete bagian tersebut dengan cara remove(45)/remove(10) nanti key tersebut akan langsung dibuang.

Tetapi yang membuat BST menjadi susah adalah jika kita ingin mendelete key yang masih memiliki cabang. Nah cara untuk mendeletenya adalah kita harus menggantikan key dengan leaf. contohnya:
55
/     \
30      70
/  \       \
10  40     85

Jika kita ingin menghapus key yang memiliki cabang kita harus menggantikannya dengan cabang yang memiliki nilai lebih besar. misalnya kita mau mendelete key 70 maka, remove(70) kemudian diganti dengan childnya yaitu 85.

Jika kita ingin mengganti root maka kita harus mengganti root dengan child yang memiliki nilai paling besar dari cabang root kiri berarti kita harus memilih cabang yang kanan dalam child kiri.
misalnya remove(55) lalu kita ganti dengan child kana dari cabang kiri sehingga root yang baru adalah 40.

berikut adalah contoh source code BST

#include <stdio.h>
#include <stdlib.h>

//inisialisasi struct
struct data{
 int number;
 //pointer untuk menampung percabangan kiri dan kanan
 data *left, *right;
}*root;

//fungsi push untuk menambah data
void push(data **current, int number){
 //jika pointer current kosong maka akan membuat blok data baru
 if((*current)==NULL){
  (*current) = (struct data *)malloc(sizeof data);
  //mengisi data
  (*current)->number=number;
  (*current)->left = (*current)->right = NULL;
 //jika tidak kosong, maka akan dibandingkan apakah angka yang 
 //ingin dimasukkan lebih kecil dari pada root
 //kalau iya, maka belok ke kiri dan lakukan rekursif 
 //terus menerus hingga kosong
 }else if(number < (*current)->number){
  push(&(*current)->left, number);
 //jika lebih besar, belok ke kanan
 }else if(number >= (*current)->number){
  push(&(*current)->right, number);
 }
}

//preOrder : cetak, kiri, kanan
void preOrder(data **current){
 if((*current)!=NULL){
  printf("%d -> ", (*current)->number);
  preOrder(&(*current)->left);
  preOrder(&(*current)->right);
 }
}

//inOrder : kiri, cetak, kanan
void inOrder(data **current){
 if((*current)!=NULL){
  inOrder(&(*current)->left);
  printf("%d -> ", (*current)->number);
  inOrder(&(*current)->right);
 }
}

//postOrder : kiri, kanan, cetak
void postOrder(data **current){
 if((*current)!=NULL){
  postOrder(&(*current)->left);
  postOrder(&(*current)->right);
  printf("%d -> ", (*current)->number);
 }
}

//searching data
void search(data **current, int number){
 //jika pointer current memiliki data
 if((*current)!=NULL){
  //cek, apakah datanya lebih kecil. Jika iya, belok ke kiri
  if(number<(*current)->number){
   search(&(*current)->left,number);
  //jika lebih besar, maka belok ke kanan
  }else if(number>(*current)->number){
   search(&(*current)->right,number);
  //jika sama dengan, maka angka ketemu
  }else{
   printf("Found : %d", (*current)->number);
  }
 //jika tidak ada data lagi (not found)
 }else{
  printf("Not Found.");
 }
}

void main(){
 push(&root, 11);
 push(&root, 22);
 push(&root, 13);
 push(&root, 15);
 push(&root, 9);
 inOrder(&root);
 printf("\n");
 preOrder(&root);
 printf("\n");
 postOrder(&root);
 printf("\n");
 search(&root,91);
 getchar(); 
} 

Terima kasih atas perhatiannya, jika ada yang kurang jelas atau kurang materinya, tolong langsung saja komen dibawah 😁. 

Nama : Reinhart Perbowo Pujo Leksono
NIM : 2301857254

Source : 
- powerpoint Data Structure di Binusmaya.

  








Wednesday, March 11, 2020

Hashing Table & Binary Tree

Halo semuanya! Sekarang saya ingin membahas singkat tentang Hashing Table dan Binary Tree. 

A. Hashing Table

Hashing tree adalah sebuah struktur data yang terdiri dari sebuah tabel dan fungsi yang bertujuan untuk memetakan nilai kunci yang unik untuk setiap baris menjadi angka lokasi record tersebut dalam sebuah tabel.
 Keunggulan dari hash table ini sendiri adalah pencarian dan waktu akses yang cepat. Tetapi ada kenegatifannya juga dari hash table yaitu jika record(sesuatu yang kita cari dalam hash table) memiliki angka yang sama, maka hal ini dapat menyebabkan bentrokan/collision antar record. Untuk mengatasi masalah ini dibutuhkan collision resolution policy(kebijakan resolusi bentrokan) untuk menentukan lokasi record dalam tabel sehingga tidak menyebabkan bentrokan antar record kembali.

Operasi yang digunakan dalam hash table:
  • insert: diberikan sebuah key dan nilai, insert nilai dalam tabel.
  • find: diberikan sebuah key, temukan nilai yang sesuai dengan key.
  • remove: diberikan sebuah key, temukan nilai yang sesuai dengan key, lalu hapus nilai tersebut.
  • getIterator: mengembalikan iterator, yang memeriksa nilai satu demi satu.
Cara untuk mendeklarasikan hash table :
typedef struct hashtbl {
hash_size size;
struct hashnode_s **nodes;
hash_size (*hashfunc)(const char *);
} HASHTBL;

dibawah ini merupakan struct yang digunakan untuk menunjuk kepada unsur pertama yang terhubung dengan daftar :
struct hashnode_s {
char *key;
void *data;
struct hashnode_s *next;
}


B. Binary Tree

Binary Tree adalah pohon yang dimana setiap simpulnya hanya boleh memiliki dua anak/subtree kedua anak/subtree tersebut HARUS terpisah. Kegunaan dari binary tree ini sendiri adalah untuk mengurutkan data-data yang disusun secara ascending(dari kecil ke besar) maupun descending(dari besar ke kecil).

Mungkin sampai disini kalian masih bingung cara memakai binary tree bagaimana. Oleh karena itu, saya akan memberikan contoh pemakaian binary tree.
Misalnya kita memiliki angka yang diacak yaitu 4 2 7 1 3. Aturan saat “insert” kedalam binary tree ini adalah dengan membandingkan data yang akan dimasukkan dengan kondisi root saat itu. Ok, mari kita telaah! angka pertama yang akan menjadi “root” adalah 4, maka angka tersebut akan menjadi paling atas. Lalu berikut nya 2, nah disini kita akan membandingkan 2 dengan 4, 2 lebih kecil dibanding 4, maka dia akan diletakkan dikir. Lalu 7, karena 7 lebih besar dari 4, maka 7 diletakkan disebelah kanan. Lalu 1, 1 lebih kecil dibandingkan 4 maka akan masuk ke sebelah kiri, namun karena sebelah kiri sudah memiliki “root” yaitu 2, maka 1 akan dibandingkan kembali dengan 2, karena 1 lebih kecil dibandingkan dengan 2, maka 1 diletakkan disebelah kiri dari 2. Begitu juga berlaku dengan 3. Binary tree akan memiliki bentuk seperti berikut :
  1. 4
  2. / \
  3. 2 7
  4. / \
  5. 1 3

Bagi kalian yang baru mengetahui tentang binary tree, berikut adalah istilah-istilah yang dimiliki oleh tree itu sendiri :
  • Parent : predecssor satu level di atas suatu node.
  • Child : successor satu level di bawah suatu node.
  • Sibling : node-node yang memiliki parent yang sama dengan suatu node.
  • Subtree : bagian dari tree yang berupa suatu node beserta descendantnya dan memiliki semua karakteristik dari tree tersebut.
  • Size : banyaknya node dalam suatu tree.
  • Height : banyaknya tingkatan/level dalam suatu tree.
  • Root : satu-satunya node khusus dalam tree yang tak punya predecssor.
  • Leaf : node-node dalam tree yang tak memiliki seccessor.
  • Degree : banyaknya child yang dimiliki suatu node.

Dibawah ini merupakan contoh dari Binary tree :

Image result for binary tree example


Berikut adalah penjelasan singkat dari saya, jika ada salah dan mungkin ada yang kurang penjelasannya bisa bertanya di kolom komentar. Terima kasih.

Nama : Reinhart Perbowo Pujo Leksono
NIM : 2301857254

Sumber:

Tuesday, March 10, 2020

Stack dan queue

Stack dan queue

Sekarang saya akan membahas singkat tentang stack dan queue. 

1. STACK
Dalam program yang berbasis stack, biasanya menggunakan sistem First In Last Out(FILO) karena input yang dimasukan itu menumpuk/stack. Dalam arti lain input pertama akan menjadi tail dan input terakhir akan menjadi head yang mana head yang baru/inputan terakhir akan menjadi elemen pertama yang dikeluarkan. 

Operasi-operasi yang ada di stack adalah : 
1. Push : digunakan untuk menembah item pada Stack pada Tumpukan paling atas.
2. Pop : digunakan untuk mengambil item pada Stack pada Tumpukan paling atas.
3. Clear : digunakan untuk mengosongkan Stack.
4. Create Stack : membuat Tumpukan baru S, dengan jumlah elemen kosong.
5. MakeNull : mengosongkan Tumpukan S, jika ada elemen maka semua elemen dihapus.
6. IsEmpty : fungsi yang digunakan untuk mengecek apakah Stack sudah kosong.
7. Isfull : fungsi yang digunakan untuk mengecek apakah Stack sudah penuh.

Berikut adalah gambar untuk memperjelas STACK.
Image result for gambar ilustrasi stack

2. QUEUE
Seperti yang kita ketahui, queue dalam bahasa Indonesia adalah antrian. Oleh karena itu, Program berbasis Queue biasanya memakai sistem First In First Out(FIFO). Dalam arti lain data pertama yang diinput akan menjadi data pertama yang dikeluarkan.

Operasi-operasi yang ada di queue adalah:
1. Create Queue (Q) : membuat antrian baru Q, dengan jumlah elemen kosong.
2. Make NullQ (Q) : mengosongkan antrian Q, jika ada elemen maka semua elemen dihapus.
3. EnQueue : berfungsi memasukkan data kedalam antrian.
4. DeqQueue : berfungsi mengeluarkan data terdepan dari antrian.
5. Clear : Menghapus seluruh Antrian
6. IsEmpty : memeriksa apakah antrian kosong
7. IsFull : memeriksa apakah antrian penuh.

Image result for gambar ilustrasi queue

Berikut adalah penjelasan singkat dari saya, jika ada salah dan mungkin ada yang kurang penjelasannya bisa bertanya di kolom komentar. Terima kasih.


Nama : Reinhart Perbowo Pujo Leksono
NIM : 2301857254
Sumber: