Skip to main content

HASH TABLE & BINARY SEARCH TREE ? WHAT IS THAT?

HASH TABLE + BINARY SEARCH TREE ?
APAAN SIH ? ( in general  )


Halo semuanya ! Kali ini mimin Peik mau ngenalin kalian apa sih itu Hashing Table dan Binary Tree yang tentunya adalah topik lanjutan Data Structure . Para pembaca sebelumnya dituntut sudah mengerti cara kerja Data Structure secara dasar seperti protokol Linked List dan spesies-spesiesnya ya ! ^ 0 ^





A. Hashing Table / Hash Table

Apa sih ? Namanya makin aneh-aneh aja . Hash Table disini yang dimaksud bukan langsung menjadi hash yang kalian bayangkan MD5 , SHA1 dan sebagainya ya, lebih ke protokol cara kerjanya dulu !  ADALAH struktur data yang terdiri dari sebuah TABEL dan fungsi yang memetakan nilai KUNCI untuk setiap record dalam suatu angka . Ya intinya jadi kayak KAMUS gitu guys ! :o Jadi bisa diasumsikan bahwa nanti kalian tinggal memberikan sebuah (key) lalu kalian bakal diarahin ke entri tujuan yang mengandung key yang kalian kasih , sehingga AKSES DIPERMUDAH .


Hasil gambar untuk hash table data structure


Sebelumnya , kalian wajib tahu juga cara kerja Hashing nih !
Nah idenya sih seperti mengubah string menjadi suatu bilangan dengan suatu fungsi lalu di modulo.
Nanti kompleksitas untuk setiap operasi adalah O(k) dimana K = panjang string .
Kalau hashing-nya sendiri adalah protokol pengubah objek menjadi serangkaian angka/karakter bahkan sejenisnya.
Misal , seperti:


arr["inipeik"] = 5;
printf("%d\n", arr["inipeik"]);


Collision Case

Nah , kalau di Hash Table , keys nya akan diproses untuk menghasilkan suatu indeks baru pada elemen yang dibutuhkan . TAPI PERLU DIPERHATIKAN , kalau terdapat indeks yang sama yang dihasilkan dari hashing , dapat terjadi adanya collision . Untuk menghindari ini , harus dipilih hash function yang sesuai.
Solusi pertama adalah dengan menggunakan teknik CHAINING ( sumber dari https://www.programiz.com/dsa/hash-table )



Collision resolution in hash table

Jika fungsi hashing menghasilkan index yang sama pada elemen-elemen , elemen-elemen tersebut akan disimpan di INDEKS YANG SAMA dengan menggunakan doubly linked list .



// Implementing hash table in C

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

struct set
{
  int key;
  int data;
};
struct set *array;
int capacity = 10;
int size = 0;

int hashFunction(int key)
{
  return (key % capacity);
}
int checkPrime(int n)
{
  int i;
  if (n == 1 || n == 0)
  {
    return 0;
  }
  for (i = 2; i < n / 2; i++)
  {
    if (n % i == 0)
    {
      return 0;
    }
  }
  return 1;
}
int getPrime(int n)
{
  if (n % 2 == 0)
  {
    n++;
  }
  while (!checkPrime(n))
  {
    n += 2;
  }
  return n;
}
void init_array()
{
  capacity = getPrime(capacity);
  array = (struct set *)malloc(capacity * sizeof(struct set));
  for (int i = 0; i < capacity; i++)
  {
    array[i].key = 0;
    array[i].data = 0;
  }
}

void insert(int key, int data)
{
  int index = hashFunction(key);
  if (array[index].data == 0)
  {
    array[index].key = key;
    array[index].data = data;
    size++;
    printf("\n Key (%d) has been inserted \n", key);
  }
  else if (array[index].key == key)
  {
    array[index].data = data;
  }
  else
  {
    printf("\n Collision occured  \n");
  }
}

void remove_element(int key)
{
  int index = hashFunction(key);
  if (array[index].data == 0)
  {
    printf("\n This key does not exist \n");
  }
  else
  {
    array[index].key = 0;
    array[index].data = 0;
    size--;
    printf("\n Key (%d) has been removed \n", key);
  }
}
void display()
{
  int i;
  for (i = 0; i < capacity; i++)
  {
    if (array[i].data == 0)
    {
      printf("\n array[%d]: / ", i);
    }
    else
    {
      printf("\n key: %d array[%d]: %d \t", array[i].key, i, array[i].data);
    }
  }
}

int size_of_hashtable()
{
  return size;
}

int main()
{
  int choice, key, data, n;
  int c = 0;
  init_array();

  do
  {
    printf("1.Insert item in the Hash Table"
         "\n2.Remove item from the Hash Table"
         "\n3.Check the size of Hash Table"
         "\n4.Display a Hash Table"
         "\n\n Please enter your choice: ");

    scanf("%d", &choice);
    switch (choice)
    {
    case 1:

      printf("Enter key -:\t");
      scanf("%d", &key);
      printf("Enter data -:\t");
      scanf("%d", &data);
      insert(key, data);

      break;

    case 2:

      printf("Enter the key to delete-:");
      scanf("%d", &key);
      remove_element(key);

      break;

    case 3:

      n = size_of_hashtable();
      printf("Size of Hash Table is-:%d\n", n);

      break;

    case 4:

      display();

      break;

    default:

      printf("Invalid Input\n");
    }

    printf("\nDo you want to continue (press 1 for yes): ");
    scanf("%d", &c);

  } while (c == 1);
}


Solusi kedua adalah dengan menggunakan Open Addressing . Pada teknik ini , semua elemen akan disimpan di dalam hash table itu sendiri. Ukuran dari tabelnya pastinya harus lebih besar sama dengan total keys . Nah salah satunya adalah dengan menggunakan Linear Probing .


Intinya dia akan melakukan pengecekan pada slot selanjutnya dimana:

func(k, i) = (newfunc(k) + i) mod m

//newfunc adalah fungsi baru

Adapun quadratic probing dan double hashing technique untuk me-resolve collision case ini juga ^0^.

Blockchain Case

Pada blockchain , implementasi hash table ini sebenarnya dipakai , namun lebih distributif makanya disebut dengan DHT ( Distributed Hash Table ).
DHT disini protokolnya sama dengan Hash Table biasa yakni menyimpan suatu nilai key yang terdapat di berbagai jumlah nodes pada network dengan menggunakan deterministic algorithm , dimana algoritma ini akan menghasilkan output yang sama .

Hasil gambar untuk deterministic algorithm

Lalu juga digunakan adanya routing algorithm yang akan melakukan request pada hash table tanpa mengetahui setiap node di network. Contohnya saja yang dipakai adalah Chord DHT .


Hasil gambar untuk hash table in blockchain




B. Binary Search Tree

Nah , mimin harap kalian semua jadi mengerti apa itu Hash Table . Sekarang kita move on ke topik selanjutnya yakni Binary Tree ! Apa sih Binary Search Tree itu sendiri ?

Oke sebelum kalian paham BST ini , kalian harus tahu apa itu Tree?
Tree sendiri bisa dikatakan sebagai suatu struktur data berupa bentuk pohon terbalik yang menggambarkan hubungan hierarkis antar elemen.



Nah kalau pada Binary Tree sendiri , dia hanya memiliki maksimal 2 cabang saja.


Oke sekarang kita masuk pada pembahasan Binary Search Tree , konsepnya sama saja dengan Binary Tree namun terdapat aturan bahwa setiap child node di sebelah kiri harus lebih kecil nilainya dari pada root node dan vice-versa !




Pada Binary Search Tree , terdapat 3 cara unutk melakukan traversing ,yakni:
1. Pre-order = print data lalu traverse ke kiri lalu traverse ke kanan
2. In-Order =  traverse kiri , print data , lalu traverse kanan
3. Post-order  = traverse kiri, traverse kanan lalu print data













Sumber :
https://www.programiz.com/dsa/hash-table
https://www.geeksforgeeks.org/implementing-hash-table-open-addressing-linear-probing-cpp/
http://kupaskode.blogspot.com/2015/09/tentang-hashing.html
https://visualgo.net/id/hashtable?slide=11-4
https://www.geeksforgeeks.org/hashing-data-structure/
https://stackoverflow.com/questions/31930046/what-is-a-hash-table-and-how-do-you-make-it-in-c
https://stackoverflow.com/questions/26415908/whats-the-difference-between-distributed-hashtable-technology-and-the-bitcoin-b
https://www.slideshare.net/lmatteis/kudos-a-peertopeer-discussion-system-based-on-social-voting/4-distributed_hash_tablepeersblockchainkeykeygetkeyputkey_val
https://www.mahirkoding.com/struktur-data-binary-search-tree-bst/

Comments

Popular posts from this blog

Review Material

Review Material SUDAH KENAL DEKAT DENGAN LINKED LIST BELUM? Sebelum Anda membaca materi ini , ada baiknya anda sudah memahami  Data Structure  dasar seperti penggunaan  struct , array , malloc , free()    dan  pointer  .  Dengan begitu , Anda dapat memahami materi ini dengan baik ! A. Oke , jadi apa itu  Linked List  ? Linked List  adalah struktur data dinamis yang pengimplementasiannya memakai  pointer  yang mengarah pada suatu  nodes   ( elemen ) dan strukturnya menyesuaikan  size data  yang dibutuhkan atau dengan kata lain fleksibel dimana dapat membesar atau mengecil sesuai data yang telah diinput . Kok Mirip Array ? Terus apa bedanya ? Nah , prinsip  Linked List  bersama  Array  itu sama , tetapi ditinjau dari implementasi penggunaannya mau dimana , mau dipakai pada apa , dan seefektif apa pengaplikasiannya . Untuk lebih jelasnya , simak kutipan tabel di bawah ini ^_^ ! B. Jenis-jenis  Linked List  sendiri gimana ? Nah  Linked List  sendiri ada 3 "s