ANALISIS KECEPAAN SRUKUR DAA LINKED LIS DAN REE Pradana Setialana Pendidikan eknik Informatika - Universitas Negeri ogyakarta pradana.setialana@gmail.com Abstract Binary search trees are better at displaying data, find data, update data and delete data than a circular double linked list which is only good in entering data. But the low level of complexity of the program double circular linked list is its own advantages of the binary search tree that has a high level of program complexity. Keywords: binary search tree, circular double linked list, efficient data structures, fast run time, difference between tree and linked list. 1. Pendahuluan Struktur data merupakan cara menyimpan, menyusun dan mengatur data dalam computer secara efisien, Ada berbagai macam struktur data yang masing-masing memiliki kelebihan dan kekurangan tersendiri. Dari berbagai macam strukur data yang ada, struktur data linked list dan tree hampir memiliki banyak kemiripan. Akan tetapi terdapat juga perbedaan yang membuat strukut data tersebut memiliki dan kelebihan tersendiri. 1.2 Linked List Linked list atau senarai berantai yang digunakan untuk menyimpan sejumlah objek data biasanya secara terurut sehingga memungkinkan penambahan, pengurangan, dan pencarian atas elemen data yang tersimpan dalam daftar dilakukan secara lebih efektif. Pada praktiknya sebuah struktur data memiliki elemen yang digunakan untuk saling menyimpan rujukan antara satu dengan lainnya sehingga membentuk sebuah daftar abstrak, tiap-tiap elemen yang terdapat pada daftar abstrak ini seringkali disebut sebagai node. karena mekanisme rujukan yang saling terkait inilah disebut sebagai daftar berantai (linked list). Sedangkan circular double linked list sendiri merupakan jenis linked list dimana rujukan pada node terakhir akan merujuk pada node pertama, dan rujukan pada node pertama akan merujuk pada node terakhir bila yang digunakan sebagai dasar implementasi adalah daftar bertaut ganda (circular double linked list [1]. Penjelasan mengenai linked list terdapat pada Figure 1 dan circular double linked list pada Figure 2. Fig. 1. Setiap node yang terdiri atas dua elemen, data integer, dan elemen rujukan ke node berikutnya Fig. 2. Node terakhir menyimpan rujukan pada node pertama 1.3 ree ree adalah adalah suatu struktur data yang digunakan secara luas yang menyerupai struktur pohon dengan sejumlah simpul yang terhubung. Sedangkan pohon biner (binary tree) adalah sebuah pohon struktur data dimana setiap simpul memiliki paling banyak dua anak. Secara khusus anaknya dinamakan kiri dan kanan. Penggunaan secara umum dari binary tree adalah binary search tree. Binary search tree memiliki sifat-sifat yaitu subtree sebelah kiri memiliki nilai yang lebih rendah daripada node kunci. Sedangkan subtree sebelah kanan memiliki nilai yang lebih tinggi daripada node kunci [2].
2. Metodologi Metodologi penilitian untuk menganalisis persamaan, perbedaan, dan keefisien linked list dan tree adalah 1. Membandingkan cara kerja masing-masing fungsi berdasarkan flowchart 2. Membandingkan komplektifitas setiap program. 3. Menganalisis hasil running program dan waktu eksekusi pada kedua program Masing-masing program dapat menyimpan data mahasiswa yang berisi nim, nama, jurusan dan ipk dalam bentuk program circular double linked list dan tree. Untuk menguji penggunaan memori dan kecepatan eksekusi dilkakukan kondisi yang sama untuk setiap fungsi pada circular double linked list dan binary search tree. Data untuk menguji merupakan data mahasiswa yang berjumlah 6969 data berupa NIM, Nama, Jurusan dan IPK. Data tersebut diambil dari Siakad UN yang diberikan pada matakuliah Basis Data dengan format file text (.txt). Media pengujian adalah notebook Acer 4745G dengan spesifikasi processor Incel Core i5 430M, RAM 2 GB, AI Mobiliti Radeon HD 5470 dengan VRAM 512 MB. erdapat dua kondisi daya listrik notebook yaitu kondisi power saver (menggunakan kemampuan processor sedikit) dan kondisi high performance Intel urbo Bost (Menggunakan kemampuan penuh processor). Untuk setiap kondisi daya listrik terdapat 2 percobaan. Hasil dari penghitungan dalam millisecond. Sehingga untuk waktu eksekusi dibawah millisecond yaitu dalam hitungan nanosecond maka akan tercetak 0 ms. 3. Penelitian Pembandingkan setiap struktur data berdasarkan setiap method yang memiliki fungsi yang sama. Perbandingan dilakukan dengan membandingkan flowchart dan waktu eksekusi setiap fungsi. 3.1 Memasukan Data Pada tahap ini akan dilakukukan analisis dari kedua program mengenai cara, metode, kerumitan serta keefektifitasan program. Pada Figure 3 terdapat flowchart dari method insertfirst dan insertlast dari circular double linked list. Sedangkan pada Figure 4 terdapat method insert dari binary search tree. isempty() first ß newnode isempty() last ß newnode newnode.setnext(first) first.setprev(newnode) last.setnext(newnode) newnode.setnext(last) last.setnext(newnode) newnode.setprev(last) first ß newnode last ß newnode first.setprev(last) first.setprev(newnode) newnode.setnext(first) Fig. 4. Flowchart insertfirst (kiri) dan insertlast (kanan) pada circular double linked list
root ß null root ß newnode current ß root true parent ß current nim.compareo(current. nimmahasiswa)<0 current ß current.leftchild current ß null parent.leftchild ß newnode return current ß current.rightchild current ß null parent.rightchild ß newnode Fig. 5. Flowchart insert pada binary search tree
Dari perbandingan dua flowchart tersebut terlihat bahwa method insert pada binary search tree lebih kompleks. Hal ini terlihat dengan adanya pengurutan data pada setiap data. Data yang masuk dengan nimmahasiswa yang lebih rendah daripada node kunci akan diletakan pada subtree sebelah kanan, sementara data dengan nimmahasiswa lebih tinggi akan diletakan pada sebelah kanan. Sementara pada circular double linked list data masuk tidak langsung diurutkan. Hal ini menyebabkan method insert pada circular double linked list hanya sederhana dan tidak sekompleks method insert pada binary search tree. Pada Figure 4 terdapat syntax newnode.setnext(first); first.setprev(newnode); last.setnext(newnode); yang menunjukan bahwa setiap data yang masuk akan langsung disambungkan membentuk linked list tanpa diurutkan terlebih dahulu. Sedangkan pada binary search tree setiap data masuk akan diurutkan sesuai dengan nimmahasiswa. Ini terlihat pada syntax nim.compareo(current.nimmahasiswa )<0. Dilihat dari flowchart tersebut maka kemungkinan waktu eksekusi dari binary tree lebih lambat. Untuk membuktikan bias dilihat di tabel pengujian pada abel 1. Dari hasil tabel tersebut bias diambil kesimpulan bahwa kecepatan memasukan data pada circular double linked list lebih cepat dari binary search tree. Hal ini disebabkan karena pada binary tree data yang masuk diurutkan terlebih dahulu. Sedangkan pada circular double tidak diurutkan. Kondisi Daya Percobaan Circular Double Linked List Binary Search ree Power Saver Percobaan 1 113 ms 168 ms Percobaan 2 115 ms 128 ms High Performance Percobaan 1 56 ms 64 ms Percobaan 2 54 ms 66 ms abel 1. Perbandingan waktu eksekusi memasukan data 3.2 Menampilkan Data Circular double linked list memiliki beberapa cara untuk menampilkan data yaitu menampilkan data pertama, data terakhir, menampilkan semua data dari belakang dan menampilkan semua data dari belakang. etrapi untuk membandingkan dengan menampilkan data pada binary search tree hanya digunakan menampilkan semua data dari depan. Sedangkan untuk binary search tree untuk menampilkan data yaitu dengan cara traversal yaitu preoder, inorder dan postorder. Untuk menjelaskan perbedannya yaitu dengan flowchart yang ada pada Figure 6 dan Figure 7. Pada Figure 6 terdapat flowchart menampilkan semua data dari depan untuk circular double linked list. Pada Figure 7 terdapat flowchart traversal untuk binary search tree.!isempty() indek ß first indek.getdatamahasiswa() indek ß indek.getnext() Indek<>last.getNext() "idak ada data" Fig. 6. Method get_all. Menampilkan semua data dari depan pada circular double linked list
localroot <> null localroot.displaynode() preorder(localroot.leftchild) preorder(localroot.rightchild) localroot <> null inorder(localroot.leftchild) localroot.displaynode() inorder(localroot.rightchild) localroot <> null postorder(localroot.leftchild) postorder(localroot.rightchild) localroot.displaynode() Fig. 7. preorder (kiri atas), inorder (kanan atas), postorder (bawah) Dari flowchart tersebut dapat diambil kesimpulan bahwa untuk menampilkan data pada circular double linked list hanya dengan menggeser pointer indek ke node berikutnya kemudian menampilkan node tersebut. Sehingga alur kerjanya cukup sederhana. Sedangkan pada binary search tree untuk menampilkan data secara traversal menggunakan rekrusif. Hal ini tentunya membutuhkan memory yang besar dan alur kerja yang lebih rumit. Untuk membandingkan kecepatan waktu eksekusi dari kedua program yaitu dengan menampilkan data sejumlah 6969 data mahasiswa yang sama dengan data yang dimasukan pada method insert. abel perbandingan waktu eksekusi program ada pada abel 2. Kondisi Daya Percobaan Circular Double Linked List Binary Search ree get_all preorder inoreder postorder Rata-rata Power Saver Percobaan 1 647 ms 601 ms 541 ms 564 ms 568 ms Percobaan 2 561 ms 601 ms 463 ms 429 ms 497 ms High Performance Percobaan 1 347 ms 504 ms 410 ms 502 ms 472 ms Percobaan 2 454 ms 502 ms 380 ms 318 ms 400 ms 3.3 Mencari Data Pada tahap ini kedua program akan diuji perbandingan dari masing-masing program. Circular double linked list memiliki kelemahan pada tahap ini yaitu data yang ada disimpan tidak urut karena urutan data hanya berdasarkan dari urutan memasukan data. Data yang terurut akan memiliki kecepatan pencarian yang lebih cepa daripada data yang tidak terurut. Sedangkan binary abel 2. Perbandingan waktu eksekusi menampilkan data search tree menyimpan data secara urut karena pada awal memasukan data, setiap data dibandingkan terlebih dahulu mana data yang memiliki nilai yang lebih tinggi atau rendah. Seperti dalam Figure 8 dan Figure 9, dalam kasus ini adalah data mahasiswa sehingga pencarian dilakukan berdasarkan nimmahasiswa. Pada Figure 8 tersebut, terlihat bahwa metode pencarian data sama dengan linear search. aitu pencarian data secara beruntun
dengan membandingkan setiap node. Setiap String getnim pada node indeks di bandingkan dengan String cari. Indeks tersebut adalah node yang berubah ke node berikutnya jika pada node tersebut nim tidak cocok. Pembandingan String nim tersebut akan terus berlangsung hingga indeks kembali ke node terakhir. indeks ß first cek ß true indeks.getnim().compareo(cari) <> 0 cek ß true "data ditemukan : " indeks.getnext() ß first "data tidak ditemukan" indeks.getdatamahasiswa() cek ß false indeks ß indeks.getnext() Fig. 8. Flowchart method getdata untuk mencari data pada circular double linked list
current ß root current.nimmahasiswa.com pareo(key)<>0 key.compareo(current.ni mmahasiswa)<0 current ß current.leftchild current ß current.rightchild current ß null return null return current Fig. 9. Flowchart method find(string key) untuk mencari data pada binary search tree Flowchart pada Figure 8 merupakan flowchart untuk mencari data pada circular double linked list. Pada flowchart tersebut diketahui bahwa untuk mencari data, circular double linked list harus membandingkan setiap nimmahasiswa hingga nilai dari compareo = 0 yang menandakan bahwa data ditemukan. Hal ini tentunya menggunakan waktu terlalu lama karena data yang berupa String tersebut harus dibandingkan satu persatu hingga sejumlah data yang ada yaitu 6969 data. Berbeda dengan
binary search tree yang terdapat pada Figure 8. Karena data pada binary search tree sudah terurut dan tersusun maka cara mencari data hanya dengan membandingkan dengan node current. Jadi jika data yang dicari memiliki nilai lebih rendah daripada current maka pencarian akan beralih ke subtree sebelah kiri, tetapi jika data yang dicari lebih tinggi daripada node current maka pencarian akan dilakukan pada subtree sebelah kanan. Hal ini menyebabkan tidak semua data dibandingkan sehingga memungkinkan pencarian lebih cepat. Untuk lebih jelasnya terdapat tabel uji waktu eksekusi program pada abel 3. Waktu yang menunjukan 0 ms berarti bahwa waktu eksekusi kurang dari millisecond yaitu berkisar nanosecond. Kondisi Daya Percobaan Circular Double Linked List Binary Search ree Power Saver Percobaan 1 2 ms 0 ms Percobaan 2 4 ms 0 ms High Performance Percobaan 1 3 ms 0 ms Percobaan 2 2 ms 0 ms 3.4 Mengupdate Data Pada dasarnya metode mengupdate data hampir sama dengan mencari data. Hanya saja ketika data ditemukan maka data tersebut kemudian dirubah ataupun ditambahkan. ahap untuk update data yaitu dengan mencari data yang ingin diupdate abel 3. Perbandingan waktu eksekusi mencari data berdasarkan nimmahasiswa kemudian jika data tersebut ditemukan maka data namamahasiswa, jurusanmahasiswa dan ipkmahasiswa dapat dirubah. Sehingga alur update data juga tidak jauh berbeda dengan alur pencarian. Seperti pada Figure 10 dan Figure 11. indeks ß first cek ß true indeks.getnim().compareo(cari) <> 0 cek ß true indeks.setupdate(nama, jurusan, ipk) indeks.getnext() ß first "data tidak ditemukan" "Data berhasil di update " cek ß false indeks.getdatamahasiswa() indeks ß indeks.getnext() Fig. 10. Flowchart method updatedata untuk mengupdate data pada circular double linked list
current ß root current.nimmahasiswa.com pareo(key)<>0 key.compareo(current.ni mmahasiswa)<0 current ß current.leftchild current ß current.rightchild current ß null "Data tidak ditemukan" current.namamahasiswa ß nama current.jurusanmahasiswa ß jurusan current.ipkmahasiswa ß ipk Fig. 11. Flowchart method update untuk mengupdate data pada binary search tree Pada flowchart tersebut dapat dilihat bahwa untuk mencari data yang akan diupdate menggunakan cara yang sama dengan yang digunakan pada method mencari. Dari Figure 10 dan Figure 11 tersebut dapat dilihat bahwa kemungkinan hasil waktu eksekusi dari kedua program tidak akan berbeda jauh dari hasil waktu eksekusi program. Untuk lebih detailnya mengenai waktu eksekusi dapat dilihat pada abel 4.
Kondisi Daya Percobaan Circular Double Linked List Binary Search ree Power Saver Percobaan 1 2 ms 0 ms Percobaan 2 3 ms 0 ms High Performance Percobaan 1 1 ms 0 ms Percobaan 2 2 ms 0 ms 3.5 Menghapus Data Cara untuk menghapus data dari kedua program adalah dengan mencari terlebih dahulu data yang ingin dihapus. Jika data tersebut ditemukan maka data tersebut akan dihapus. Untuk menghapus data pada circular double linked list adalah dengan menyambungkan node sebelum dan setelah node yang akan dihapus (Figure 12). Syntax untuk menyambungkan adalah indeks.getprev().setnext (indeks.getnext()) dan abel 4. Perbandingan waktu eksekusi update data indeks.getnext().setprev (indeks.getprev()). Sedangkan untuk menghapus node pada binary search tree lebih rumit dan lebih kompleks daripada circular double linked list. Hal ini karena posisi node dalam binary tree harus urut dan sesuai struktur binary search tree. Ketika terjadi penghapusan node, maka posisi node yang dihapus tersebut harus digantikan oleh node dimana node tersebut sesuai dengan struktur dari binary search tree. Untuk lebih jelasnya dapat dilihat pada Figure 13. indeks ß first cek ß true indeks.getnim().compareo(cari) <> 0 cek ß true indeks ß first removefirst() "data berhasil di delete" indeks.getnext() ß first "data tidak ditemukan" indeks <> first && indeks <> last indeks.getprev().setnext (indeks.getnext()) indeks.getnext().setprev (indeks.getprev()) cek ß false removelast(); "data berhasil di delete" indeks ß indeks.getnext() "data berhasil di delete" Fig. 12. Flowchar menghapus data pada circular double linked list.
current ß root parent ß root isleftchild ß true current.nimmahasiswa.compareo(key) <> 0 current.leftchild ß null & current.rightchild ß null A parent ß current current ß root root ß null key.compareo(current.nimmahasiswa)<0 isleftchild ß true current ß current.leftchild isleftchildß true parent.leftchild ß null isleftchild ß false current ß current.rightchild parent.rightchild ß null current ß null return false B Fig. 13.1 Flowchart fungsi untuk menghapus data pada binary search tree
A current.rightchild ß null current.leftchild ß null successor ß getsuccessor(current) current ß root root ß null isleftchild parent.leftchild ß current.rightchild current ß root root ß successor isleftchild parent.leftchild ß current.leftchild parent.rightchild ß current.rightchild isleftchild parent.leftchild ß successor parent.rightchild ß current.leftchild parent.rightchild ß successor B return true successor.leftchild ß current.leftchild Fig. 13.2 Flowchart fungsi untuk menghapus data pada binary search tree Penghupusan node pada binary search tree sangat komplek dan lebih rumit daripada penghapusan node pada circular double linked list. Pada binary search tree erdapat berbagai macam kondisi node yang akan dihapus yaitu ketika node tersebut merupakan leaf atau tidak mempunyai anak, node tersebut memiliki 1 anak di kanan, node tersebut memiliki 1 anak di kiri dan node tersebut memiliki 2 anak. erdapat tiga tahap untuk menghapus node yang memiliki 2 anak [3]. 1. Cari nilai minimum node pada subtree sebelah kanan (Figure 14) 2. Mengganti nilai node yang akan dihapus dengan nilai minimum yang ditemukan tersebut (Figure 15) 3. Hapus node dengan nilai minimum tersebut (Figure 16) Untuk memahami tahapan menghapus node yang memiliki dua anak tersebut dapat dilihat pada Figure 14, Figure 15 dan Figure 16 yang mensimulasukan penghapusan node 12.
Fig. 14. Nilai minum dari subtree sebelah kanan adalah 19 Fig. 15. Nilai pada node 12 dirubah menjadi 19 Fig. 16. Node 19 pada subtree 21 dihapus
Kerumitan dari penghapusan node pada binary search tree ini merupakan kelemahan dibandingkan dengan cirucal double linked list. Akan tetapi dibalik kerumitan tersebut binary search tree masih unggul dalam waktu eksekusi program. Untuk membuktikannya dapat dilihat pada abel 5. Kondisi Daya Percobaan Circular Double Linked List Binary Search ree Power Saver Percobaan 1 3 ms 0 ms Percobaan 2 2 ms 0 ms High Performance Percobaan 1 1 ms 0 ms Percobaan 2 1 ms 0 ms abel 5. Perbandingan waktu eksekusi menghapus node 4. Hasil Penelitian berubah. Sedangkan perbedaanya adalah linked list Dari berbagai perbandingan dalam penelitian merupakan strukur data linear sedangkan binary tersebut dapat diketahui perbedaan, persamaan serta search tree merupakan strukur data hirarkis [4]. kelebihan dan kekurangan dari struktur data circular Hasil dari waktu eksekusi program pada abel 6 double linked list dan binary search tree. Persamaan digunakan untuk analisis serta mengambil dari tree dan linked list adalah sama-sama struktur kesimpulan mengenai struktur data circular double data dinamis yaitu jumlah komponennya dapat linked list dan binary search tree. Percobaan Fungsi Circular Double Linked List Binary Search ree Percobaan 1 Power Saver Percobaan 2 Power Saver Percobaan 1 High Performance Percobaan 2 High Performance Memasukan Data 113 ms 168 ms Menampilkan Data 647 ms 568 ms Mencari Data 2 ms 0 ms Update Data 2 ms 0 ms Delete Data 3 ms 0 ms Memasukan Data 115 ms 128 ms Menampilkan Data 561 ms 497 ms Mencari Data 4 ms 0 ms Update Data 3 ms 0 ms Delete Data 2 ms 0 ms Memasukan Data 56 ms 64 ms Menampilkan Data 347 ms 472 ms Mencari Data 3 ms 0 ms Update Data 1 ms 0 ms Delete Data 1 ms 0 ms Memasukan Data 54 ms 66 ms Menampilkan Data 454 ms 400 ms Mencari Data 2 ms 0 ms Update Data 2 ms 0 ms Delete Data 1 ms 0 ms abel 6. Perbandingan waktu eksekusi program untuk semua fungsi. Dari abel 6 tersebut maka dapat dianalisis : 1. Fungsi memasukan data Waktu eksekusi pada binary search tree lebih lama daripada circular double linked list. Ini dikarena data yang masuk pada binary search tree langsung diurutkan dan disusun sesuai struktur tree sedangkan untuk circular double linked list data yang masuk langsung ditempatkan dalam node-node yang tersambung begitu saja sesuai urutan memasukan data. etapi fungsi memasukan file pada binary tree lebih rumit daripada circular double linked list (Figure 5). 2. Fungsi menampilkan data Waktu eksekusi rata-rata untuk traversal pada binary search tree lebih cepat daripada waktu eksekusi fungsi menampilkan data dari depan pada circular double linked list. Hal ini dikarenakan binary search tree menggunakan rekrusif untuk menampilkan data. etapi penggunaan rekrusif menyebabkan memory yang lebih besar dan sulit untuk dipahami [5]. 3. Fungsi mencari data Waktu eksekusi binary search tree lebih cepat daripada circular double linked list bahkan kecepatan eksekusi kurang dari hitungan
millisecond (nanosecond) sehingga pada ujicoba selalu menampilkan nilai 0 ms. Ini disebabkan karena dalam proses mencari data yang dicari tidak dibandingkan satu persatu dengan setiap node. Sedangkan pada circular double linked list data dibandingkan satu persatu hingga waktu yang digunakan lebih lama. 4. Fungsi mengupdate data Waktu eksekusi binary search tree lebih cepat daripada circular double linked list karena fungsi dari update sendiri sama dengan mencari. Jika data yang akan diupdate ditemukan maka akan dilakukan perubahan pada data itu. 5. Fungsi menghapus data Sama dengan mengupdate, waktu eksekusi binary search tree lebih cepat dari circular double linked list karena fungsi ini menggunakan fungsi yang sama dari mencari. Hanya saja fungsi delete pada binary search tree sangat rumit dikarenakan ketika node dihapus jangan sampai mengubah struktur dan urutan dari binary search tree sehingga terganti pergantian posisi pada node. etapi walau tingkat kerumitan dari fungsi menghapus node tinggi tetapi waktu eksekusi tetap lebih cepat daripada binary search tree. Untuk lebih jelasnya mengenai analisis terdapat pada abel 7. Fungsi Circular Double Linked List Binary Search ree Memasukan Data Eksekusi lebih cepat Eksekusi lebih lambat Menampilkan Data Eksekusi lambat Eksekusi cepat, menggunakan memori lebih besar Mencari Data Eksekusi lambat Eksekusi cepat Update Data Eksekusi lambat Eksekusi cepat Delete Data Eksekusi lambat Eksekusi cepat, alur fungsi kompleks dan sulit dipahami abel 7. Analisis circular double linked list dan binary search tree. 5. Kesimpulan Dari hasil penelitian tersebut maka dapat diambil kesimpulan bahwa pengujian kecepatan waktu eksekusi bergantung pada spesifikasi komputer yang digunakan. Semakin tinggi spesifikasi komputer maka waktu eksekusi akan semakin cepat. Dalam konteks ini data yang diujikan adalah data mahasiswa yang terdiri dari nim, nama, jurusan serta ipk yang memiliki tipe data String. Untuk waktu eksekusi, binary tree lebih unggul daripada circular double linked list dari menampilkan data, mencari data, update data dan delete data. Sedangkan untuk memasukan data, circular double linked list lebih cepat. Dilihat dari alur fungsi dan kerumitan program maka binary search tree lebih kompleks dan lebih rumit daripada circular double linked list. 6. Referensi [1] Wikipedia. Daftar Bertaut. http:// id.wikipedia.org/wiki /Daftar_bertaut (diakses tanggal 27 Desember 2011) [2] Wikipedia. Pohon Biner. http://id.wikipedia.org/ wiki/ Pohon_biner (diakses tanggal 27 Desember 2011) [3] Algolist. Binary Search ree Removing Node. http://www.algolist.net/data_structures/ Binary_search _tree / Removal. (diakses tanggal 28 Desember 2011) [4] Nusinau. Dianita Struktur Data. http:// www.nusinau.com/ dianita-struktur-data/ (diakses tanggal 28 Desember 2011) [5] Unikom. Recrusive. http://elib.unikom.ac.id/files/ disk1/392/jbptunikompp-gdl-dianaeffen-19571-9- pertemua-9.pdf (diakses tanggal 28 Desember 2011)