Heaps and Tries

HEAP

Heap merupakan complete binary tree dan biasanya diimplementasikan dalam bentuk array, meskipun bisa juga diimplementasikan dalam bentuk linked list.

Aplikasi Heap
- Menemukan nilai terkecil/terbesar, median, dan lain-lain
- Algoritma Dijkstra (Menemukan jalur terpendek dalam graf)
- Algoritma Prim (Menemukan minimum spanning tree)

Min Heap

Setiap node memiliki nilai yang lebih kecil dibandingkan anaknya. Elemen terkecil berada pada root dan elemen terbesar berada pada node leaf.

Fungsi pada Min Heap: find-min, insert, delete-min

Implementasi Min Heap pada Array

Biasakan index 1 dijadikan sebagai root.

Jika current node adalah x, maka
- Parent(x) = x/2
- Left-child(x) = 2*x
- Right-child(x) = 2 * x + 1


Find-min = nilai pada root(index ke-1) karena nilai paling kecil berada pada root.
Insert = Insert elemen baru di posisi akhir (index terakhir) pada heap, kemudian bandingkan node baru tersebut dengan parentnya. Jika current node lebih kecil dari parentnya, swap (tukar posisi) nilai mereka dan lakukan secara rekursif. Proses ini berhenti ketika current node lebih besar dari parentnya atau sudah mencapai root.
- Delete-min = Ambil nilai terakhir pada heap untuk menggantikan nilai pada root, kemudian bandingkan current node (dimulai dari root) dengan nilai anak-anaknya. Swap nilai current node dengan nilai anaknya yang paling kecil dan lakukan secara rekursif. Proses ini berhenti ketika current node lebih kecil dari pada kedua anaknya atau current node merupakan leaf node(tidak memiliki anak).

Contoh insert
Insert 20

Insert 5


Contoh delete-min (delete 7)

Max Heap

Setiap nilai node lebih besar dari pada nilai node anaknya. Elemen terbesar berada pada root. Max Heap mirip sama Min Heap, hanya saja berupa kebalikannya.

Min-Max Heap

Min-Max Heap memungkinkan kita untuk mendapatkan nilai terbesar dan terkecil sekaligus.

Di Min-Max Heap, elemen terkecil berada pada root dan elemen terbesar berada pada salah satu child dari root.

Insertion Min-Max Heap

Tambahkan node baru di akhir heap (index terakhir), kemudian:
- Jika node baru berada di level min, apabila parent dari node baru lebih kecil dari node baru, swap nilai kedua node tersebut dan bandingkan lagi current node dengan node grandparent (parent dari parent current node). Jika current node lebih besar dari grandparent, swap nilai kedua node. Namun apabila parent node baru lebih besar atau sama, lakukan yang sebaliknya. Lakukan secara rekursif hingga current node tidak memiliki grandparent.
- Jika node baru berada di level max, apabila parent node baru lebih besar, swap nilai kedua node dan bandingkan dengan grandparentnya. Kalau lebih kecil current nodenya, swap nilai kedua node. Apabila parent node baru lebih kecil lakukan sebaliknya. Lakukan secara rekursif.

Contoh insertion

Insert 50


Insert 5



Deletion Min-Max Heap

Delete elemen terkecil
- Ubah nilai root dengan elemen terakhir
- Kurangi jumlah elemen dalam heap
- Downheapmin dari root

Delete elemen terbesar
- Ubah anak paling besar dari root dengan elemen terakhir
- Kurangi jumlah elemen dalam heap
- Downheapmax dari root

Downheapmin
- Jika x merupakan elemen terkecil dari child atau grandchild current node:
  Jika x merupakan grandchild, apabila x lebih kecil dari current node maka swap nilai kedua node (grandchild dan current node) dan apabila sebaliknya, lakukan secara rekursif downheapmin dari x
  Jika x merupakan child, apabila x lebih kecil dari current node, maka swap nilai kedua node

Downheapmax: Kebalikan dari downheapmin secara relational operator

Contoh deletion (delete max)





TRIES

Tries merupakan tree tersusun yang biasanya digunakan untuk menyimpan karakter-karakter. Biasanya tries ini digunakan dalam kamus untuk membentuk dan menyusun kata-kata pada kamus. Selain itu, tries juga digunakan dalam auto-text, spell checker, dan lain-lain.

Root pada tries diisi dengan karakter kosong. Untuk setiap kata yang sudah terbentuk harus dikasih penanda stop.

Kata yang bisa dibentuk berdasarkan contoh diatas:
Algo, Api, Bom, Bos, Bosan, Bor

Implementasi Tries pada code

struct tries{
     char c;
     int stop;
     struct tries *edge[128];
} *root = 0;

root = (struct tries *) malloc (sizeof(struct tries));
root->c = '';
root->stop = 0;

Keterangan: c merupakan karakter yang disimpan dalam node, stop sebagai penanda stop dimana jika 1 berarti stop.

Insertion

struct tries* newnode(char huruf){
     struct tries* node = (struct tries*) malloc (sizeof(struct tries));
     node->c = huruf;
     node->stop = 0;
     for(int i = 0; i < 128; i++) node->edge[i] = 0;
     return node;
}

void insert(struct tries *curr, char *kata){
     if(curr->edge[*kata] == 0) curr->edge[*kata] = newnode(*kata);
     if(*kata == 0) curr->stop = 1;
     else insert(curr->edge[*kata], kata+1);
}

main function
char kata[100] = {"..."};
insert(root, kata);

Find

void find(struct tries *curr, int x){
     if(curr->stop == 1){
          kata[x] = 0;
          printf("%s", kata);
     }
     for( int i = 0; i < 128 ; i++){
          if(curr->edge[i] != 0){
               kata[x] = i;
               find(curr->edge[i], x+1);
          }
     }
}

main function
int i, n, oke;
struct tries *curr;
panjang = strlen(kata);
oke = 1;
curr = root;
for(i = 0; i < n && oke == 1; i++){
     if(curr->edge[kata[i]] == 0) oke = 0;
     else curr = curr->edge[kata[i]];
}
if (oke) find(curr, panjang);














Komentar

Postingan populer dari blog ini

AVL Tree

Hashing dan Hash Tables, Trees, dan Binary Trees (Week 4)

Review