Pocket Book
STRUKTUR DATA Content: Bagas Prakoso Rafael Herman Yosef Ricky Kurniawan
Cover: Izzi Dzikri
KATA PENGANTAR Tidak ada kata lain selain ucapan terima kasih kepada Tuhan Yang Maha Esa. Tanpa rahmatNya, penulis
yakin
tidak
dapat
menyelesaikan
pembuatan pocketbook Struktur Data ini dengan baik. Pembuatan pocketbook ini ditujukan bagi semua pelajar khususnya mahasiswa/i Binus University yang sedang mendapatkan mata kuliah Struktur Data. Di dalam pocketbook ini akan dibahas Struktur Data yang akan dipakai secara lengkap melalui penjelasan yang sistematis. Setelah
membaca
pocketbook
ini,
penulis
berharap agar pembaca dapat lebih mengerti dan memahami tentang Struktur Data.
Penulis mengucapkan terima kasih kepada semua pihak terutama Mathematics and Statistics Department
Binus
University
yang
telah
membantu kami dalam proses perbaikan dan penyelesaian buku serta pihak lain yang tidak dapat disebutkan satu persatu namanya yang membantu dalam pembuatan pocketbook ini. Akhir kata, penulis menyadari bahwa pocketbook ini jauh dari sempurna dan mengharapkan kritik serta saran untuk pengembangan pocketbook.
Jakarta, 14 Juli 2016
Penulis
1
DAFTAR ISI Linked List .......................................... 2 Stack & Queue ................................. 21 Tree .................................................. 35 Binary Tree ....................................... 39 Binary Search Tree ........................... 45 AVL Tree .......................................... 56 2 – 3 Tree ......................................... 69 Red - Black Tree ............................... 82 Graph ............................................... 92 Heap, Trie, Hashing ........................ 109
2
TOPIK 1 Linked List
- Pengertian Linked List - Keuntungan dan Kerugian Linked List - Tipe dan Operasi Linked List
3 A. Pengertian Linked List Linked list adalah sebuah kumpulan linear dari elemen-elemen data. Elemen-elemen data ini disebut dengan nodes yang menunjuk ke nodes yang lain dengan menggunakan pointer nodes. Nodes ini biasanya berisi dengan data dan reference (bisa disebut link) ke node selanjutnya, sehingga nodes-nodes ini akan membentuk sebuah struktur yang linear. Struktur ini efisien untuk menambah atau menghapus elemenelemen yang berada di posisi manapun pada struktur ini. Linked list, bisa dilihat pada gambar di bawah ini. Perhatikan bahwa nodes-nya terdiri dari sebuah integer dan reference ke node yang lain.
4 B. Keuntungan dan Kerugian 1. Keuntungan a.) Linked list adalah struktur data dinamis yang bisa mengalokasi dan dealokasi memori saat program masih berjalan. b.) Penambahan dan penghapusan data cenderung mudah. c.) Struktur data linear seperti stack dan queue cenderung mudah dibuat. 2. Kerugian a.) Memiliki kecenderungan untuk menggunakan memori lebih banyak karena penggunaan pointer. b.) Nodes pada linked list harus dibaca secara berurutan (tidak bisa akses sembarangan). c.) Memiliki kesulitan saat membaca data dari belakang ke depan.
5 C. Tipe dan Operasi Linked List 1. Singly Linked List Singly linked list berisikan nodes yang memiliki reference ke nodes yang selanjutnya. Operasioperasi pada singly linked list mencakup penambahan dan penghapusan nodes. a.) Insert di Singly Linked List Anggap kita ingin membuat sebuah struct bernama ‘manusia’ yang berisikan variabel nama (tipe data string) dan umur (tipe data integer). Maka deklarasi struct-nya: struct manusia{ char nama[100]; int umur; struct manusia *next; }*head, *tail; Perhatikan bahwa struct manusia selain memiliki variabel yang disebutkan di atas, juga memiliki variabel yang lain. Variabel tersebut
6 adalah sebuah reference untuk menunjuk data yang lain. Untuk menambahkan data di singly linked list (biasa disebut Push), dapat dibagi menjadi 3 metode:  Jika ingin menambahkan node di awal (bisa disebut PushHead / PushFront / PushDepan): void pushDepan(char nama[], int umur){ struct manusia curr = (struct malloc(sizeof(struct manusia));
manusia*)
// di sini kita mendeklarasi struct baru bernama curr sebagai penyimpanan sementara data yang ingin kita tambahkan. strcpy(curr->nama,nama); curr->umur = umur; curr->next = NULL;
7 if(head==NULL) head = tail = curr; // untuk menambahkan node ke linked list yang kosong else{ curr->next = head; head = curr; // untuk menambahkan node ke linked list yang sudah ada isinya } }  Jika ingin menambahkan node di akhir void pushBack(char nama[],int umur){ struct manusia curr = (struct manusia*) malloc(sizeof(struct manusia)); strcpy(curr->nama,nama); curr->umur = umur; curr->next = NULL;
8 if(tail==NULL) head = tail = curr; else{ tail->next = curr; tail = curr; } }  Jika ingin menambahkan node di tengah Untuk penambahan node di bagian tengah, anggap kita akan menambahkan node tersebut sesuai dengan urutan umurnya dari kecil ke besar. void pushMid(char nama[], int umur){ struct manusia curr = (struct manusia*) malloc(sizeof(struct manusia)); strcpy(curr->nama,nama); curr->umur = umur; curr->next = NULL;
9 if(head==NULL) head = tail = curr; else{ if(curr->umur < head->umur){ // jika variabel umur dari data yang ingin ditambahkan lebih kecil dari umur head, maka kita melakukan Push Depan curr->next = head; head = curr; } else if(curr->umur > tail->umur){ // jika variabel umur dari data yang ingin ditambahkan lebih besar dari umur tail, maka kita melakukan Push Belakang tail->next = curr; tail = curr; } else{ struct manusia *temp = head; // membuat pointer baru bernama temp untuk meletakkan curr di tempatnya
10 while(temp->umur < curr->umur) temp = temp->next; // menggeser letak temp untuk meletakan node baru. curr->next = temp->next; temp->next = curr ; } } } b.)
Delete di Singly Linked List
ď&#x201A;ˇ Menghapus node di awal void popDepan(){ if(head){ if(head == tail){ // jika hanya tersisa satu data untuk dihapus free(head); head = NULL; } else{ // di sini, kita memindahkan head-nya ke head yang baru, lalu menghapus node head yang lama struct manusia *temp = head;
11 head = head->next; free(temp); } } }
ď&#x201A;ˇ Menghapus node di akhir void popBelakang(){ if(head){ if(head == tail){ free(head); head = NULL; } else{ struct manusia *temp = head; while(temp->next != tail) temp = temp->next; // sintaks ini digunakan untuk membawa temp ke node sebelum tail tail = temp; free(tail->next); }
}
}
ď&#x201A;ˇ Menghapus node di tengah
12 Untuk penghapusan node di tengah, kita akan melakukan pop untuk node dengan urutan ke-n dari head. void pop(int n){ if(head){ if(head == tail){ free(head); head = NULL; } else{ if(n == 0) popDepan(); // kita melakukan pop depan untuk n = 0, karena n=0 artinya head else{ curr = head; for(int i=0;i<n;i++) curr = curr->next; if(curr == tail) popBack();
13
}
}
else{ struct manusia *temp = curr->next; curr->next = temp->next; free(temp); } } }
Menghapus semua node void popAll(){ while(head){ popDepan(); } } 2. Doubly Linked List Dalam doubly linked list, setiap node memiliki reference ke node selanjutnya dan reference ke node yang sebelumnya. Reference ini biasa disebut ‘forward’ dan ’backward’ atau ‘next’ dan ‘prev’ (‘previous’).
14 a.) Insert Data di Doubly Linked List Untuk menambahkan data di doubly linked list, dapat dibagi menjadi 3 metode. Pada penambahan data ini kita akan menggunakan struct yang isi datanya sama, namun karena terdapat reference tambahan maka deklarasi struct-nya menjadi: struct manusia{ char nama[100]; int umur; struct manusia *next,*prev; }*head, *tail; 1.) Jika ingin menambahkan node di awal (bisa disebut PushHead/PushFront): void pushDepan(char nama[], int umur){ struct manusia curr = (struct manusia*) malloc(sizeof(struct manusia)); strcpy(curr->nama,nama); curr->umur = umur;
15 curr->next = curr->prev = NULL; if(head==NULL) head = tail = curr; else{ curr->next = head; head->prev = curr; head = curr; } }
2.) Jika ingin menambahkan node di akhir void pushBelakang(char nama[],int umur){ struct manusia curr = (struct manusia*) malloc(sizeof(struct manusia)); strcpy(curr->nama,nama); curr->umur = umur; curr->next = curr->prev = NULL; if(tail==NULL) head = tail = curr;
16 else{ tail->next = curr; curr->prev = tail; tail = curr; } } 3.) Jika ingin menambahkan node di tengah Untuk penambahan node di bagian tengah, anggap kita akan menambahkan node tersebut sesuai dengan urutan umurnya dari kecil ke besar. void pushMid(char nama[], int umur){ struct manusia curr = (struct manusia*) malloc(sizeof(struct manusia)); strcpy(curr->nama,nama); curr->umur = umur; curr->next = curr->prev = NULL; if(head==NULL) head = tail = curr; else{
17 if(curr->umur < head->umur){ curr->next = head; head->prev = curr; head = curr; } // jika variabel umur dari data yang ingin ditambahkan lebih kecil dari umur head, maka kita melakukan Push Depan else if(curr->umur > tail->umur){ tail->next = curr; curr->prev = tail; tail = curr; } // jika variabel umur dari data yang ingin ditambahkan lebih besar dari umur tail, maka kita melakukan Push Belakang else{ struct manusia *temp = head; while(temp->umur < curr->umur) temp = temp->next; temp->prev->next = curr;
18 curr->prev = temp->prev; temp->prev = curr; curr->next = temp; } } } b.)
Delete di Doubly Linked List
ď&#x201A;ˇ Menghapus node di awal void popDepan(){ if(head){ if(head == tail){ free(head); head = NULL; } else{ head = head->next; free(head->prev); head->prev = NULL; } } }
19 ď&#x201A;ˇ Menghapus node di akhir void popBelakang(){ if(head){ if(head == tail){ free(head); head = NULL; } else{ tail = tail->prev; free(tail->next); tail->next = NULL; } } }
ď&#x201A;ˇ
Menghapus node di tengah Untuk penghapusan node di tengah, kita akan melakukan pop untuk node dengan urutan ke-n dari head. void pop(int n){ if(head){ if(head == tail){ free(head); head = NULL; }
20 else{ if(n == 0) popDepan(); else{ curr = head; for(int i=0;i<n;i++) curr = curr->next; if(curr == tail) popBack(); else{ curr->prev->next = curr->next; curr->next->prev = curr->prev; curr->next = curr->prev = NULL; free(curr); curr = NULL; } } } } }
ď&#x201A;ˇ
Menghapus semua node void popAll(){ while(head){ popDepan(); }
}
21
TOPIK 2 Stack & Queue
-
Pengertian Stack
-
Depth First Search
-
Pengertian Queue
-
Breadth First Search
22 A.
Pengertian Stack
Untuk analoginya, stack bisa diibaratkan seperti tumpukan cucian piring. Jika ingin menambahkan piring kotor, maka kita akan menempatkannya di paling atas. Sementara jika kita ingin membersihkan piringnya, maka kita harus mengambil piring paling atas. Dengan penjelasan di atas, maka kita bisa menyimpulkan bahwa: 1. Penambahan data (push) pada stack dilakukan pada data paling baru. 2. Penghapusan data (pop) pada stack dilakukan juga pada data paling baru.
23
Untuk implementasi stack di linked list, kita bisa menggunakan 2 metode: Push data dilakukan dengan PushHead, sementara pop data dilakukan dengan popHead. Push dilakukan dengan pushTail, sementara pop dilakukan dengan popTail. Kalian bisa memilih metode manapun yang dirasa cocok. Untuk coding-nya lihat di bab “Linked List”.
24 B.
Depth First Search
Stack juga digunakan untuk melakukan Depth First Search (DFS). Untuk lebih jelasnya bisa dilihat pada proses di bawah ini: 1.)
Push 1 ke stack Isi Stack: 1 Isi DFS: -
25 2.)
Pop 1 dari stack Push 2 dan 3 ke stack Isi Stack: 2, 3 Isi DFS: 1
3.)
Pop 3 dari stack Push 6 dan 7 ke stack Isi Stack: 2, 6, 7 Isi DFS: 1, 3
26 4.)
Pop 7 dan 6 dari stack Isi Stack: 2 Isi DFS: 1, 3, 7, 6
5.)
Pop 2 dari stack Push 4 dan 5 ke stack Isi Stack: 4, 5 Isi DFS: 1, 3, 7, 6, 2
27 6.)
Pop 5 dan 4 dari stack Push 8 dan 9 ke stack Isi Stack: 8, 9 Isi DFS: 1, 3, 7, 6, 2, 5, 4
7.)
Pop 9 dan 8 dari stack Isi Stack: Isi DFS: 1,3,7,6,2,5,4,9,8
28 Note: ď&#x201A;ˇ Perhatikan bahwa jika setiap kali kita pop data dari stack, kita juga akan mem-push anak dari data tersebut ke dalam stack. ď&#x201A;ˇ Perhatikan juga bahwa setiap pop data dari stack, artinya push ke isi dari DFS.
C.
Pengertian Queue
Untuk analogi pada queue, kita bisa membayangkan sebuah antrian pada kasir. Orang yang dilayani oleh kasir adalah orang yang berdiri paling depan. Sementara orang yang baru datang harus menunggu di belakang orang tersebut. Jika ada orang lain yang baru datang, maka harus menunggu di belakangnya lagi, dan begitu seterusnya.
29 Dengan analogi di atas, maka kita dapat menarik kesimpulan: 1. 2.
Penambahan data (push) pada queue dilakukan pada data paling baru. Penghapusan data (pop) dilakukan pada data paling lama.
30 Untuk implementasi queue pada linked list, bisa digunakan 2 metode: ď&#x201A;ˇ
ď&#x201A;ˇ
D.
Push data dilakukan PushHead, sementara dilakukan dengan popTail Push data dilakukan dengan sementara pop dilakukan popHead.
dengan pop-nya PushTail, dengan
Breadth First Search
Jika stack bisa melakukan DFS, maka queue bisa melakukan Breadth First Search (BFS). Perhatikan prosesnya di bawah ini:
31 1.)
Push 1 ke queue. Isi Queue: 1 Isi BFS: -
2.)
Pop 1 dari queue Push 2 dan 3 ke Queue Isi Queue: 2, 3 Isi BFS: 1
32 3.)
Pop 2 dari Queue Push 4 dan 5 ke Queue Isi Queue: 3, 4, 5 Isi BFS: 1, 2
4.)
Pop 3 dari Queue Push 6 dan 7 ke Queue Isi Queue: 4, 5, 6, 7 Isi BFS: 1, 2, 3
33 5.)
Pop 4 dari Queue Push 8 dan 9 ke Queue Isi Queue: 5, 6, 7, 8, 9 Isi BFS: 1, 2, 3, 4
6.)
Pop 5, 6, 7 dari Queue Isi Queue: 8, 9 Isi BFS: 1, 2, 3, 4, 5, 6, 7
34 7.)
Pop 8 dan 9 dari Queue Isi Queue: Isi BFS: 1, 2, 3, 4, 5, 6, 7, 8, 9
Note: ď&#x201A;ˇ
ď&#x201A;ˇ
Seperti stack, setiap kali kita pop data tersebut, kita akan mem-push anak dari data tersebut ke dalam queue. Kita bisa langsung pop data 5, 6 ,7 tanpa push data apapun karena datadata tersebut tidak mempunyai anak.
35
TOPIK 3 Tree -
Definisi Tree
-
Istilah dalam Tree
-
Aplikasi Tree
36 A. Definisi Tree Tree adalah kumpulan dari node yang saling terkoneksi. Contoh:
B. Istilah dalam Tree (Contoh dari atas) 1. Root: node yang terletak paling atas. Contoh: Root: A 2. Edge: garis yang menghubungkan antar node. 3. Children: Node yang mempunyai hubungan ke bawah.
37 Contoh: E,F,G merupakan children dari B. 4. Leaf: Node yang tidak mempunyai children. Contoh: E,G,H,I,K,L,M,N,O merupakan leaf. 5. Parent: Node yang mempunyai hubungan ke atas. Contoh: D merupakan parent dari I,J. 6. Sibling: Node yang mempunyai parent yang sama. Contoh: I dan J Sibling karena memiliki parent D. 7. Degree: Total dari subtree dari suatu node. Contoh: Degree(A) = 3 (B,C,D). 8. Level Number: Tingkat kedalaman suatu node dari root, dengan kedalaman root adalah 0/1 (Normalnya 1, Binus 0). Contoh: Level(F) = 2.
38 9. Depth: Jarak dari root ke suatu node. Contoh: Depth(E) = 2 10. Height of Tree: Jarak terpanjang dari root kepada leaf. Contoh: Height of tree = 3 (Dari A ke K,L,M,N,O) .
C. Aplikasi Tree Tree digunakan dalam: 1.
Notasi Prefix, Postfix, Infix
2.
Binary Tree
3.
Binary Search Tree
4.
AVL Tree
5.
2-3 Tree dan B-Tree
6.
Trie
39
TOPIK 4 Binary Tree -
Definisi Binary Tree
-
Istilah dalam Binary Tree
-
Representasi Binary Tree
-
Konsep Threaded Binary Tree
40 A. Definisi Binary Tree Binary tree adalah tree yang memiliki paling banyak 2 node. Contoh:
B. Istilah dalam Binary Tree 1. PERFECT binary tree adalah binary tree yang memiliki kedalaman yang sama untuk setiap edge. 2. COMPLETE binary tree adalah binary tree yang setiap level memiliki kedalaman yang sama, kecuali level terakhir, dan node tingkat terakhir harus diisi dari paling kiri.
41 Perfect binary tree termasuk complete tree. 3. FULL binary tree adalah binary tree yang setiap node memiliki 2 child atau tidak ada sama sekali. 4. SKEWED binary tree adalah binary tree yang hanya memilki 1 child saja. 5. BALANCED binary tree adalah binary tree dimana tidak ada leaf yang berjarak cukup dalam dengan leaf lain. (Cukup dalam biasanya berjarak 1 kedalaman). Contoh:
42 C. Representasi Binary Tree Binary tree dapat dibuat dalam 2 bentuk: 1. Array 2. Linked List 1. Array 1.
Representasikan root dengan indeks 0.
2.
Child kiri berindeks 2p+1 .
3.
Child kanan berindeks 2p+2 (p: indeks parent).
4.
Parent indeks adalah (p-1)/2 (p: indeks child).
Contoh:
43 indeks
0
1
2
3
4
5
6
nilai
A
B
C
D
NULL
E
F
2. Linked List
Gambar:
44 D. Konsep Threaded Binary Tree Threaded Binary Tree merupakan binary tree dimana node pada bagian akhirnya bukan bersifat leaf, namun menunjuk kepada node yang lain.
Contoh:
Dari gambar terlihat bahwa A,C,E,H merupakan leaf. Namun mereka semua masih memiliki child yang menunjuk ke node yang lain.
45
TOPIK 5 Binary Search Tree (BST) -
Definisi BST
-
Sifat BST
-
Operasi Search
-
Operasi Insert
-
Operasi Delete
46 A. Definisi Binary Search Tree (BST) Binary Search Tree (BST) adalah sebuah tree dengan child kiri lebih kecil dibandingkan node serta child kanan lebih besar dibandingkan node Contoh:
B. Properti BST BST memiliki sifat: 1. Setiap node mempunyai nilai, dan tidak ada node yang memiliki nilai yang sama. 2. Nilai di sub tree kiri lebih kecil dibandingkan dengan node-nya.
47 3. Nilai
di
sub
tree
kanan
lebih
besar
dibandingkan dengan node-nya. 4. Sub tree kiri dan sub tree kanan juga BST.
C. Operasi Search BST memiliki operasi search yang cukup mudah dikarenakan sifatnya (kiri lebih kecil dan kanan lebih besar). Algoritma: 1. ) Mulai dari node awal. 2. ) Jika node awal sama dengan angka yang dicari, maka selesai. 3. ) Jika node awal > angka yang dicari, ulangi langkah 1 dengan child kiri sebagai node awal. 4. ) Jika node awal < angka yang dicari, ulangi langkah 1 dengan child kanan sebagai node awal.
48 Contoh: Carilah angka 33 dari binary search tree ini!
Solusi: 1.) 33 lebih besar daripada node awal (30), ambil child jalur kanan. Kemudian jadikan 37 sebagai node awal.
49 2.) 33 lebih kecil daripada node awal (37), ambil child jalur kiri. Kemudian jadikan 33 sebagai node awal.
3.) Karena 33 merupakan node yang kita cari, maka pencarian kita hentikan.
50 D. Operasi Insert BST memiliki operasi insert yang hampir sama dengan search. Algoritma: 1. ) Jika belum ada node, maka node langsung ditaruh di posisi root. 2. ) Mulai dari node awal. 3. ) Jika node awal > angka yang dimasukkan, ulangi langkah 1 dengan child kiri sebagai node awal. 4. ) Jika node awal < angka yang dimasukkan, ulangi langkah 1 dengan child kanan sebagai node awal.
51 Contoh: Masukkan angka 31 dalam binary search tree!
Solusi: 1.) 31 lebih besar daripada node awal (30), ambil child jalur kanan. Kemudian jadikan 37 sebagai node awal.
52 2.) 31 lebih kecil daripada node awal (37), ambil child jalur kiri. Kemudian jadikan 33 sebagai node awal.
3.) 31 lebih kecil daripada node awal (37), ambil child jalur kiri. Karena child jalur kiri belum ada node, 31 diletakkan di child kiri 33.
53 E. Operasi Delete Dalam operasi delete (hapus), ada 3 kasus yang harus dibagi: 1. Angka yang dihapus adalah Leaf. Solusi: Hapus saja leaf tersebut Contoh: Hapus node 43 dari binary search tree!
Solusi: Karena 43 terletak di leaf, maka langsung dihapus saja.
54 2. Angka yang dihapus adalah node dengan 1 child. Solusi: Hapus node tersebut, dan hubungkan child dari node itu ke parent dari node itu. Contoh: Berdasarkan gambar sebelumnya, hapus node 13 dari binary search tree! Solusi: Karena 13 hanya memiliki 1 child, langsung hubungkan child node tersebut ke parent node tersebut.
55 3. Angka yang dihapus adalah node dengan 2 child. Solusi: Ganti nilai node tersebut dengan posisi terkanan dari child kiri (atau posisi terkiri dari child kanan), lalu hapus node yang menggantikannya. Contoh: Berdasarkan gambar sebelumnya, hapus node 37 dari binary search tree! Solusi: Karena 37 memiliki 2 child, maka kita ambil child kirinya yaitu 33. Lalu, kita akan bergerak ke kanan terus hingga buntu. Sehingga kita mendapatkan angka 35 sebagai pengganti node 37.
56
TOPIK 6 AVL Tree -
Definisi AVL Tree
-
Sifat AVL Tree
-
Operasi Search
-
Operasi Insert
-
Rebalancing AVL Tree
-
Operasi Delete
57 A. Definisi AVL Tree AVL tree adalah sebuah binary search tree dimana selisih kedalaman dari setiap subtree maksimal 1. Nama AVL sendiri didapat dari singkatan para penemunya “Adelson-Velskii dan Landis” Contoh AVL Tree:
Keterangan: Subtree dari 30, yaitu 7 dan 37 memiliki kedalaman 2 (7 - 5) dan 3 (37 - 33 – 35). BENAR Subtree dari 7, yaitu 5 dan NULL memiliki kedalaman 1 (5) dan 0. BENAR Subtree dari 37, yaitu 33 dan 43 memiliki kedalaman 2 (33 – 35) dan 1 (43). BENAR
58 Contoh BUKAN AVL Tree:
Keterangan: Subtree dari 30, yaitu 7 dan 37 memiliki kedalaman 2 (7 - 5) dan 3 (37 - 33 – 35). BENAR Subtree dari 7, yaitu 5 dan NULL memiliki kedalaman 1 (5) dan 0. BENAR Subtree dari 37, yaitu 33 dan NULL memiliki kedalaman 2 (33 – 35) dan 0. SALAH (SELISIHNYA 2). Dikarenakan ada subtree yang bukan AVL, maka tree tersebut bukan AVL
59 B. Sifat AVL Tree Berdasarkan dari contoh disimpulkan sifat AVL Tree:
di
atas,
dapat
â&#x20AC;&#x153;Selisih kedalaman dari sub tree setiap node harus maksimal 1.â&#x20AC;? C. Operasi Search Karena pada dasarnya AVL Tree merupakan Binary Search Tree (BST), maka operasi search dari AVL sama dengan BST. Algoritma: 1. Mulai dari node awal. 2. Jika node awal sama dengan angka yang dicari, maka selesai. 3. Jika node awal > angka yang dicari, ulangi langkah 1 dengan child kiri sebagai node awal. 4. Jika node awal < angka yang dicari, ulangi langkah 1 dengan child kanan sebagai node awal.
60 D. Operasi Insert AVL memiliki operasi insert yang hampir sama dengan BST. Algoritma: 1. Jika belum ada node, maka node langsung ditaruh. 2. Mulai dari node awal. 3. Jika node awal > angka yang dimasukkan, ulangi langkah 1 dengan child kiri sebagai node awal. 4. Jika node awal < angka yang dimasukkan, ulangi langkah 1 dengan child kanan sebagai node awal. 5. Dari posisi node yang dimasukkan, telusuri hingga ke root, sambil bandingkan subtree kiri dan kanannya. 6. Apabila ada node dimana selisih subtree kiri dan kanan lebih besar dari 1, lakukan rebalancing.
61 Misalkan data yang dimasukkan adalah 6. Gunakan prinsip yang sama dengan binary search tree untuk menentukan node 6.
Telusuri dari node yang dimasukkan (6) hingga ke root (30). Subtree node (5) untuk kiri dan kanan adalah 0 dan 1. Subtree node (7) untuk kiri dan kanan adalah 2 dan 0. Lakukan Rebalancing.
62 E. Rebalancing AVL Tree Rebalancing dalam AVL Tree dibagi menjadi 4 kasus 1. Kasus left rotation (LL) Kasus ini digunakan jika ada tree yang node anaknya di kanan, dan node cucunya di node kanan anaknya. Perhatikan gambar agar lebih jelas.
Jika dilakukan rotation, maka hasilnya seperti ini:
63 2. Kasus right rotation Kasus ini dilakukan terhadap tree yang berbentuk seperti mirror dari kasus left rotation. Untuk ilustrasinya :
Hasil dari right rotation akan seperti berikut :
64 3. Kasus left right rotation Kasus ini digunakan jika tree mempuntai anak di kanan, dan cucunya merupakan anak kiri dari anaknya. Ilustrasinya sebagai berikut:
Untuk prosesnya, pertama lakukan right rotation pada anaknya saja, sehingga: Sebelum:
Sesudah:
65 Sehingga, kita akan memiliki tree sebagai berikut
Lakukan left rotation, dan hasil akhirnya menjadi:
4. Kasus right left rotation Kasus ini digunakan jika bentuk tree sperti mirror dari bentuk tree kasus left right rotation, Lihat gambar untuk lebih jelasnya.
66
Lakukan left sehingga: Sebelum:
rotation
pada
anaknya
saja,
Sesudah:
Sehingga, kita akan memiliki tree sebagai berikut:
67 Lakukan left rotation, dan hasil akhirnya menjadi:
F. Operasi Delete Dikarenakan AVL merupakan BST, maka operasi delete pun memiliki tahapan yang hampir sama dengan BST. Algoritma Delete: 1. Hapus node sesuai dengan metode binary search tree. 2. Kemudian dari parent node yang dihapus, telusuri terus hingga ke root. 3. Apabila subtree dari node yang ditelusuri berselisih â&#x2030;¤ 1, maka lanjutkan ke parent node tersebut.
68 4. Apabila subtree dari node tersebut berselisih > 1, rebalancing node tersebut. 5. Lakukan tahapan tersebut hingga ke root.
69
TOPIK 7 2-3 Tree -
Ciri â&#x20AC;&#x201C; Ciri 2-3 Tree
-
Insert pada 2-3 Tree
-
Delete pada 2-3 Tree
70 A. Ciri - Ciri 2-3 Tree 1. Setiap node merupakan 2-node (jika hanya berisi 1 data) atau 3-node (jika berisi 2 data). ď&#x201A;ˇ Untuk parent node, 2-node memiliki 2 anak (left & middle), 3-node memiliki 3 anak (left, middle, right). 2. Data disusun secara berurutan. ď&#x201A;ˇ Misalkan x adalah data dalam 2-node, data pada left-child harus lebih kecil dari x, dan data pada middle-child harus lebih besar dari x. ď&#x201A;ˇ Misalkan x dan y adalah data dalam 3node, data pada left-child harus lebih kecil dari x, data pada middle-child harus di antara x dan y, dan data pada right-child harus lebih besar dari y. 3. Semua leaf berada di level depth yang sama.
71
Contoh 2-3 Tree B. Proses Insert pada 2-3 Tree 1. Data terbaru dimasukkan dalam leaf. (Letak leaf yang akan dimasukkan bergantung pada data) Terdapat beberapa kasus dalam proses insert ini: ď&#x201A;ˇ Kasus 1: Apabila leaf yang akan diisi merupakan 2-leaf, maka langsung diinsert pada node yang kosong.
72 Contoh: Pada saat memasukkan 45, leaf tersebut adalah 2-node, sehingga 45 langsung dimasukkan.
73 ď&#x201A;ˇ Kasus 2: Jika data dimasukkan pada 3-node leaf, maka ketiga data dalam leaf disortir secara berurut, lalu data kedua dipindahkan ke parent, dan pisah sisa kedua data menjadi 2 2-node. Contoh: 1.)
Pada saat 75 dimasukkan, leaf tujuan merupakan 3-node. Pada saat ini, ketiga data dalam node tersebut disortir terlebih dahulu.
74 2.)
Setelah disorting, data yang di tengah (80) dipindahkan ke parent node.
3.)
Node sisanya (75 dan 90) dipisah menjadi 2 2-node.
Note: Proses perbaikan tree bisa dilakukan sampai root, namun penyelesaiannya tetap sama.
75 C. Proses Delete pada 2-3 Tree 1.) Saat proses delete, key yang didelete akan ditukar oleh data dari leaf yang dapat menggantikan data tersebut, sehingga seluruh proses delesi sebenarnya terjadi di leaf.
2.) Jika leaf merupakan 3-node, data dapat didelete secara langsung. 3.) Jika leaf merupakan 2-node (hanya 1 data): ď&#x201A;ˇ Jika parent merupakan 3-node, ambil data untuk menggantikan key dari parent dengan aturan sebagai berikut:
76 a.
b.
Jika saudaranya node tersebut 3-node, ambil salah satu data dari saudaranya untuk di-push ke parent. Jika saudaranya merupakan 2-node, maka ubah parent menjadi 2-node dengan memindahkan salah satu data dari parent node ke saudaranya,
77 Contoh:
1.) Misal data yang akan dibuang adalah 50, data digantikan oleh 40.
2.) Setelah 40 dipindahkan, node leaf kosong. Terlihat saudaranya adalah 2-node, parent-nya adalah 3-node. Gunakan kasus b untuk memperbaiki tree ini.
78
ď&#x201A;ˇ Jika parent adalah 2-node, maka: a. Jika saudaranya node adalah 3-node, maka data dari parent diberikan ke child, dan salah satu data dari sibling diberikan ke parent. b. Jika saudaranya merupakan 2-node, maka node digabung.
79 Contoh:
1.) Misal data yang akan dibuang adalah 5, maka data digantikan dengan 4.
80 2.) Karena sibling adalah 2-node, maka gunakan kasus b untuk memperbaiki leaf (gabungkan node dengan parent).
3.) Setelah node leaf selesai diperbaiki, lanjutkan proses perbaikan ke parent. Di sini terlihat bahwa parent dari node merupakan 2-node, dan sibling node adalah 2-node. Gunakan kasus b untuk memperbaiki node level ini.
81 4.) Proses tersebut membuat root sebelumnya kosong, sehingga dapat dibuang, membuat node (4,7) menjadi root baru.
82
TOPIK 8 Red â&#x20AC;&#x201C; Black Tree (RBT) - Ciri-Ciri RBT - Insert pada RBT - Delete pada RBT
83 A. Ciri-Ciri 1. Setiap node punya warna merah atau hitam. 2. Warna node root selalu hitam. 3. Warna dari seluruh external node (children dari leaf, tidak digambarkan) adalah hitam. 4. Jika sebuah node berwarna merah, maka node children keduanya berwarna hitam. ď&#x201A;ˇ Tidak ada node merah yang memiliki parent berwarna merah.
B. Operasi Insert pada RBT 1. Operasi insert sama seperti cara memasukkan data dalam binary search tree. 2. Warna node barunya adalah merah (kecuali root, harus hitam). 3. Kasus 1: Jika parent adalah hitam, operasi insert selesai.
84
Y c X a
b
(data yang dimasukkan adalah X) 4.
Kasus 2 (Recoloring): Jika sibling dari parent node adalah merah, maka ubah warna parent dan sibling-nya menjadi hitam, dan parent dari parent node jadi merah.
85
Gambar kiri: Data yang dimasukkan adalah X. Terlihat parent X adalah Y, dan sibling dari Y adalah D. Y dan D diubah menjadi merah, dan grandparent dari X (Z, parent dari Y) diubah jadi merah. Kemudian, karena Z adalah root, maka Z haruslah diubah menjadi hitam. 5.
Kasus 3 (Rotation): Rotation dilakukan jika sibling dari parent node adalah hitam (external node ataupun node berdata). Rotation bisa dilakukan sekali atau dua kali, bergantung dari keadaan. a.) Single rotation jika violation terjadi secara searah. Hal ini diperbaiki dengan memutar tree, seperti contoh berikut.
86
Z
X Y
d
a
Y
Y X
c X a
a b
Z b
c
b Z
d c
d
Gambar kiri: Misal X adalah data baru. Parentnya adalah Y, yang memiliki sibling D yang berwarna hitam. Violation terjadi secara searah (kiri-kiri atau kanan-kanan), sehingga Y dibuat menjadi parent baru yang berwarna hitam, X dan Z menjadi child dari Y dan keduanya diwarnai merah.
b.) Double rotation terjadi jika violation terjadi dengan arah yang berbeda (kiri-kanan atau kanan-kiri).
87 Z
X Y
d
a
X
Z X
a Y b
a c
Z b
c
d
Y
d b
c
Gambar kiri: Data yang dimasukkan adalah Y, dan parent dari Y adalah X (Z untuk gambar kanan) yang memiliki node D sebagai sibling (A untuk gambar kanan) yang berwarna hitam. Pertama rotasikan tree di parent node (X, Z di gambar kanan) agar menjadi searah kembali, lalu dirotasikan kembali seperti kasus 3a untuk menyelesaikan perbaikan.
C. Delete RBT
88 1.
Proses delete sama seperti pembuangan data di binary search tree. Data digantikan oleh leaf data terbesar dari subtree kiri atau terkecil dari subtree kanan, sehingga pembuangan selalu terjadi di leaf node.
2.
Misalkan node yang dibuang adalah X, dan child-nya adalah Y.
3.
Kasus 1: Jika X adalah node merah, maka tukar dengan Y. Proses pembuangan selesai.
4.
Kasus 2: Jika X hitam tapi Y merah, maka tukar dengan Y, dan Y diubah warnanya menjadi hitam.
5.
Kasus 3: Jika X dan Y adalah hitam (doubleblack node), maka: Seperti biasa tukar X dengan Y. Misalkan Y memiliki parent node P, sibling-nya adalah S, dan anak-anak sibling-nya adalah SL (anak
89 kiri) dan SR (anak kanan). Ada 3 kasus yang harus diperhatikan: a.) Jika S adalah merah, rotasikan parent, lalu tukar warna ex-sibling dengan parent baru.
X
Y Y
a b
X c
a
c b
A adalah double-black node. Sibling A berwarna merah. Rotasikan X dan Y, lalu tukar warnanya. b.) Jika S, SL dan SR berwarna hitam, maka ganti warna S menjadi merah.
90
X
X Y
a
Y
a
b
c
b
c
Terlihat sibling A, Y, berwarna hitam dan anak-anak sibling-nya juga berwarna hitam. Ubah Y menjadi merah. c.) Jika S hitam, dan salah satu anak S merah, lakukan
rotasi
dan
perbaiki
dengan
menerapkan kasus-kasus sebelumnya.
X
Y Z
a
X d
Y b
c
X
a
Z b
c
Z
a d
b
Y c
d
91 A memiliki sibling Z. Z memiliki child yang salah satunya merah (Y). Lakukan rotation (single atau double) untuk memperbaikinya. NOTE: Proses perbaikan bisa terjadi berulang kali sampai root.
92
TOPIK 9 Graph -
Definisi Graph
-
Istilah dalam Graph
-
Adjacency List Matriks
-
Minimum Spanning Tree (MST)
-
Shortest Path (Dijkstraâ&#x20AC;&#x2122;s Algorithm)
93 A. Definisi Graph Graph adalah kumpulan dari vertex (kota/ node) dan edges (jalan) yang menghubungkan vertex. Contoh: D
B
A
C
B. Istilah Dalam Graph 1. Vertex: Kota Contoh: A,B,C 2. Edges: Jalan Contoh: Garis yang menghubungkan A dan B 3. Degree: Jumlah edge yang ada di sebuah vertex, Contoh: Degree(A) = 2 4. Undirected: Edge yang tak berarah Contoh B
D
94 Dari B bisa ke D, dan dari D bisa ke B 5. Directed: Edge yang berarah Contoh: B
D
Dari B bisa ke D, namun dari D tidak bisa ke B 6. Tree: Graph dengan vertex tidak tertutup (tidak ada siklus) Contoh: B
D
C
7. Cycle: Graph dengan vertex tertutup (ada siklus) Contoh : graph di subbab pertama
95 C. Adjacency List Matriks Adjacency List Matriks adalah suatu cara untuk menjelaskan hubungan graph. B
A
C
Bentuk matriks: đ?&#x2018;&#x2030;đ?&#x2018;&#x2019;đ?&#x2018;&#x;đ?&#x2018;Ąđ?&#x2018;&#x2019;đ?&#x2018;Ľ đ??´ đ??ľ đ??´ 0 1 đ??ľ 0 0 đ??ś 0 0 đ??ˇ 0 0
đ??ś 1 1 0 1
đ??ˇ 0 1 0 0
Ada 2 cara: 1. Dengan Array Ubah ke dalam array 2 dimensi. Anggap A=0, B=1, C=2, dst... Contoh: hubungan[0][0] = 0;
D
96 hubungan[0][1] = 1; hubungan[0][3] = 0; Definisi: 0 = Tidak ada edge menghubungkan vertex 1 = Ada edge yang menghubungkan vertex hubungan[0][1]=1; Ada edge dari A ke B hubungan[0][3]=0; Tidak ada edge dari A ke D 2. Dengan List Lakukan list dengan masing-masing vertex di awal [A| ] [B| ] [C| ] NULL [B| ] [C| ] [D| ] NULL [C| ] NULL [D| ] [C| ] NULL (Posisi tidak berpengaruh)
97 D. Minimum Spanning Tree (MST) Minimum spanning tree adalah cara membentuk tree dengan total nilai edge terkecil. MST menggunakan Greedy Method. Ada 2 algoritma dalam MST: 1. Prim 2. Kruskal 1. Algoritma Prim: 1.) Tentukan sebuah vertex (bebas). Vertex ini dianggap vertex utama. 2.) Selama ada vertex yang terhubung dengan vertex utama, edge yang terhubung dengan vertex dianggap aktif. 3.) Bandingkan semua edge yang aktif, dan ambil edge dengan nilai terkecil. 4.) Tambahkan vertex serta edge dengan nilai terkecil. 5.) Ulangi tahap 2-4, hingga semua vertex terhubung.
98 Contoh: Minimum adalah:
treenya
1.) Tentukan vertex utama kita. Dalam kasus ini vertex utama kita adalah C. 2.) Cari edge minimum yang terhubung dengan C, yaitu B. Hubungkan vertex B dengan C. Hasil Sementara:
3.) Cari edge minimum yang terhubung dengan B dan C, yaitu A. Hubungkan vertex A dengan vertex yang telah terhubung. Hasil sementara:
99 4.) Cari edge minimum yang terhubung dengan B dan C dan A, yaitu E. Hubungkan vertex E dengan vertex yang telah terhubung. Hasil sementara:
5.) Cari edge minimum yang terhubung dengan B dan C, A, dan E, yaitu C. Namun karena C telah terhubung, maka tidak valid. 6.) Cari nilai edge minimum selanjutnya yang terhubung dengan B dan C, A, dan E, yaitu D. Hubungkan vertex D dengan vertex yang telah terhubung. Hasil sementara:
7.) Karena semua vertex telah terhubung, maka pencarian selesai. Hasil akhir:
100 2. Algoritma Kruskal: 1.) Sort semua edge dengan menggunakan heap. 2.) Ambil nilai edge terkecil. 3.) Jika ada edge yang membentuk cycle, lanjutkan ke edge berikutnya (jangan diambil edge tersebut). 4.) Jika tidak, tambahkan edge serta vertex yang terhubung oleh edge tersebut. 5.) Ulangi tahap 2-4, hingga semua vertex terhubung. Contoh: Minimum adalah:
treenya
101 1.) Cari edge dengan nilai terkecil, yaitu (menghubungkan A-E). Hubungkan edge tersebut.
2
Hasil sementara:
2.) Cari edge terkecil berikutnya, yaitu A-B dan B-C. Kita bebas dalam mengambil edge berikutnya. Dalam contoh ini, kita ambil A-B terlebih dahulu. Hubungkan kedua vertex dengan edge tersebut. Hasil sementara:
3.) Ambil edge B-C dan hubungkan kedua vertex dengan edge tersebut. Hasil sementara:
102 4.) Ambil edge terkecil berikutnya, yaitu C-E. Tetapi bila kita ambil, maka akan terbentuk cycle. Oleh sebab itu, lanjut mencari edge terkecil selanjutnya. 5.) Lanjutkan pencarian edge terkecil berikutnya. Edge berikutnya ditemukan pada A-D. Karena tidak membentuk cycle, ambil edge tersebut dan hubungkan kedua vertex. Hasil sementara:
6.) Karena semua vertex telah terhubung, maka pencarian kita selesai. Hasil akhir:
103 E. Shortest Path (Algoritma Dijkstra) Shortest path adalah metode untuk mencari jarak terpendek dari graph yang diberikan. Algoritma yang digunakan adalah Dijkstra. 1. Algoritma Dijkstra: 1.) Tentukan vertex awal. 2.) Definisikan N sebagai empty set. 3.) Beri nilai vertex awal 0, jadikan vertex awal sebagai vertex sekarang, dan masukkan vertex awal ke N. 4.) Cari semua vertex yang terhubung dari vertex sekarang, dan belum terdapat di set N. 5.) a. Jika vertex belum ada nilai, nilai vertex tujuan = jarak antar vertex + nilai vertex sekarang. b. Jika vertex sudah ada nilai, vertex tujuan = min (nilai vertex tujuan yang dulu, nilai vertex sekarang + jarak antar vertex).
104 6.) Ambil vertex yang belum ada di set N dengan nilai vertex terkecil, dan jadikan vertex itu menjadi vertex sekarang dan tambahkan vertex itu ke N. 7.) Ulangi langkah 4 â&#x20AC;&#x201C; 6 hingga vertex tujuan ada di set N, atau tidak ada jalan lagi. Contoh: Berdasarkan dari gambar di bawah, tentukan jarak terpendek dari A ke E!
1.) Karena dari A ke E, maka A merupakan vertex utama, dan E sebagai vertex tujuan. 2.) Berikan nilai vertex A = 0, dan masukkan vertex awal ke N (dalam bentuk warna dan tulisan hijau di vertex). Hasil sementara:
3.) Cari vertex yang terhubung dengan A, yaitu B dan C.
105 4.) Karena vertex B belum ada nilai, maka nilai vertex B = 0 + 17 =17. Sedangkan nilai vertex C = 0 + 7 = 7. Hasil sementara:
5.) Ambil vertex yang belum ada di set dengan nilai terkecil, yaitu C dengan 7.
Hasil sementara:
6.) Cari vertex yang terhubung dengan A, yaitu B. Kemudian, cari vertex yang terhubung dengan C, yaitu B dan D.
106 7.) Dari A, karena vertex B sudah ada nilai, maka nilai vertex B = min (17, vertex A + edge A-B (0 + 17)) = 17. 8.) Dari C, karena vertex B sudah ada nilai, maka nilai vertex B = min (17, vertex C +edge C-B (7+8)) = 15. 9.) Karena vertex D belum ada nilai, maka nilai vertex D = 7 + 6 =13. Hasil sementara:
10.) Ambil vertex yang belum ada di set dengan nilai terkecil, yaitu D dengan 13.
Hasil sementara:
107 11.) Cari vertex yang terhubung dengan A,C,D namun belum masuk dalam set (belum warna hijau), yaitu B dan E. 12.) Vertex minimum B adalah 15 (dari C ke B), dan vertex E bernilai 26 (dari D ke E). Hasil sementara:
13.) Ambil vertex yang belum ada di set dengan nilai terkecil, yaitu B dengan 15. Hasil sementara:
14.) Cari vertex yang terhubung dengan A,B,C,D namun belum masuk dalam set (belum warna hijau), yaitu E.
108 15.) Vertex minimum E adalah 25 (dari B ke E). Hasil sementara:
16.) Ambil vertex yang belum ada di set dengan nilai terkecil, yaitu E dengan 25. Hasil sementara:
17.) Karena vertex E telah bernilai, maka pencarian kita hentikan. Jarak terpendek dari A ke E adalah 25, dengan rute Aď&#x192; C ď&#x192; B ď&#x192; E.
109
TOPIK 10 Heap, Trie, Hashing -
Pengertian Heap
-
Jenis dan Operasi Heap
-
Pengertian Trie
-
Pengertian Hash
-
Collision
110 A. Pengertian Heap Heap adalah sebuah struktur data yang berbentuk tree dan memenuhi properti heap: "Setiap parent node memiliki nilai yang lebih besar sama dengan nilai node anaknya (untuk max heap) atau nilai yang lebih kecil sama dengan node anaknya (untuk min heap)." Heap juga memiliki bentuk complete binary tree, yaitu semua level tree-nya terisi secara penuh oleh node, kecuali untuk node paling bawah. Heap ini juga diisi dari kiri ke kanan. B. Jenis dan Operasi pada Heap 1. Min Heap a. Pengertian Seperti yang sudah dijelaskan di atas, min heap adalah heap yang semua parent node-nya memiliki nilai yang lebih kecil sama dengan node
111 anaknya sehingga node root mempunyai nilai paling kecil (minimum). Ilustrasi dari min heap ini:
b. Insert Operasi insert pada min heap (dan heap-heap lainnya) harus tetap memenuhi properti heap, sehingga tidak bisa di-insert sembarangan. Insert pada heap bisa dilakukan dengan mengikuti algoritma di bawah ini: 1.) Tambahkan elemen baru ke heap yang paling bawah.
112 2.) Bandingkan elemen yang baru ditambah dengan parent-nya. Jika sudah sesuai dengan properti heap-nya, stop. 3.) Jika belum, tukar elemen baru dengan parentnya dan lakukan step 2 lagi. Ilustrasi dari insert pada min heap: Misal kita mempunyai tree seperti ilustrasi sebelumnya, dan kita akan menambahkan data bernilai 5 pada tree tersebut. 1.)
Tambahkan 5 di posisi paling terakhir.
2.)
Bandingkan 5 dengan parent-nya. Karena 9 lebih besar dari 5, maka kita harus menukar 5 dengan 9.
113
3.)
Bandingkan lagi 5 dengan parent-nya. Karena 5 lebih kecil dari 7, maka kita harus menukar 5 dengan 7.
114 4.)
Karena 5 sekarang sudah menjadi root, maka kita tidak bisa membandingkannya dengan parent manapun, sehingga tahap 3 menjadi tahap paling terakhir.
c. Delete Untuk operasi delete pada heap hanya terdiri dari delete root saja. Delete root ini juga harus memperhatikan properti heap dan tidak boleh sembarangan. Untuk algoritmanya: 1.) Ganti root dari heap dengan data yang terakhir di-insert ke heap. 2.) Bandingkan data tersebut dengan anaknya. Jika sudah sesuai dengan properti heap-nya, stop. 3.) Jika belum, ganti elemennya dengan salah satu anaknya (tergantung jenis heap) dan kembali ke step 2.
115 Ilustrasi delete min heap: Anggap kita akan men-delete root dari ilustrasi min heap yang sebelumnya. Maka langkah pengerjaannya: 1.)
Delete 5 dari Heap, ganti dengan 9.
2.)
Bandingkan dengan anaknya. Karena data 7 kurang dari 9. Maka kita harus menukar 7 dengan 9.
116
3.)
Bandingkan lagi dengan anaknya. Karena posisinya sudah betul, maka kita berhenti.
2. Max Heap a. Pengertian Max heap hampir sama dengan min heap, hanya saja nilai dari parent node pada max heap selalu lebih besar sama dengan nilai dari anaknya, sehingga data paling besar terletak di root.
117 Ilustrasinya adalah sebagai berikut:
b. Insert Insert data pada max heap juga mempunyai langkah yang sama dengan min heap. Namun, karena harus memenuhi properti dari max heap, maka data yang lebih besar harus ada di atas. Ilustrasi dari insert pada max heap: Anggap kita mempunyai sebuah heap dari ilustrasi di atas, dan kita akan menambahkan data bernilai 33 ke heap.
118 1.)
Letakan 33 di posisi paling terakhir.
2.)
Bandingkan 33 dengan parent-nya. Karena 29 lebih kecil dari 33, maka tukar nilai 29 dan 33.
3.)
Karena urutannya sudah sesuai, maka insert data 33 pada heap ini sudah selesai.
119 c. Delete Delete pada max heap juga sama dengan delete pada min heap. Hanya perlu membandingkan root yang baru dengan yang lebih besar. Ilustrasinya sebagai berikut: Kita akan mengambil dari max tree yang sebelumnya. Maka langkah delete datanya: 1.)
Hapus data 37 dan letakan 29 di root.
120 2.)
3.)
Bandingkan 29 dengan anaknya. Karena ke dua anaknya lebih besar, maka kita akan mengganti 29 dengan anak yang paling besar (33).
. Karena urutannya sudah sesuai, selsailah operasi delete.
maka
3. Min-Max Heap a. Pengertian Min-Max Heap adalah gabungan min heap dan max heap. Root selalu menjadi min heap. Anak dari root selalu menjadi max heap, cucu dari root menjadi min heap, dan begitu selanjutnya.
121 Ilustrasi dari min-max heap:
Perhatikan bahwa tipe heap-nya selalu berganti tiap level-nya. b. Insert Insert data pada min-max heap secara konsep sama dengan min heap ataupun max heap. Namun, pada heap yang sebelumnya kita hanya membandingkan node yang berada 1 level di atas node yang ingin kita tambahkan pada min-max heap. Kita juga harus membandingkan dengan level-level yang di atasnya.
122 Ilustrasi insert min-max heap sebagai berikut: Dengan menggunakan ilustrasi yang sebelumnya, kita akan menambahkan data bernilai 7 dan 24 berturut-turut. ď&#x201A;ˇ Untuk penambahan data bernilai 7: 1.)
Letakkan data di node yang baru
2.)
Bandingkan 7 dengan semua parent-nya. Karena 10 lebih besar dari 7, dan 10 berada di min-heap, tukar data tersebut.
123
ď&#x201A;ˇ Penambahan data bernilai 24. 1.)
Tambahkan 24 di node yang baru.
124 2.)
Bandingkan 24 dengan semua node parentnya. Karena 18 lebih kecil dari 24, dan 18 berada di posisi max, tukar 18 dengan 24.
3.)
Karena data telah tersusun, maka tidak perlu lagi ada penukaran data.
c. Delete
125 Delete pada min-max Heap memiliki 2 jenis delete, yaitu: ď&#x201A;ˇ Delete Min: Delete data yang bernilai minimum. ď&#x201A;ˇ Delete Max: Delete data yang bernilai maksimum. Walaupun memiliki 2 jenis, secara umum konsep delete pada min-max tree sama dengan delete pada heap yang lain. Meskipun terdapat langkah tambahan, yaitu membandingkan antara data tersebut dengan level min/max yang lain. Untuk contohnya, kita akan melakukan delete min dan max secara berturut turut dari heap yang sebelumnya.
Delete min: 1.)
Hapus data bernilai minimum (Dalam hal ini berada di root) dan tukar
126 dengan data tambahkan.
yang
terakhir
kita
2.)
Bandingkan dengan anaknya, karena sudah sesuai maka tidak perlu diganti lagi.
3.)
Bandingkan dengan level min yang lain. Karena 18 lebih besar daripada 7, 12, 9, dan 8, maka kita akan menukarnya dengan data yang bernilai paling kecil (7).
127
4.)
Karena sudah sesuai, maka kita bisa menyelesaikan delete min.
Delete max: 1.)
Hapus data yang bernilai maksimum (Pasti salah satu anak dari root). Kemudian ganti dengan data yang terakhir ditambahkan.
128
2.)
Bandingkan dengan anaknya, karena 10 lebih kecil dari kedua anaknya, maka kita harus menggantinya dengan anak yang paling besar.
3.)
Bandingkan 18 dengan max yang lain. Karena sudah tidak ada max maka step ini tidak perlu dijalankan dan delete max selesai.
129 C. Pengertian Trie Trie adalah salah satu struktur data berbentuk tree yang terurut, dan menyimpan data array (biasanya string). Dalam trie, root selalu menyimpan nilai null (â&#x20AC;&#x2DC;â&#x20AC;&#x2122;) dan setiap anak menyimpan satu karakter saja. Trie berasal dari kata ReTRIEval (Pengembalian). Trie juga sering disebut sebagai prefix tree. Saat ini, trie digunakan di antaranya untuk sugesstion pada web browser dan spellchecker (autocorrect). Contoh dari trie bisa dilihat pada gambar di halaman selanjutnya.
130
Pada contoh di atas, tanda checklist menandakan bahwa node tersebut sudah membentuk sebuah kata. Namun jika node dengan tanda checklist masih mempunyai anak, maka akan dilanjutkan dan membentuk kata baru. Jadi, pada contoh di atas, kata yang terbentuk adalah: BANK, HOME, HOMERUN, HOUSE.
131 D.
Pengertian Hash
Pada hashing, terdapat 3 definisi yang perlu kita ketahui: 1. Key: Data yang ingin diolah dan kemudian disimpan. 2. Hash function: fungsi yang mengolah key untuk kemudian disimpan di hash table 3. Hash table: Tempat penyimpanan hasil olahan dari hash function. Biasanya disimpan dalam bentuk array. Untuk lebih jelasnya, lihat gambar di bawah ini:
132
Pada gambar di atas, kita mempunyai key yang bernilai 19, 6 dan 20. Key tersebut dimasukkan ke hash function berupa operasi modulo 4. Maka dalam operasinya: 19 mod 4 = 3 ď&#x192; masukkan ke hash table indeks 3. 6 mod 4 = 2 ď&#x192; masukkan ke hash table indeks 2. 20 mod 4 = 0 ď&#x192; masukkan ke hash table indeks 0.
133 Setelah angka-angka tersebut melalui operasi ini, maka kita baru bisa mendapatkan gambar seperti di atas.
E. Collision Collision adalah keadaan di mana suatu indeks pada hash table memiliki 2 key yang berbeda. Sehingga menimbulkan suatu ‘tabrakan’ (collide). Sebagai contohnya: Key: 19, 6, 20, 16 Hash Function: Modulo 4 Maka untuk operasinya: 19 mod 4 = 3 masukkan ke hash table indeks 3. 6 mod 4 = 2 masukkan ke hash table indeks 2. 20 mod 4 = 0 masukkan ke hash table indeks 0.
134 16 mod 4 = 0 ď&#x192; masukkan ke hash table indeks 0. Untuk gambarannya bisa dilihat di bawah ini:
Di sini kita bisa melihat data dengan key 20 dan 16 mengalami collision. Maka untuk mengatasi collision ini, kita bisa menggunakan 2 cara: 1. Linear probing
135 Pada linear probing, data yang mengalami collision akan dipindahkan ke memori kosong terdekat. Data yang biasanya dipindahkan adalah data yang paling baru. Dalam kasus ini, kita bisa melihat bahwa indeks 2 kosong, karena itu kita akan menyimpan data dengan key 16 di indeks ke 2. Untuk gambarannya:
2. Chaining
136 Pada Chaining, kita akan tetap memasukkan data yang mengalami collision ke hash table masing masing. Namun, kita akan membuat sebuah linked list antar data yang mengalami collision tersebut. Dalam kasus ini, karena key 20 dan 16 mengalami collision. Maka kita akan membuat sebuah linked list dari data 20 ke 16. Untuk lebih jelasnya, lihat ilustrasi di bawah ini:
Referensi https://en.wikipedia.org/wiki/Hash_function https://en.wikipedia.org/wiki/Heap_%28data_stru cture%29 https://en.wikipedia.org/wiki/Linked_list https://en.wikipedia.org/wiki/Queue_%28abstrac t_data_type%29 https://en.wikipedia.org/wiki/Stack_%28abstract_ data_type%29 https://en.wikipedia.org/wiki/Trie Reema Thareja,. 2014. Data structures using C. OXFOR. New Delhi. Retrieved from Binusmaya Binus University Web site: http://www.binusmaya.binus.ac.id
PROFIL Himpunan Mahasiswa Matematika (HIMMAT) merupakan salah satu Himpunan Mahasiswa Jurusan (HMJ) di BINUS UNIVERSITY. HIMMAT adalah wadah penyaluran aspirasi, kreativitas, dan bakat serta pengembangan diri dari mahasiswa jurusan Teknik Informatika dan Matematika BINUS UNIVERSITY. HIMMAT berasaskan kekeluargaan dan kode etik berorganisasi di BINUS UNIVERSITY. HIMMAT didirikan pada tanggal 21 April 1999. HIMMAT adalah organisasi yang bersifat kekeluargaan, kemahasiswaan, keilmuan, dan kemasyarakatan.