Selasa, 28 April 2020

AVL Tree

Apa sih AVL Tree itu? AVL Tree merupakan subtipe dari Binary Search Tree (BST). AVL Tree diberi nama sesuai dengan nama penemunya, yaitu Adelson, Velskii, dan Landis. Lalu, apa bedanya dengan BST? Jadi, bedanya antara BST dan AVL Tree adalah AVL Tree memiliki kemampuan untuk menyeimbangkan secara dinamis sebuah BST agar tetap memiliki kompleksitas log (n). Mengapa demikian? BST memiliki kelemahan, kelemahan tersebut akan membuat kompleksitas pencarian suatu data dalam BST menjadi O(n). Contohnya kita akan menginputkan 5 bilangan angka berurutan dari angka 1. Maka yang terjadi adalah 2 menjadi anak kanan dari 1, 3 menjadi anak kanan dari 2, 4 menjadi anak kanan dari 3, dan 5 menjadi anak kanan dari 4. Jika kita akan mencari data bernilai 4. Maka program harus melakukan 4 kali looping. Hal inilah yang membuat kompleksitas dari BST tidak konsisten. Ketika input telah dimasukkan ke dalam tree, AVL Tree akan mengecek tinggi atau kedalaman dari anak kiri dan anak kanan. Apabila perbedaan tinggi tersebut lebih dari 1, maka akan dilakukan penyeimbangan. Berikut merupakan contoh dari tree yang seimbang dan tidak seimbang:

Pada tree ke-2, anak kiri dari C memiliki ketinggian 2 dan anak kanan dari C memiliki ketinggian 0 (tidak ada). Pada tree ke-3, anak kanan dari A memiliki ketinggian 2 dan anak kiri memiliki ketinggian 0. Karena perbedaan ketinggian pada tree ke-2 dan ke-3 adalah 2, maka akan dilakukan penyeimbangan.

Penyeimbangan

Penyeimbangan tree dapat dilakukan dengan metode rotasi. Dalam AVL Tree ada 2 cara rotasi, yaitu single rotation dan double rotation. Berikut merupakan contoh dari single rotaion:

Ketika node 12 dimasukkan, maka tree akan menjadi tidak seimbang. Mengapa tidak seimbang? Karena anak kiri dari node 30, memilki ketinggian 4 dan anak kanannya memiliki ketiggian 2. Perbedaan ketiggian tersebut lebih dari 1, maka akan dilakukan penyeimbangan.

Karena yang memiliki ketinggian lebih banyak adalah anak kiri dari node 30 dan dari node 22 yang miliki ketinggian lebih banyak adalah anak kiri juga, maka node 22 akan naik, node 30 menjadi anak kanan dari node 22, dan node 27 lepas dan menjadi anakkiri dari node 30.

Lalu, kapan double rotation akan digunakan? Doube Rotation akan digunakan apabila dalam kasus diatas, dari node 22 yang memiliki ketingan lebih banyak adalah anak kanan. Misalnya, node 12 kita ganti degan node 28 lalu kita tambahkan node 25. Maka perbedaan ketinggian anak kiri dan anak kanan dari node 30 akan menjadi 2. Oleh karena itu, node 27 akan naik dan node 22 menjadi anak kiri dari node 27. Lalu setelah itu, node 27 akan naik menggantikan posisi node 30 dan node 30 akan menjadi anak kanan dari node 27.

References

Senin, 06 April 2020

Summary of Data Structure First Half

Linked List

1. Pengertian Linked List
Linked list memiliki nama lain, yaitu seranai berantai adalah struktur data yang mengandung/memiliki urutan record data dimana setiap record data memiliki suatu tempat (field) yang menyimpan alamat dari record data selanjutnya. Elemen-elemen dari suatu data disebut Node.

2. Perbedaan dengan Array
Pada array, kita telah mendeklarasikan berapa jumlah yang akan digunakan nantinya, sedangkan linked list tidak. Linked list menggunakan malloc (memory allocation) untuk menambah/mereserve NODE. Selain itu, jika kita mereserve tempat untuk array, address dari setiap index akan berdekatan/memiliki kelipatan yang sama. Sedangkan dalam linked list tidak, karena linked list menggunakan malloc, maka NODE baru dapat memiliki address yang berjauhan dengan NODE sebelumnya (address tersebut dapat random, sesuai dengan memory yang sedang tidak digunakan oleh komputer).

3. Jenis-jenis Linked List
a) Single Linked List
Merupakan Linked List yang hanya tersambung dengan NODE depannya. Contoh ada NODE A, B, dan C. A terhubung ke B dan B terhubung ke C.
b) Double Linked List
Merupakan Linked List yang tersambung dengan NODE depannya serta NODE belakangnya. Contoh ada NODE A, B, dan C. A terhubung ke B dan sebaliknya, serta B terhubung ke C dan sebaliknya.
c) Circular Linked List
i. Circular Singly Linked List
Sama seperti Single Linked List, akan tetapi NODE paling belakang terhubung dengan NODE paling depan.
ii. Circular Double Linked List
Sama seperti Double Linked List, akan tetapi NODE paling depan terhubung dengan NODE paling belakang dan sebaliknya.

Stack and Queue

1. Pengertian Stack dan Queue
a) Stack
Stack atau tumpukan adalah cara penyimpanan dalam memori, dimana data yang dimasukkan pertama akan dikeluarkan terakhir. Sama seperti kita menaruh kue kedalam toples. Jika kita ingin memakannya, kue yang pertama kali kita makan adalah kue terakhir yang masuk ke dalam toples.
b) Queue
Queue atau antrian adalah cara penyimpanan dalam memori, dimana data yang dimasukkan pertama akan dikeluarkan pertama. Seperti jika kita mengantri disebuah restoran. Orang yang datang pertama kali akan dilayani terlebih dahulu.

Hashing Table

1. Pengertian Hashing
Hashing adalah sebuah teknik yang digunakan untuk menyimpan dan mengambil kunci dalam waktu yang cepat atau singkat. Dalam hashing, string akan diubah menjadi string yang lebih pendek atau kunci yang merepresentasikan string awal. Hashing dapat diartikan sebagai konsep pembagian kunci dalam array (hash table) dengan fungsi yang telah ditentukan sebelumnya (hash function).

2. Pengertian Hash Table
Hash table adalah sebuah tabel (array) dimana kita menyimpan string awal (original string). Biasanya ukuran dari hash table lebih kecil dari jumlah total string. Jadi ada kemungkinan beberapa string memiliki hash key yang sama.

3. Metode yang dapat digunakan untuk membangun fungsi hash
a) Mid square
Kuadratkan nilai dari key, lalu ambil nilai tengah dari hasil kuadrat tersebut. Contoh: key = 3121, key2 = 9740641, bagian yang diambil = 406
b) Division
Bagi string atau identifier dengan menggunakan operator modulus (seperti contoh diatas). Metode ini merupakan metode yang paling sering dipakai.
c) Folding
Partisi string / identifier menjadi beberapa bagian, lalu menambahkan bagian-bagian yang ada untuk mendapatkan hash key.
d) Digit Extraction
Digit yang telah ditentukan dari nomor yang diberikan dianggap sebagai alamat dari hash.
e) Rotating Hash
Menggunakan metode hash apapun (seperti division, atau folding). Setelah mendapatkan hash code/alamat dari hash method, lakukan rotasi. Rotasi dilakukan dengan shifting digits untuk mendapatkan alamat hash yang baru.

Trees and Binary Tree

1. Pengertian Trees dan Binary Tree
a) Trees
Tree biasa digunakan untuk mewakili data yang memiliki struktur hierarki antar elemen.
b) Binary Tree
Merupakan tipe spesial dari tree dimana setiap node antara tidak memiliki node, memiliki satu node atau dua node.

2. Bentuk atau jenis Binary Tree
a) Full Binary Tree
b) Complete Binary Tree
c) Skewed Binary Tree
d) Dll

References



Market Application Code

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
#include <conio.h>

int i=0;

struct node
{
int jumlah;
int price;
char item[15];
node *next, *prev;
}*head, *tail;


node* createNode(int banyak, char nama[])
{
node* temp = (node*)malloc(sizeof(node));
temp->jumlah = banyak;
strcpy(temp->item,nama);
temp->price = (rand()%(10000-1000+1))%1000;
temp->next = NULL;
temp->prev = NULL;
return temp;
}


void pushTail(int value, char nama[])
{
node* newData = createNode(value,nama);
if(head == NULL){
head = tail = newData;
}
else{
tail->next = newData;
newData->prev = tail;
tail = newData;
}
}


void ubah(char ganti[], int angka)
{
if(head == NULL)
{
return;
}
else if(head == tail)
{
head = tail = NULL;
node *currentNode = head;
currentNode->jumlah = angka;
}
else
{
node *currentNode = head;
while(currentNode != NULL)
{
if(strcmp(currentNode->item,ganti) == 0)
{
currentNode->jumlah = angka;
}
currentNode = currentNode->next;
}
}
}


void pop(char hapus[])
{
if(head == NULL)
{
return;
}
else if(head == tail)
{
head = tail = NULL;
free(head);
free(tail);
}
else
{
node *currentNode = head;
while(currentNode != NULL)
{
if(strcmp(currentNode->item,hapus) == 0)
{
if(currentNode == head)
{
currentNode->next->prev = NULL;
head = currentNode->next;
free(currentNode);
}
else if (currentNode == tail)
{
currentNode->prev->next = NULL;
tail = currentNode->prev;
free(currentNode);
}
else
{
currentNode->prev->next = currentNode->next;
currentNode->next->prev = currentNode->prev;
free(currentNode);
}
}
currentNode = currentNode->next;
}
}
}


void printAll()
{
node* currentNode = head;
i=1;

printf("| No. |    Product's name    | Quantity |   Price   |\n");
printf("=====================================================\n");
while(currentNode != NULL){
printf("| %-3d | %-20s | %-8d | %-9d |\n", i,currentNode->item,currentNode->jumlah,currentNode->price);
currentNode = currentNode->next;
i++;
}
}


int hitung()
{
int total=0;
node* currentNode = head;
while(currentNode != NULL){
total = currentNode->jumlah * currentNode->price;
currentNode = currentNode->next;
}
return total;
}


void space()
{
for (int i=0;i<30;i++)
{
puts("");
}
}


void pilih()
{
printf("| No. |    Product's name    |\n");
printf("==============================\n");
printf("|  1. | %-20s |\n","Chitoto");
printf("|  2. | %-20s |\n","Lais");
printf("|  3. | %-20s |\n","Dedek Crunch");
printf("|  4. | %-20s |\n","Nissan Wafer");
printf("|  5. | %-20s |\n","Oh-Reo");
printf("|  6. | %-20s |\n","Binusmilk");
printf("|  7. | %-20s |\n","Ricis Hewani");
printf("|  8. | %-20s |\n","Piringless");
printf("|  9. | %-20s |\n","Begal Marie");
printf("| 10. | %-20s |\n","Gud Taim");
puts("");
}


int main ()
{
srand(time(0));
int inp=0;
int makan=0;
int jumlah=0;
char ganti[20];
int angka=0;
char hapus[20];
char sudah;
int temp=0;
long int total=0;
while (inp!=6)
{
space();
printf("===========Smol Marked===========\n");
printf("=================================\n\n");
printf("1. Pilih item\n");
printf("2. Cek item\n");
printf("3. Ganti jumlah item\n");
printf("4. Delete item\n");
printf("5. Check out\n");
printf("6. Exit\n\n");
printf("Pilih angka dari 1 - 5: ");
scanf("%d",&inp); getchar();
switch(inp)
{
case 1:
{
space();
pilih();
do
{
printf("Pilih salah 1: ");
scanf("%d",&makan); getchar();
} while (makan > 10 || makan < 1);
printf("Banyaknya: ");
scanf("%d",&jumlah); getchar();
if (makan==1) pushTail(jumlah,"Chitoto");
else if (makan==2) pushTail(jumlah,"Lais");
else if (makan==3) pushTail(jumlah,"Dedek Crunch");
else if (makan==4) pushTail(jumlah,"Nissan Wafer");
else if (makan==5) pushTail(jumlah,"Oh-Reo");
else if (makan==6) pushTail(jumlah,"Binusmilk");
else if (makan==7) pushTail(jumlah,"Ricis Hewani");
else if (makan==8) pushTail(jumlah,"Piringless");
else if (makan==9) pushTail(jumlah,"Begal Marie");
else if (makan==10) pushTail(jumlah,"Gud Taim");
temp++;
break;
}
case 2:
{
space();
printAll();
getchar();
break;
}
case 3:
{
space();
if (temp == 0)
{
printf("Kamu belum beli apa-apa.. Trus ngerubah apa dongg?");
getchar();
}
else
{
printAll();
do
{
puts("");
printf("Yang mana yang mau diganti jumlahnya?\n");
printf("Masukkan namanya (case sensitive): ");
scanf("%[^\n]",ganti); getchar();
} while (strcmp(ganti,"Chitoto")!=0 && strcmp(ganti,"Lais")!=0 && strcmp(ganti,"Dedek Crunch")!=0 && strcmp(ganti,"Nissan Wafer")!=0 &&
strcmp(ganti,"Oh-Reo")!=0 && strcmp(ganti,"Binusmilk")!=0 && strcmp(ganti,"Ricis Hewani")!=0 && strcmp(ganti,"Piringless")!=0 &&
strcmp(ganti,"Begal marie")!=0 && strcmp(ganti,"Gud Taim")!=0);
do
{
puts("");
printf("Jumlahnya jadi berapa?\n");
printf("Masukkan angkanya: ");
scanf("%d",&angka); getchar();
} while (angka < 1);
ubah(ganti,angka);
space();
printf("Jumlah untuk %s telah diganti menjadi %d",ganti,angka);
getchar();
}
break;
}
case 4:
{
space();
if (temp==0)
{
printf("Kamu belum beli apa-apa :(");
getchar();
}
else
{
printAll();
do
{
printf("Yang mana yang mau dihapus?\n");
printf("Masukkan namanya (case sensitive): ");
scanf("%[^\n]",hapus); getchar();
} while (strcmp(hapus,"Chitoto")!=0 && strcmp(hapus,"Lais")!=0 && strcmp(hapus,"Dedek Crunch")!=0 && strcmp(hapus,"Nissan Wafer")!=0 &&
strcmp(hapus,"Oh-Reo")!=0 && strcmp(hapus,"Binusmilk")!=0 && strcmp(hapus,"Ricis Hewani")!=0 && strcmp(hapus,"Piringless")!=0 &&
strcmp(hapus,"Begal marie")!=0 && strcmp(hapus,"Gud Taim")!=0);
pop(hapus);
temp--;
space();
printf("Item sudah dihapus!");
getchar();
}
break;
}
case 5:
{
space();
if (temp==0)
{
printf("Beli dulu bro :D");
getchar();
}
else
{
printAll();
total = hitung();
printf("| Harga total                : %-20ld |\n", total);
do
{
printf("Sudah selesai? [Y / N]: ");
scanf("%c",&sudah); getchar();
}while (sudah != 'Y' && sudah != 'N' && sudah != 'y' && sudah != 'n');
if (sudah == 'Y' || sudah == 'y')
{
space();
printf("Kindness is Free!!");
exit(0);
}
else
{
break;
}
}
break;
}
case 6:
{
space();
printf("Terima Kasih!! :D");
break;
}
default:
{
space();
printf("Pilih angka dari 1 - 6!");
getchar();
}
}
}
return 0;
}