Everybody in this country should learn how to program a computer because it teaches you how to think. Steve Jobs
Pengenalan Heap Heap adalah struktur data dengan konsep Binary Tree. Heap dibagi menjadi 2 jenis, yaitu max heap dan min heap. Max Heap adalah heap dengan konsep nilai parent node lebih besar sama dengan child node, kalau min heap parent node lebih kecil sama dengan child node. Heap mempunyai karakteristik sebagai berikut : Mempunyai ciri ciri Tree yang penuh ( complete ), dalam artian tree tersebut ter isi mulai dari kiri ke kanan dalam setiap garis / level. Walaupun begitu, untuk baris terakhir tidak perlu menjadi Tree yang penuh. Pada umumnya diimplementasikan menggunakan Array. Setiap node pada Heap harus memenuhi kondisi atau sifat dari Heap, yaitu parent node lebih besar daripada child node.
Implementasi Heap Seperti yang sudah dijelaskan sebelumnya bahwa Heap biasanya diimplementasikan menggunakan array (fixed size atau dynamic array), maka dari itu elemen pertama pada array (index 1) akan menjadi root dan 2 elemen selanjutnya akan menjadi child dari elemen pertama dan empat elemen selanjutnya akan menjadi child dari 2 elemen sebelumnya. maka node yang ada pada posisi n akan mempunyai posisi child pada 2n dan 2n + 1 dalam suatu array. Jika kita ingin mencari parent node dari node n, maka rumusnya adalah n/2 lalu dibulatkan kebawah, contohnya: jika kita ingin mencari child dari node index ke 2, maka : n = 2 child1 = 2n = 4 child2 = 2n+1 = 5 jika kita ingin mencari parent node dari node index ke 5, maka: n = 5 parent = 5 / 2 = 2 // dibulatkan kebawah Note : index array dalam kontes di atas dimulai dari 1, jika diimplementasikan pada java code hanya tinggal dikurangi 1 ( 1) pada rumus diatas. Weakly Ordered Jika dibandingkan dengan BST (Binary Search Tree) yang setiap meng inputkan Node selalu dibandingkan dengan Node node yang lain yaitu Node kiri harus lebih kecil daripada Node kanan, Heap hanya mempunyai prinsip yaitu parent node harus lebih besar daripada child node. Basic Operation find max (max heap) or find min (min heap) hanya untuk menemukan node maksimal atau minimal pada suatu heap yang mana adalah root dari Heap, find max atau find min tergantung pada jenis Heap yang dipakai. jika pada mad heap lalu kita ingin find min maka hanya perlu dengan konsep searching pada array. insert menambahkan elamen atau node baru pada Heap. remove menghapus root node, dalam konteks ini heap hanya bisa menghapus root node. trickleup membandingkan dan memindahkan node terakhir dengan parent node agar parent node lebih besar daripada child node
trickledown membandingkan dan memindahkan node pertama / root node dengan child node agar parent node lebih besar daripada child node. Basic Variable Disini akan dijelaskan beberapa nama variable yang digunakan sebagai contoh untuk penjelasan selanjutnya heaparray : nama variabel array yang digunakan untuk menyimpan heap. maxsize : maksimal index dari array / maksimal panjang array yang digunakan untuk menyimpan heap. currentsize : Digunakan untuk mengetahui panjang array yang digunakan dalam heap.
Remove Remove / hapus dalam Heap berarti menghapus root dalam Tree tersebut, mudah kan? Masalahnya adalah apa yang akan terjadi setelah proses penghapusan node. Berikut adalah langkah langkah untuk menghapus elemen root. Hapus root node Pindah node terakhir ke root node. Pindah node tersebut sampai parent node lebih besar dari semua child node (trickledown). Dalam kode diatas method remove langsung menghapus / mengganti root dengan node paling terakhir this.heaparray[ this.currentsize].
Algoritma trickledown mengecek manakah dari kedua child node yang lebih besar, setelah mendapatkan node yang lebih besar, node tersebut akan dipindah atau dijadikan menjadi parent node.
Insert Menambahkan node sangatlah mudah, jika remove menggunakan trickledown, maka Insert menggunakan trickleup. Pertamanya insert kita harus menambahkan elemen pada index array terakhir, masalahnya adalah apa yg harus dilakukan setelah menambahkan di index terakhir, apa yang harus dilakukan jika node baru mempunyai nilai lebih besar daripada parent node? berikut adalah gambaran jalannya proses insert dari Heap.
Dalam kode diatas node baru newnode langsung dimasukkan pada array yang index terakhir this.heaparray[this.currentsize]. Setelah itu langsung melakukan algoritma trickleup dengan parameter this.currentsize++, dimana this.currentsize++ adalah size setalah elemen baru. TrickleUp adalah algoritma yang lebih mudah, karena kita hanya perlu membandingkan satu node saja, yaitu parent node. TrickleDown perlu membandingkan kedua child node.
Change Setelah memahami konsep dari trickleup maupun trickledown, kita dapat dengan mudah mengimplementasikan algoritma change. Jika trickleup digunakan oleh insert dan trickledown digunakan oleh remove, kalau change ada kemungkinan kita menggunakan trickleup atau trickledown tetapi tidak mungkin kita menggunakan keduanya. Cara mengetahui algoritma mana yang akan kita buat adalah dengan membandingkan nilai dari node yang lama dan node yang baru. Berikut langkah langkah dari algoritma change diatas : meng inputkan index array yang akan diubah dan nilai yang akan dimasukkan. Jika index kurang dari 0 atau lebih dari currentsize, maka dianggap gagal lalu keluar dari method tersebut. Jika >= 0 dan < this.currentsize, setelah itu membandingkan nilai dari array ber index yang diinputkan dengan nilai yang baru. Jika nilai node lama lebih kecil daripada nilai yang baru maka melakukan algoritma trickleup. Selain itu / lebih besar daripada nilai baru maka akan melakukan algoritma trickledown.
Heap.java class Heap{ private Node [] heaparray; private int maxsize; private int currentsize; public Heap ( int max ){ this. maxsize = max; this. currentsize = 0; this. heaparray = new Node [ maxsize ]; public boolean isempty (){ return ( this. currentsize == 0 ); public boolean insert ( int key ){ if ( this. currentsize == this. maxsize) return false; Node newnode = new Node ( key ); this. heaparray [ this. currentsize ] = newnode; trickleup ( this. currentsize ++); return true; public void trickleup ( int index ){ int parent = ( index - 1 ) / 2; Node bottom = this. heaparray [ index ]; while ( index > 0 && this. heaparray [ parent ]. getkey () < bottom. getkey ()){ this. heaparray [ index ] = this. heaparray [ parent ]; index = parent; parent = ( parent - 1 )/ 2; this. heaparray [ index ] = bottom; public Node remove () { Node root = this. heaparray [-- this. currentsize ]; trickledown ( 0 ); return root; public void trickledown ( int index ){ int largerchild; Node top = this. heaparray [ index ]; while ( index < this. currentsize / 2 ){ int leftchild = 2 * index + 1; int rightchild = leftchild + 1; if ( rightchild < this. currentsize &&
else this. heaparray [ leftchild ]. getkey () < this. heaparray [ rightchild ]. getkey ()) largerchild = rightchild; largerchild = leftchild; if ( top. getkey () >= this. heaparray [ largerchild ]. getkey ()) break; this. heaparray [ index ] = this. heaparray [ largerchild ]; index = largerchild; this. heaparray [ index ] = top; public boolean change ( int index, int newvalue ){ if ( index < 0 index >= this. currentsize) return false; int oldvalue = this. heaparray [ index ]. getkey (); this. heaparray [ index ]. setkey ( newvalue ); if ( oldvalue < newvalue) trickleup ( index ); else trickledown ( index ); return true; public void displayheap (){ System. out. print ( "HeapArray:" ); for ( int m = 0 ; m < this. currentsize ; m ++) if ( this. heaparray [ m ]!= null) System. out. print ( heaparray [ m ]. getkey () + "" ); else System. out. print ( ".." ); System. out. println (); int nblanks = 32; int itemsperrow = 1; int column = 0; int j = 0; String dots = "..."; System. out. println ( dots + dots ); while ( this. currentsize > 0 ){ if ( column == 0) for ( int k = 0 ; k < nblanks ; k ++) System. out. print ( "" ); System. out. print ( this. heaparray [ j ]. getkey ());
if (++ j == this. currentsize) break; if (++ column == itemsperrow ){ nblanks /= 2; itemsperrow *= 2; column = 0; System. out. println (); else{ for ( int k = 0 ; k < nblanks * 2-2 ; k ++) System. out. print ( "" ); System. out. println ( "\n" + dots + dots );
Node.java class Node { private int key; public Node ( int key ){ this. key = key; public int getkey (){ return this. key; public void setkey ( int key ){ this. key = key; HeapApp.java import java. util. Scanner; class HeapApp{ public static void main ( String [] args ){ int value, value2; Heap theheap = new Heap ( 31 ); boolean success; theheap. insert ( 70 ); theheap. insert ( 40 ); theheap. insert ( 50 ); theheap. insert ( 20 ); theheap. insert ( 60 ); theheap. insert ( 100 ); theheap. insert ( 80 ); theheap. insert ( 30 ); theheap. insert ( 10 ); theheap. insert ( 90 ); while ( true ){ System. out. print ( "Enterfirstletterof" ); System. out. print ( "show, insert, remove, change:" ); int choice = getchar (); switch ( choice ){ case 's' : theheap. displayheap (); break; case 'i' :
System. out. print ( "Entervaluetoinsert:" ); value = getint (); success = theheap. insert ( value ); if (! success) System. out. println ( "Can'tinsert; heapfull" ); break; case 'r': if (! theheap. isempty ()) theheap. remove (); else System. out. println ( "Can'tremove; heapempty" ); break; case 'c': System. out. print ( "Entercurrentindexofitem:" ); value = getint (); System. out. print ( "Enternewkey:" ); value2 = getint (); success = theheap. change ( value, value2 ); if (! success) System. out. println ( "Invalidindex" ); break; default : System. out. println ( "Invalidentry\n" ); public static String getstring () { Scanner sc = new Scanner ( System. in ); String s = sc. nextline (); return s; public static char getchar () { String s = getstring (); return s. charat ( 0 ); public static int getint (){ String s = getstring (); return Integer. parseint ( s );
Jurnal Buatlah program Heap, lalu berikan komentar yang berisi kegunaan dari method tersebut. Lakukan pada setiap method yang kalian buat, contohnya : Jika kalian membuat method setkey dengan isi method seperti dibawah ini, maka komentarnya bisa seperti berikut. // untukmemberikannilaipadavariabelkey. public void setkey ( int key ){ this. key = key; NB: Jangan biasakan copy paste kodingan dari modul, punya teman, maupun sumber dari internet, lakukan minimal menulis ulang kodingan agar bisa lebih mudah mengerti dan setidaknya membiasakan menulis cepat. Jika jujur adalah hal yang kalian miliki saat ini, maka pertahankan, karena jujur adalah hal yang lebih mahal daripada ilmu yang tinggi Prodase Assistant