Sabtu, 19 Juni 2021

Information Visualization Final Project


Projek Information Visualitation: Visualisasi Data Kasus Covid-19 di Jakarta

Tareq Abdurrashid Djalins – 2301933553

 Luiz Nazario Luiz Nazario - 2301848306

Joviandy Widyananda Joviandy Widyananda – 2301846225

Kathleen Febiola Susanto – 2301870110

 

Latar Belakang

Kasus Covid-19 di Indonesia yang terus meningkat, membuat setiap warga Indonesia khawatir akan kemungkinan terjangkit penyakit tersebut. Sebanyak 1 juta lebih warga Indonesia telah terinfeksi virus asal negara tirau bamboo tersebut dengan tingkat kematian sebanyak 0,03%. Untuk memantau perkembangan kasus dan memberikan informasi yang valid kepada masyarakat, visualisasi data yang baik sangat diperlukan. Berdasarkan latar belakang tersebut, kelompok kami memutuskan untuk membuat visualisasi dari data kasus covid-19 di Jakarta hingga Mei 2021.

Metode/Tools

Tools yang digunakan oleh kelompok kami adalah Tableau Desktop.

Hasil Visualisasi dan Penjelasan

Untuk visualisasi yang lebih mendetail per kotanya sebagai berikut. Kami membagi menjadi 6 dashboard yang berbeda dengan tampilan yang sama agar dapat dilihat secara lebih mendetail persebaran kasus dan status dari masing-masing daerah di kota Jakarta. Kasus positif divisualisasikan secara langsung menggunakan angka agar langsung to-the-point dan dapat secara jelas terlihat angka positif dari daerah tersebut. Begitu pula untuk angka dirawat, meninggal, self-isolation, dan angka kesembuhannya.

Diagram pie digunakan untuk memvisualisasikan perbandingan kasus per kecamatannya supaya lebih terlihat jelas perpotongan dari masing-masing kecamatan. Selain itu, pie tersebut dapat diselect untuk mengisolasi data perkelurahan disebelah kanannya. Visualisasi dari data per kelurahan sendiri dibuat menggunakan diagram bar yang berkelompok, supaya dapat terlihat pengelompokan dari kelurahan berdasarkan kecamatan mereka serta dapat dilihat secara langsung perbandingan dari masing-masing daerahnya secara lebih jelas, terutama karena satu kota terdiri atas banyak kelurahan.


Untuk visualisasi per kota, kami menggunakan diagram bar/diagram batang supaya dapat terlihat jelas perbandingan dari masing-masing kategorinya, baik kasus positif, sembuh, meninggal, isolasi mandiri, dan dalam perawatan.



Untuk Visualisasi yang menunjukkan peningkatan kasus positif Covid-19 yang terjadi pada bulan Januari hingga Juni terakhir pada 2021, kami menggunakan diagram garis untuk memberikan visualisasi yang saling bersambungan antar bulannya (Continuous). Untuk pemilihan warna, menggunakan color palette yang disediakan Tableau yaitu “Red-Gold”, namun antar garis mudah dibedakan dengan menggunakan label pada akhir garis. Label berupa Nama Kota dan Jumlah Kasus Positif di bulan Mei 2021. Apabila di-Hover, maka akan memunculkan display/tooltip berupa Nama kota, Bulan, Jumlah Positif, dan Persentase peningkatan dari bulan sebelumnya.



Visualisasi di atas (diagram batang) lebih memfokuskan terhadap besar peningkatan kasus positif yang terjadi di kota-kota DKI Jakarta. Color yang semakin merah menunjukkan peningkatan yang semakin besar sehingga dapat langsung menemukan dimana letak peningkatan kasus positif yang drastis. Axis vertical menunjukkan Kota, dan axis horizontal menunjukkan tanggal (Bulan) 2021.





Visualisasi dengan diagram lingkaran akan lebih memberikan gambaran kepada pembaca akan perbandingan dari jumlah kasus positif di akhir Mei pada setiap kota di DKI Jakarta. Dengan ini, pembaca bisa langsung mengetahui kota mana yang memiliki kasus positif terbesar atau terkecil. Pada label, juga terdapat persentase yang menunjukkan berapa persen jumlah positif dari total keseluruhan jumlah positif yang ada di DKI Jakarta.

 


Untuk visualisasi selanjutnya memeberi informasi mengenai total penduduk yang dirawat di Jakarta. Informasi yang kita temui bahwa Jakarta Timur merupakan kota dengan total penduduk yang dirawat terbanyak dengan total 6.241 penduduk, sedangkan Kabupaten Administrasi Kepulauan Seribu merupakan kota dengan total penduduk yang dirawat terdikit dengan total 14.

 


Visualisasi di atas lebih memfokuskan terhadap penduduk yang melakukan self-isolation yang terjadi di kota-kota DKI Jakarta. Color yang semakin gelap menunjukkan peningkatan yang semakin besar sehingga dapat langsung menemukan dimana letak peningkatan kasus positif yang drastis. Axis vertical menunjukkan Kota, dan axis horizontal menunjukkan total self-isolation.


Visualisasi diatas menunjukan total penduduk meninggal dari virus COVID-19 di seluruh kecamatan di Jakarta. Pada visualisasi sebelah kanan dapat diketahui untuk warna yang lebih gelap merupakan hasil dari total sembuh terbanyak dan warna yang lebih terang untuk sebaliknya. Axis vertical menunjukkan kecamatan, dan axis horizontal menunjukkan total meninggal.

Referensi

https://riwayat-file-covid-19-dki-jakarta-jakartagis.hub.arcgis.com/

https://bnpb-inacovid19.hub.arcgis.com/datasets/data-harian-kasus-per-provinsi-covid-19-indonesia/explore


Senin, 04 Mei 2020

DatStruct-10

AVL

Pada Binary Tree, ada sebuah kekurangan pada bagian insert yaitu jika kita insert dengan value 1-10 secara berurutan, maka untuk mencari nilai 10 perlu traverse dari 1-10, dengan kata lain 10x pencarian.

Untuk membuat pencarian dalam binary tree menjadi sebuah struktur data yang lebih efektif, kita menggunakan AVL tree, yaitu sebuah teknik develop yang di oleh Adelson, Velskii, dan Landi , dimana ketinggian dari left dan right subtree tidak lebih dari 1 node.

Intinya, setiap kali melakukan insertion, program ada mengecek apakah tree seimbang atau tidak.

Not Balanced

Balanced


Pada AVL Tree, kita menambahkan suatu attribut pada setiap node yang bernama 'BALANCE FACTOR", fungsinya sebagai indikator apakah node tersebut seimbang atau tidak.

Pada gambar di atas (Balanced),  Node 12 memiliki balance factor bernilai -1, karena,
Right's height: 2 | left's height: 3 
Right - Left = -1,
artinya, Balance Factor pada node 12 termasuk seimbang karena tidak lebih dari 1 atau kurang dari -1.

Pada gambar di atas (Not Balanced), Tree tersebut tidak seimbang karena Node 8 memiliki Balance Factor -2. Untuk menyeimbangkan Tree, AVL menggunakan teknik yang dinamakan "ROTATE".

Rotate dibagi menjadi 4 kasus (Berdasarkan posisi node paling bawah):

1. Left Left

*pada contoh di bawah, 8 dan 12 memiliki balance factor -2, namun yang di rotate adalah Node 8 terlebih dahulu, jadi yang di bawah diutamakan.

              12                                                                        12
             /    \                                                                      /    \
          8        18          ---------------------->                        5      18
         /  \         /            Right Rotate (8)                         /  \       /
       5    11    17                                                            4   8    17
      /                                                                             /       \
    4                                                                            2         11
    /                               
 2

2. Left Right

*tidak seimbang pada node 15 (-2), pada kasus ini lakukan:
  1. Left rotate pada left child of 15, yaitu 8
  2. Right rotate pada 15

                                                   (Hasilnya menjadi spt kasus 1)
              15                                                      15                                                      10               
             /    \                                                    /    \                                                  /       \             
          8        18         ----------------->           10     18     ------------->                      8         15           
         /  \                    Left Rotate (8)           /    \           Right Rotate(15)            /  \        /   \         
       7    10                                                 8     12                                             7     9   12    18   
             /   \                                               /  \                                                                               
           9     12                                          7    9                                                                                  
                                 

3. Right Right

                 15                                                                            17                               
                /    \                                                                       /         \                               
              8       17               ----------------->                         15        19                                                 
                      /    \             Left Rotate(15)                        /    \       /   \                                         
                    16    19                                                        8    16   18   20                             
                           /    \                                                                                         
                         18    20                                                                                                 
                                                                                                                         
4. Right Left
                                                                                       
           15                                                      15                                                         17
          /    \                                                   /     \                                                      /     \
        8      20           -------------------->        8      17        ----------------->                 15     20               
                /   \           Right Rotate (20)              /  \       Left Rotate (15)              /    \        \         
              17   22                                              16   20                                         8      16     22
             /                                                                   \       
          16                                                                    22       

*Ada kemungkinan meski sudah melakukan rotate, namun tetap tidak seimbang, maka lebih mudah jika menggunakan fungsi rekursif.

Minggu, 05 April 2020

datStruct-review

LINKED LIST
linked list adalah sebuah kumpulan data yang dapat berupa string, characters, numbers, etc.
linked list sendiri dalam pemrograman dapat dibandingkan dengan array, karena keduanya memiliki persamaan yaitu merupakan kumpulan dari data.
yang membedakan adalah linked list dibuat dalam sequence, yaitu misalnya data 1 berhubungan dengan data 2, data 2 berhubungan dengan data 3, dst.












































STACK

stack adalah data structure yang menyimpan kumpulan element, mirip seperti array dan linked list.
namun, operasi pada stack yaitu insert dan deletion hanya dapat dilakukan pada 1 sisi, yang umumnya disebut "TOP".

prinsip stack yaitu last-in first-out (LIFO)
operation pada stack:
1. push() : yaitu  untuk menambahkan suatu element / item paling atas
2. pop()  : untuk memindahkan / remove suatu element yang paling atas
3. top() : untuk mengembalikan nilai dari element yang paling atas

4 + 5 * 6 pada POSTFIX

1. push(4)
2. push(5)
3. push(6)
4. pop(5), pop(6), push(5*6)
5. pop(30), pop(4), push(30+4)

result = 34








QUEUE

apabila prinsip stack adalah last-in first-out (LIFO), pada queue prinsipnya adalah first-in first-out (FIFO). inilah yang membedakan stack dengan queue.

operation dalam queue:
1. push() : yaitu  untuk menambahkan suatu element / item ke antrian / queue paling belakang (rear)
2. pop()  : untuk memindahkan / remove suatu element pada antrian paling depan (front)
3. front() : untuk mengembalikan nilai dari item yang berada paling depan (front) dari antrian


QUEUE PRIORITY





















HASHING

Hashing adalah sebuah data struktur dengan fungsi bernama "Hash Function" yang dapat mempersingkat proses untuk mengakses suatu element di dalam list.

Hash table adalah table yang berfungsi untuk menampung value dan index dari sebuah key. value berisi string dan index berisi hashed key dari string tersebut.

Cara mendapatkan hashed key dari sebuah string adalah dengan menggunakan sebuah formula/metode yang mempersingkat string tersebut.

Sebagai contoh, terdapat sebuah list yang berisi 11, 12, 13, 14, 15. salah satu cara untuk mendapatkan Hashed Key dari masing masing data adalah dengan metode "Division", yaitu dengan fungsi
H(x) = [x % M),
x = key
M = value yang digunakan untuk membagi key, biasa berupa angka prima, size dari hash table, atau size dari memory yang digunakan.

Berikut adalah metode yang dapat digunakan sebagai Hash Function:

1. Mid-square

Men-kuadratkan value dari key, lalu mengambil nilai pada digit tengah sebagai hashed key.
contoh : key = 3121
              squared value = 9740641
              hashed key = 406

2. Division

3. Folding

Membagi key menjadi beberapa part, setiap part berisi paling banyak 2 digit, kemudian menjumlahkan setiap partnya.

4. Digit extraction

Menentukan digit berapa saja yang akan digunakan untuk mengambil nilai sebagai Hashed key.
contoh: digit 1, 3, 5. key = 123456. hashed key = 135.

5. Rotating Hash

Dimulai dengan menggunakan metode 1,2,3,4, dan merotate hashed key.
contoh: hashed key = 40989. rotate menjadi 98904.


Collision
yaitu sebutan apabila ada 2 key yang memiliki hashed key yang sama, istilahnya bertabrakan.
contoh:
jika ada hash function yang mengambil char paling pertama, maka string Andi dan Anton akan memiliki hashed key yang sama yaitu 0. (karena A=0, B=1, C=2, dst).

Untuk mengatasi collision, digunakan 2 cara, yaitu:

1. Linear Probing
Dengan mencari tempat yang kosong selanjutnya pada table.
Misal jika tadi Andi ditempatkan pada 0, maka Anton ditempatkan pada 1.
Namun linear probing sedikit tidak efektif karena dapat melakukan banyak perulangan untuk mencari value yang memiliki hashed key yang sama.

Misal jika urutan stringnya adalah Andi, Budi, lalu Anton, maka Andi=0, Budi=1, Anton=2.
sedangkan Anton seharusnya 0, maka akan dicari index 0 dan jika bukan anton, akan melakukan iterasi hingga menemukan value Anton.

2. Chaining
Metode ini menggunakan Linked List, jadi jika ada string Andi, Budi Anton
Andi=0, Budi = 1, Anton = 0 -> next.
































BINARY SEARCH TREE

Binary search tree(BST) adalah bentuk turunan dari binary tree. binary tree adalah tree yang hanya memiliki 2 node. pada BST, node kiri selalu bernilai lebih rendah dan node kanan selalu bernilai lebih besar.

*Dengan BST, segala insertion, deletion, dan search dapat dilakukan dalam Olog(N) (N=jumlah node pada tree). Akan berguna dalam kasus N nya berjumlah banyak.

*Karena semua tersusun dengan rapi, maka pencarian dapat dilakukan dengan mudah.

3 Operation utama dalam BST:
1. find()
2. insert()
3. remove()








INSERT()

insert(x,root)// node dimulai dari root karena root merupakan level paling dasar pada tree.



(t == null) // artinya node tersebut belum terpakai dan node baru akan disimpan di tempat itu sebagai leaf (left dan right = NULL)



//bila x lebih kecil dari node, maka lakukan insert dengan node->left sebagai node currentnya. begitu juga bila x lebih besar, maka node->right sebagai node current.






REMOVE()


untuk remove(), perlu diperhatikan apabila node yang dihapus bukan leaf (node memiliki 2 sub tree), maka node itu perlu di replace dengan kanan paling kecil atau kiri paling besar









//findMin(t->right) : untuk mencari node terkecil pada right sub tree
//node yang akan di remove di replace dengan temp
//kemudian lakukan remove pada node original yang digunakan pada temp
//deletion bisa juga menggunakan findMax(t->left) ,dengan kiri paling besar


//bila node yang ingin dihapus hanya memiliki 1 child, maka hubungkan parent dari node dengan child dari node










FIND()






//jika key lebih besar daripada current node, maka node yang dicari pasti berada di kanan current node
jika lebih kecil, maka di kiri.








DREAM MARKET ANSWER:

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


struct tnode{
char name[26];
int qty;
int price;
struct tnode *next;
struct tnode *prev;
};

struct tnode *head = NULL;
struct tnode *tail = NULL;

int generatePrice(){
srand(time(0));
return (rand()%200+1) * 100;
}

struct tnode *createNode(char *name, int qty){
struct tnode *node = (struct tnode*)malloc(sizeof(struct tnode));
strcpy(node->name,name);
node->qty = qty;
node->price = generatePrice();
node->next = NULL;
node->prev = NULL;
return node;
}



void push(char *name, int qty){
struct tnode *node = createNode(name, qty);
if(head==NULL && tail==NULL){
head = node;
tail = node;
return;
}

struct tnode *temp;
temp = head;
int x=0;
while(temp->name[x]<=name[x]){
if(strcmp(temp->name, name)==0){
printf("Product has been listed already\n");
return;
}
while(temp->name[x]==name[x]){
x++;
if(temp->name[x]>name[x]){
if(temp == head){
node->next = head;
node->prev = NULL;
head->prev = node;
head = node;
return;
}
temp = temp->prev;
node->next = temp->next;
node->prev = temp;
temp->next->prev = node;
temp->next = node;
return;
}
}
if(temp->next==NULL){
node->prev = tail;
node->next = NULL;
tail->next = node;
tail = node;
return;
}
temp = temp->next;
x=0;
}
if(temp == head){
node->next = head;
node->prev = NULL;
head->prev = node;
head = node;
return;
}
node->next = temp;
node->prev = temp->prev;
temp->prev->next = node;
temp->prev = node;
}

void addItem(){
char name[25];
int qty;
do{
printf("Product's Name [max 25 char] : ");
getchar(); scanf("%[^\n]",&name);
} while(strlen(name)>25);
if(name[0]>='a'&&name[0]<='z'){
name[0] = name[0]-32;
}

do{
printf("Products Quantity [max 999]  : ");
scanf("%d",&qty);
} while(qty>999);

push(name, qty);
printf("Press Enter to Continue . . .\n");
getchar();getchar();
}

void edit(){
struct tnode *temp;
char name[25];
int flag = 0;
int qty;

do{
temp = head;
printf("Product's Name [0 to cancel] : ");
getchar(); scanf("%[^\n]",&name);
if(name[0]>='a'&&name[0]<='z'){
name[0] = name[0]-32;
}
if(strcmp(name,"0")==0){
return;
} else {
while(temp!=NULL){
if(strcmp(name, temp->name)==0){
do{
printf("Products Quantity [max 999] : ");
scanf("%d",&qty);
} while(qty>999);
temp->qty = qty;
printf("Product has been updated\n");
printf("Press Enter to Continue . . .\n");
getchar();getchar();
return;
}
temp = temp->next;
}
}
printf("Product not found\n");
} while(true);

}

void remove(){
struct tnode *temp;
char name[25];
int qty;

do{
temp = head;
printf("Product's Name to be deleted [0 to cancel] : ");
getchar(); scanf("%[^\n]",&name);
if(name[0]>='a'&&name[0]<='z'){
name[0] = name[0]-32;
}
if(strcmp(name,"0")==0){
return;
} else {
while(temp!=NULL){
if(strcmp(name, temp->name)==0){
if(temp == head && temp == tail){
head = NULL;
tail = NULL;
free(temp);
} else if(temp == head){
head = head->next;
head->prev = NULL;
free(temp);
} else if(temp == tail){
tail = tail->prev;
tail->next = NULL;
free(temp);
} else{
temp->next->prev = temp->prev;
temp->prev->next = temp->next;
free(temp);
}
printf("Product has been deleted\n");
printf("Press Enter to Continue . . .\n");
getchar();getchar();

return;
}
temp = temp->next;
}
}
printf("Product not found\n");
} while(true);
}

void checkout(){
struct tnode *temp = head;
int totalPrice = 0;
int i=0;
printf("===================================\n");
printf("|   BILL                          |\n");
printf("===================================\n");
while(temp!=NULL){
printf("| %-31s |\n",temp->name);
printf("| %3d x %-6d  : %-15d |\n",temp->qty,temp->price, temp->price*temp->qty);
printf("|                                 |\n");
totalPrice += temp->price*temp->qty;
temp = temp->next;
i++;
}
printf("|         Total : Rp.%-10d   |\n",totalPrice);
printf("===================================\n");
printf("|       ~Kindness Is Free~        |\n");
printf("===================================\n");
}

void printMenu(){
struct tnode *temp = head;
printf("==================================================\n");
printf("|           WELCOME TO THE MINIMARKET            |\n");
printf("==================================================\n");
int i = 0;
while(temp!=NULL){
printf("| %3d. | %-25s | %-3d | %-5d |\n",i+1, temp->name, temp->qty, temp->price);
temp = temp->next;
i++;
}
printf("==================================================\n");
printf("1. Add Item\n");
printf("2. Edit Item\n");
printf("3. Delete Item\n");
printf("4. Checkout\n");
printf(">> ");
}



int main(){
int choose;

do{
printMenu();
scanf("%d",&choose);
switch (choose){
case 1:
addItem(); break;
case 2:
edit(); break;
case 3:
remove(); break;
case 4:
checkout(); break;
}
} while(choose!=4);

return 0;
}




Selasa, 24 Maret 2020

datStruct-4

BINARY SEARCH TREE

Binary search tree(BST) adalah bentuk turunan dari binary tree. binary tree adalah tree yang hanya memiliki 2 node. pada BST, node kiri selalu bernilai lebih rendah dan node kanan selalu bernilai lebih besar.

*Dengan BST, segala insertion, deletion, dan search dapat dilakukan dalam Olog(N) (N=jumlah node pada tree). Akan berguna dalam kasus N nya berjumlah banyak.

*Karena semua tersusun dengan rapi, maka pencarian dapat dilakukan dengan mudah.

3 Operation utama dalam BST:
1. find()
2. insert()
3. remove()








INSERT()

insert(x,root)// node dimulai dari root karena root merupakan level paling dasar pada tree.



(t == null) // artinya node tersebut belum terpakai dan node baru akan disimpan di tempat itu sebagai leaf (left dan right = NULL)



//bila x lebih kecil dari node, maka lakukan insert dengan node->left sebagai node currentnya. begitu juga bila x lebih besar, maka node->right sebagai node current.






REMOVE()


untuk remove(), perlu diperhatikan apabila node yang dihapus bukan leaf (node memiliki 2 sub tree), maka node itu perlu di replace dengan kanan paling kecil atau kiri paling besar









//findMin(t->right) : untuk mencari node terkecil pada right sub tree
//node yang akan di remove di replace dengan temp
//kemudian lakukan remove pada node original yang digunakan pada temp
//deletion bisa juga menggunakan findMax(t->left) ,dengan kiri paling besar


//bila node yang ingin dihapus hanya memiliki 1 child, maka hubungkan parent dari node dengan child dari node










FIND()






//jika key lebih besar daripada current node, maka node yang dicari pasti berada di kanan current node
jika lebih kecil, maka di kiri.

Senin, 16 Maret 2020

datStruct-3

1. HASHING

Hashing adalah sebuah data struktur dengan fungsi bernama "Hash Function" yang dapat mempersingkat proses untuk mengakses suatu element di dalam list.

Hash table adalah table yang berfungsi untuk menampung value dan index dari sebuah key. value berisi string dan index berisi hashed key dari string tersebut.

Cara mendapatkan hashed key dari sebuah string adalah dengan menggunakan sebuah formula/metode yang mempersingkat string tersebut.

Sebagai contoh, terdapat sebuah list yang berisi 11, 12, 13, 14, 15. salah satu cara untuk mendapatkan Hashed Key dari masing masing data adalah dengan metode "Division", yaitu dengan fungsi
H(x) = [x % M),
x = key
M = value yang digunakan untuk membagi key, biasa berupa angka prima, size dari hash table, atau size dari memory yang digunakan.

*Metode Division adalah Metode yang paling sering digunakan umumnya.

Berikut adalah metode yang dapat digunakan sebagai Hash Function:

1. Mid-square

Men-kuadratkan value dari key, lalu mengambil nilai pada digit tengah sebagai hashed key.
contoh : key = 3121
              squared value = 9740641
              hashed key = 406

2. Division

3. Folding

Membagi key menjadi beberapa part, setiap part berisi paling banyak 2 digit, kemudian menjumlahkan setiap partnya.

4. Digit extraction

Menentukan digit berapa saja yang akan digunakan untuk mengambil nilai sebagai Hashed key.
contoh: digit 1, 3, 5. key = 123456. hashed key = 135.

5. Rotating Hash

Dimulai dengan menggunakan metode 1,2,3,4, dan merotate hashed key.
contoh: hashed key = 40989. rotate menjadi 98904.


Collision
yaitu sebutan apabila ada 2 key yang memiliki hashed key yang sama, istilahnya bertabrakan.
contoh:
jika ada hash function yang mengambil char paling pertama, maka string Andi dan Anton akan memiliki hashed key yang sama yaitu 0. (karena A=0, B=1, C=2, dst).

Untuk mengatasi collision, digunakan 2 cara, yaitu:

1. Linear Probing
Dengan mencari tempat yang kosong selanjutnya pada table.
Misal jika tadi Andi ditempatkan pada 0, maka Anton ditempatkan pada 1.
Namun linear probing sedikit tidak efektif karena dapat melakukan banyak perulangan untuk mencari value yang memiliki hashed key yang sama.

Misal jika urutan stringnya adalah Andi, Budi, lalu Anton, maka Andi=0, Budi=1, Anton=2.
sedangkan Anton seharusnya 0, maka akan dicari index 0 dan jika bukan anton, akan melakukan iterasi hingga menemukan value Anton.

2. Chaining
Metode ini menggunakan Linked List, jadi jika ada string Andi, Budi Anton
Andi=0, Budi = 1, Anton = 0 -> next.



2. BINARY TREE

Binary Tree adalah bentuk dari tree dimana tiap node hanya dapat memiliki cabang maksimum 2 (left and right).

Contoh BINARY TREE
*Node paling atas disebut root.
jadi root pada gambar : 8

*Node yang tidak memiliki child disebut leaf.
jadi leaf pada gambar : 1,4,7,13

















Binary Tree dibagi lagi menjadi 4 type :

1. Perfect Binary Tree (termasuk complete binary tree, setiap level memiliki depth yang sama)
2. Complete Binary Tree (setiap level, kecuali terakhir, memiliki depth yang sama)
3. Skewed Binary Tree ( setiap node hanya memiliki 1 child)
4. Balanced Binary Tree (suatu leaf tidak melebihi leaf lainnya sebanyak 1)

Binary Tree dapat direpesentasikan dengan menggunakan Array dan Linked  List

*Array













*Linked List














Senin, 09 Maret 2020

datStruct-2

STACK

stack adalah data structure yang menyimpan kumpulan element, mirip seperti array dan linked list.
namun, operasi pada stack yaitu insert dan deletion hanya dapat dilakukan pada 1 sisi, yang umumnya disebut "TOP".

apabila di dalam linked list kita dapat insert middle, before, after, pada Stack kita hanya dapat melakukan insert head.

prinsip stack yaitu last-in first-out (LIFO)

analogi : seperti tumpukan piring, kita dapat memindahkan/menabahkan piring hanya dari paling atas.

stack dapat di representasikan dalam bentuk ARRAY dan LINKED LIST. dalam teknik pembuatan mungkin array lebih mudah, namun kelemahan array dibanding linked list yaitu pada array perlu mendeklarasikan jumlah dari element itu.

operation pada stack:
1. push() : yaitu  untuk menambahkan suatu element / item paling atas
2. pop()  : untuk memindahkan / remove suatu element yang paling atas
3. top() : untuk mengembalikan nilai dari element yang paling atas

Stack juga digunakan pada notasi postfix dan prefix.
infix : 4 * 10                  (normal)
prefix : * 4 10                (operator ditulis sebelum operand)
postfix : 4 10 *              (operator ditulis setelah operand)

prefix dan postfix akan memudahkan komputer dalam membaca operasi matematika.
kompleksitas pada infix : O(N^2)                  *N = panjang string
sedangkan pada postfix dan prefix : O(N)

dengan STACK, komputer dapat membaca notasi postfix dan prefix lebih cepat dibanding infix.

4 + 5 * 6 pada POSTFIX

1. push(4)
2. push(5)
3. push(6)
4. pop(5), pop(6), push(5*6)
5. pop(30), pop(4), push(30+4)

result = 34








kita juga dapat melakukan conversion dari infix  ke postfix dan prefix dengan menggunakan stack.

DEPTH FIRST SEARCH (DFS) yaitu sebuah algoritma untuk menelusuri atau mencari pada sebuah tree atau graph. pertama-tama, kita memulai dari root kemudian terus berjalan hingga ke cabang cabang berikutnya sebelum backtracking.

VISIT ORDER : A , C , B , E, D

QUEUE

apabila prinsip stack adalah last-in first-out (LIFO), pada queue prinsipnya adalah first-in first-out (FIFO). inilah yang membedakan stack dengan queue.

analogi : ketika mengantri bus, orang yang mengantri paling dahulu akan masuk ke dalam bus paling dahulu pula. orang paling terakhir akan masuk paling terakhir.

sama seperti stack, queue dapat dipresentasikan dengan ARRAY dan LINKED LIST.
apabila pada stack menggunakan "TOP", pada queue kita menggunakan "FRONT" dan "REAR".
setiap INSERTION akan dilakukan pada REAR, dan setiap DELETION akan dilakukan pada FRONT.

operation dalam queue:
1. push() : yaitu  untuk menambahkan suatu element / item ke antrian / queue paling belakang (rear)
2. pop()  : untuk memindahkan / remove suatu element pada antrian paling depan (front)
3. front() : untuk mengembalikan nilai dari item yang berada paling depan (front) dari antrian

apabila menggunakan array, maka dapat terjadi suatu  kondisi apabila kita melakukan push sebanyak size array, lalu pop sebanyak size array, lalu ketika kita push lagi data akan tersimpan diluar array tersebut. untuk menanggulangi hal ini, dapat digunakan CIRCULAR QUEUE

pada circular queue, digunakan wrap-around index L dan R.
jika R mencapai size maksimum dari array, maka R akan di set ke 0, begitupula dengan L.



BREADTH FIRST SEARCH (BFS) sama seperti DFS pada queue.
apabila DFS menggunakan STACK, pada BFS menggunakan QUEUE.




Selasa, 25 Februari 2020

DatStruct-1

linked list adalah sebuah kumpulan data yang dapat berupa string, characters, numbers, etc.
linked list sendiri dalam pemrograman dapat dibandingkan dengan array, karena keduanya memiliki persamaan yaitu merupakan kumpulan dari data.
yang membedakan adalah linked list dibuat dalam sequence, yaitu misalnya data 1 berhubungan dengan data 2, data 2 berhubungan dengan data 3, dst.

apabila dalam array kita menggunakan index untuk mengakses suatu data tertentu, pada linked list kita perlu memulai dari data paling awal, umumnya disebut HEAD dan terus berjalan ke data berikutnya hingga ke data yang diinginkan.

linked list bisa dibuat secara terurut maupun tidak terurut.

sebagai contoh, A ingin mengetahui keberadaan C, namun A tidak dapat menghubungi C karena A tidak memiliki kontak C. A memiliki kontak B yang kebetulan memiliki kontak C. maka A menghubungi B untuk mengetahui keberadaan C,

ini berarti linked list bekerja secara linear, dan mungkin memerlukan waktu yang lebih lama dibandingkan array.

keunggulan dari linked list adalah:
* INSERTION dan DELETION data dapat dilakukan dengan cepat

di dalam linked list, dapat diilustrasikan masing masing data memiliki 2 kotak berisi data dan link untuk ke data berikutnya. kotak ini disebut sebagai NODE.





node paling terakhir dihubungkan dengan NULL yang mengindikasikan akhir dari list



CIRCULAR SINGLE LINKED LIST
pada bentuk circular, node paling terakhir dihubungkan dengan node paling pertama (HEAD) sehingga membentuk suatu hubungan yang circular (seperti loop). dengan demikian, list tidak diakhiri dengan NULL.








DOUBLY LINKED LIST
pada bentuk ini, node tidak hanya dihubungkan dengan node yang berikutnya, tapi juga dengan node sebelumnya, membentuk hubungan 2 arah yaitu next dan previous. oleh karena itu, pada bentuk ini terdapat 2 NULL yaitu sebelum node pertama (HEAD) dan setelah node terakhir (TAIL)





CIRCULAR DOUBLY LINKED LIST
yaitu gabungan dari bentuk circular dan doubly, masing-masing node saling berhubungan 2 arah, termasuk HEAD dan TAIL.