Selasa, 17 Maret 2020

Binary Search Tree

Binary Search Tree


Hasil gambar untuk binary search tree
Binary Search Tree
Binary Search Tree adalah salah satu jenis struktur data yang memungkinkan pencarian secara cepat, melakukan sorting, serta kemudahan untuk memasukkan dan menghapus data.
Pada dasarnya Binary Search Tree adalah Binary Tree yang sudah disorting demi memudahkan pencarian data.

Konsep pada Binary Search Tree memiliki kemiripan dengan konsep Linked List, yaitu menggunakan pointer untuk menunjuk data tertentu. Jika pada Linked List terdapat head dan tail, pada BST menggunakan istilah root yang menunjuk kepada node yang paling awal dimasukkan/sebagai penentu awal. Untuk melakukan pencarian jika pada Linked List menggunakan next dan prev, namun pada BST menggunakan istilah left dan right. Left merujuk pada lokasi node yang nilainya lebih kecil dari posisi node yang dicek saat itu, sedangkan right merujuk ke lokasi node yang nilainya lebih besar. Hal yang perlu diperhatikan adalah tiap nilai dari node dalam BST tidak sama.

Operasi Pada Binary Search Tree

Pada dasarnya BST memiliki 3 metode dasar yaitu :

  • Search
Metode search merupakan salah satu alasan mengapa pada BST dilakukan secara berurutan(sorting). Dengan dilakukan secara sorting besar dan kecil maka proses pencarian dapat dilakukan secara efisien dibandingkan melakukan iterasi satu per satu untuk mencari sebuah data.

Cara kerja metode search ;

Hasil gambar untuk searching binary search tree
  1. Masukkan data yang ingin kita cari
  2. Pencarian akan dilakukan dari data teratas yang akan kita jadikan sebagai root
  3. Jika nilai data lebih kecil dari root maka root akan menjadi root->left dan jika lebih besar maka root akan menjadi root-> right
  4. Proses pencarian dilakukan sampai data ditemukan dan akan return root agar didapatkan datanya, jika tidak ditemukan bisa di return NULL.

Code :
Contoh searching nama

  • Insert
Insert adalah metode untuk memasukkan data ke dalam BST. Proses insertion di BST memperhatikan nilai dari data karena akan dipertimbangkan agar data tersorting dengan benar.

Cara kerja metode insert :

Hasil gambar untuk insertion in binary search tree


  1. Akan dilakukan pengecekan terlebih dahulu apakah di posisi root NULL atau tidak
  2. Jika iya maka dilakukan metode Insert
  3. Jika tidak akan dicek apakah nilainya lebih besar atau kecil dari root
  4. Hal tersebut dilakukan sampai ditemukan posisi root yang kosong
  5. Jika ketemu posisi kosong akan dilakukan langkah ke 2
Code :
Contoh insert untuk nama
  • Delete
Metode delete digunakan untuk menghapus node dalam BST.
Dalam metode delete harus dipertimbangkan node mana yang akan dihapus.
Ada 3 skenario yang perlu diperhatikan :
  1. Jika node yang akan dihapus tidak memiliki child maka hapus node tersebut.
  2. Jika node memiliki 1 child maka hapus node tersebut kemudian sambungkan child tersebut dengan parent dari node yang dihapus.
  3. Jika node memiliki 2 child maka carilah child terkanan dari subtree kiri node, kemudian rubahlah isi dari node dengan node child terkanan tersebut kemudian hapus node child terkanan tersebut (jika ada childnya maka sambungkan dengan skenario ke 2 secara rekursif).
Code :


Contoh Delete Nama



Selain 3 metode utama diatas, ada 1 lagi metode yang bisa digunakan pada BST yaitu metode Display untuk melihat isi dari BST tersebut.
Ada 3 cara yang biasa dipakai untuk display yaitu :

  • In Order : Cara display seperti ini digunakan  untuk menampilkan data secara urut (sorting)
Code :

void inOrder(Data *root){
if(root != NULL){
inOrder(root->left);
printf("%d\n",root->num);
inOrder(root->right);
}
}

  • Pre Order : Cara display dengan menampilkan urutan data dari paling atas (tetap dari kiri ke kanan)
Code :

void preOrder(Data *root){
if(root != NULL){
                printf("%d\n",root->num);
preOrder(root->left);
preOrder(root->right);
}
}

  • Post Order : Cara display mirip dengan in order namun yang di display bagian kanan dari subtree kiri terlebih dahulu (jika kiri sudah mentok, bergerak ke kanan sampai mentok baru diprint hasilnya)
Code :

void postOrder(Data *root){
if(root != NULL){
postOrder(root->left);
postOrder(root->right); 
                printf("%d\n",root->num);
}
}

Selasa, 10 Maret 2020

Hash Table dan Binary Tree

Hashing

Hashing adalah teknik yang digunakan untuk menyimpan dan mengambil keys dengan cepat.
Dalam hashing, sebuah string dirubah menjadi value yang lebih kecil atau key yang merepresentasikan string awalnya.
Metode Hashing digunakan untuk mengambil data dalam sebuah database karena lebih cepat untuk mengakses data menggunakan key daripada string originalnya.
Hashing sendiri dapat didefinisikan sebagai konsep mendistribusi key dalam sebuah array yang diberi nama Hash Table menggunakan fungsi yang disebut Hash Function.

Hash Table

Merupakan array untuk menyimpan string original. Index tabel merupakan hashed key, sedangkan isi index adalah string originalnya.
Ukuran hash table biasanya beberapa urutan lebih sedikit dibandingkan dari jumlah total string yang memungkinkan, jadi beberapa string bisa memiliki key yang sama.

Hash Function

Ada beberapa cara untuk meng-hash string menjadi key. Berikut adalah beberapa metode penting untuk membuat hash functions.


  • Mid-Square
Metode ini dilakukan dengan cara mengkuadratkan string (dirubah menjadi integer terlebih dahulu) kemudian menggunakan beberapa bit dari tengah hasil kuadrat untuk mendapatkan hash keynya.

Fungsi : h(k) = s

k = key
s = hash key yang didapat dari r bit hasil k kuadrat.

Contoh :

  • Division / Pembagian
Penentuan hash key dilakukan dengan membagi string menggunakan operator modulus (biasanya dibagi dengan size tablenya)

Fungsi ; h(z) = z mod M

z = key
M = nilai yang digunakan untuk membagi key

Contoh : Misalkan M = 12

hash key dari angka 30 adalah 6 (30 % 12 = 6)
hash key dari angka 40 adalah 4 (40 % 12 = 4)

  • Folding / Lipatan
Metode yang memecah-mecah string menjadi beberapa bagian, kemudian menjumlahkan bagian-bagiannya untuk mendapatkan hash key

Contoh :
Jika suatu hash table hanya memiliki 100 lokasi penyimpanan, maka data hanya bisa disimpan pada lokasi yang memiliki 2 digit saja, oleh sebab itu string/data dipecah menjadi 2 digit

untuk key 5786 akan dipecah menjadi 57 + 86 yang menghasilkan 143, karena hanya dipakai 2 digit maka yang terpakai adalah 43.
untuk ke 12345 akan dipecah menjadi 12 + 34 + 5 yang menghasilkan 51, maka lokasinya menjadi 51,

  • Digit Extraction
Penentuan lokasi hash dilakukan dengan cara menentukan digit-digit yang akan dijadikan sebagai alamat hash

Contoh :

Jika key = 235146
Digit yang akan diekstrak adalah digit ke 1, 4, 5, dan 6. Maka alamat hash key diatas adalah 2146.

  • Rotating Hash
Gunakan metode fungsi hash manapun yang sudah diterangkan diatas, kemudian hasil hash address tersebut akan dilakukan rotasi.
Rotasi dilakukan dengan menggeser digit-digit untuk mendapatkan alamat hash baru

Contoh :

Hasil hash address = 20021
Hasil rotasi = 12002

Collision

Collision adalah hal yang terjadi ketika ada beberapa data yang memiliki hash key yang sama.
Untuk menyelesaikan masalah tersebut, ada 2 metode yang dapat dilakukan :

1. Linear Probing
Mencari slot array yang kosong untuk menempatkan string

Contoh :
Hasil gambar untuk collision linear probing


2. Chaining
Meletakkan string didalam slot yang sama menggunakan linked list

Contoh :
Hasil gambar untuk collision chaining


Binary Tree

Binary Tree adalah struktur data yang menyerupai tree dimana tiap nodenya memiliki paling banyak dua children, yaitu left dan right. Node yang tidak memiliki children disebut leaf.

Jenis-jenis binary tree :

- Perfect Binary Tree : binary tree yang setiap tingkatnya memiliki kedalaman yang sama.
Hasil gambar untuk perfect binary tree

- Complete Binary Tree : binary tree yang pada tiap tingkatnya, kecuali yang paling terakhir terisi semua, semua nodenya terposisi paling kiri  sebisanya. Perfect Binary Tree termasuk Complete Binary Tree.
Hasil gambar untuk complete binary tree

- Skewed Binary Tree : binary tree yang tiap nodenya memiliki paling banyak 1 child. Secara tidak langsung, skewed tree akan membentuk relasi linked list biasa.

Hasil gambar untuk skewed binary tree

Penggunaan Binary Tree :
- Melakukan penghitungan operasi prefix dan postfix
- Melakukan searching dengan menggunakan BST (Binary Search Tree)


Aplikasi Hashing pada Blockchain

1. Industri Makanan

Saat ini banyak pusat perbelanjaan seperti Walmart bekerja sama dengan IBM untuk menggabungkan blockchain dalam sistem manajemen makanan mereka. Semakin banyak orang yang tidak memedulikan asal makanan mereka. Ini menyebabkan banyak masalah tidak hanya bagi konsumen tetapi juga pemasok.

2. Aplikasi Blockchain pada Cyber Security

Terdapat 3 fitur blockchain yang bisa membantu mencegah serangan keamanan cyber.
Fitur #1: Sistem yang Tidak Terpercaya
Sistem blockchain berjalan tanpa konsep ‘kepercayaan manusia’. Seperti pernah dituliskan Derin Cag dalam artikelnya yang berjudul Richtopia, “Ini mengasumsikan bahwa insider atau outsider dapat berkompromi dengan sistem kapanpun, karenanya ini bersifat bebas dari ‘etika manusia’.”
Fitur #2: Kekekalan
Blockchain membolehkan untuk menyimpan data dan mengamankannya menggunakan aturan kriptografi seperti digital signature dan hashing. Satu dari fitur terbaik adalah ketika data memasuki block dalam blockchain, data tidak bisa dirusak. Ini disebut ‘kekekalan’.
Fitur #3: Desentralisasi dan Konsensus
Blockchain adalah sistem terdistribusi yang bersifat desentralisasi. Blockchain terbuat dari banyak node. Untuk mengambil keputusan, mayoritas node harus mencapai konsensus dan mengambil keputusan. Sehingga, kita memiliki sistem demokrasi dan bukan figur otoritatif yang terpusat.
Untuk mempelajari lebih lanjut, dapat dilihat pada web berikut ini :

Selasa, 03 Maret 2020

Linked List Review

Materi 3 Maret 2020

Linked list adalah struktur data yang berisi kumpulan data yang terhubung berurutan satu dengan yang lain dengan menggunakan referensi/pointer.

Linked list umumnya dibagi menjadi 2 yaitu Single Linked List dan Double Linked List

Di tiap jenis Linked List terdapat metode push/insert yang berfungsi untuk memasukkan data dan metode pop/delete untuk menghapus node.

Untuk tiap metode sendiri terdapat beberapa jenis peletakan posisi sesuai yang diinginkan, tetapi pada umumnya ada 3 jenis yaitu di head, tail, dan mid.

Push Head : adalah metode memasukkan data ke posisi paling awal node.
Code :
Single Linked List



Double Linked List


Push Tail : metode memasukkan data dari belakang (data dimasukkan ke akhir linked list)
Code :
Single Linked List


Double Linked List


Push Mid : metode memasukkan data diantara head dan tail sesuai kriteria (pada umumnya menyerupai sorting)
Code:
Single Linked List


Double Linked List


Pop Head : metode untuk menghapus node paling terdepan/paling awal
Code :
Single Linked List


Double Linked List


Pop Tail : metode untuk menghapus node dari paling belakang/data terakhir
Code :
Single Linked List


Double Linked List



Pop Mid : metode menghapus node apabila data yang dipilih berada di linked list
Code :
Single Linked List



Double Linked List


Materi tambahan :

Selain Single Linked List dan Double Linked List, implementasi Linked List dalam dunia kerja ada berbanyak macam, jenis ini disebut Multi Linked List. Berdasarkan pengertiannya, Multi Linked List adalah Linked List yang mempunyai 2 atau lebih relasi antara nodenya, arah hubungannya tersebut bervariasi sesuai kebutuhan.
Sebagai contoh pada implementasi Video Game bisa saja tiap node memiliki relasi left, right, up, down atau bahkan hubungan 8 arah. Logicnya sama dengan Linked List seperti biasa namun disesuaikan dengan jumlah relasi yang diperlukan.