struktur data - ryancom.files.wordpress.com · title: microsoft word - struktur data.doc author:...
TRANSCRIPT
-
Struktur Data
24Diktat Kuliah Struktur Data : Noferianto Sitompul
STRUKTUR DATA
Diktat Kuliah
OLEH : Noferianto Sitompul
STMIK BUDIDARMA MEDAN2016
-
Struktur Data
25Diktat Kuliah Struktur Data : Noferianto Sitompul
KATA PENGANTAR
Merancang sebuah program sangat didukung oleh tatanan struktur data yang benar,
Struktur Data merupakan bagian yang sangat penting (program = algoritma + struktur data)
untuk dikuasai. Hampir semua bahasa pemrograman menggunakan bantuan struktur data
untuk mendisain program, perlu dibedakan bahwa struktur data tidak sama dengan sintaksis,
dimana sintaksis merupakan tata tulis sedangkan struktur data menyangkut proses
semantiknya (makna). Contoh array, linked list, stack, queue, tree, graph. Dari terminologi-
terminologi tersebut perlu dibedakan kapan menggunakan mereka. Efisiensi dan
kompleksitas mungkin salah satu konsideran yang mungkin ada hubungannya dengan
memory ataupun tentang disain programnya, itu sebabnya bahwa struktur data harus benar-
benar dipahami apalagi untuk disain program yang kuantitasnya sangat besar (berskala
besar).
Melihat kompleksnya pemahaman akan struktur data, maka penulis mencoba
menuangkan materi-materi struktur data dalam diktat ini dengan berdasarkan pengalaman
mendisin program dan juga didukung dengan rujukan-rujukan buku yang up to date.
Sekalipun demikian penulis sadar masih banyak yang kurang rinci atau kurang deskriptif
bahkan tidak terbahas dikarenakan mengingat waktu penyusunan sangat singkat dan urgensi
penggunaan sangat perlu. Oleh sebab itu penulis akan sangat berterimakasih kepada para
pembaca yang berkenan memberikan saran-saran atau masukan-masukan kepada penulis
untuk seterusnya ditindak lanjuti.
Akhir kata Penulis mengucapkan banyak terimakasih semua pihak yang terlibat baik
secara langsung atau tidak langsung dalam penyusunan Diktat ini, semoga berguna dan
dapat membantu anda dalam memahami struktur data.
Medan, September 2016
Penulis,
Noferianto Sitompul
-
Struktur Data
26Diktat Kuliah Struktur Data : Noferianto Sitompul
DAFTAR ISIHalaman :
Lembar JudulKata Pengantar ……….. iDaftar Isi ……….. iiDaftar Gambar ……….. ivDaftar Tabel ……….. viBab I. Pendahuluan ……….. 1I.1. Pengertian ……….. 1I.2. Konsep Array ……….. 2I.3. Konsep Linked List ……….. 2I.4. Konsep Tree ……….. 3I.5. Konsep Stack ……….. 4I.6. Konsep Queue ……….. 4I.7. Konsep Graph ……….. 4Bab II. Fungsi, Tipe Data dan Notasi Algoritma ……….. 5II.1. Fungsi dan Notasi Matematika ……….. 5II.2. Tipe Data ……….. 6II.3. Notasi Algoritma ……….. 7Bab III. Array, Record, Set, Pointer ……….. 8III.1. Array ……….. 8III.2. Record ……….. 10III.3. Set ……….. 11III.4. Pointer ……….. 12Bab IV. Linked List ……….. 13IV.1. Statemen New, Dispose dan Variabel Pointer ……….. 13IV.2. Linked List (linier) ……….. 14IV.2.1. Algortima Traversal Linked List ……….. 15IV.2.2. Algortima Sisip Data Dalam Linked List ……….. 16IV.2.3. Algortima Hapus Data Dalam Linked List ……….. 17IV.3. Linked List Dengan Multi Pointer ……….. 21IV.3.1. List Circular ……….. 21IV.3.2. Linked List Multi Arah ……….. 22Bab V. Notasi Polish, Rekursif, Stack, Queue ……….. 26V.1. Notasi Polish ……….. 26V.2. Rekursif ……….. 27V.3. Stack ……….. 29V.4. Queue ……….. 30Bab VI. Tree ……….. 33VI.1. Pemahaman ……….. 33VI.2. Binary Tree ……….. 37VI.3. Binary Search Tree ……….. 38VI.3.1. Konsep Umum BST ……….. 38VI.3.2. Representasi BST Dalam Array ……….. 40VI.3.3. Operasi Hapus dan Sisip Dalam BST ……….. 41VI.4. AVL-Tree ……….. 43VI.5. B-Tree ……….. 50VI.6. Binary B-Tree ……….. 57
-
Struktur Data
27Diktat Kuliah Struktur Data : Noferianto Sitompul
Halaman :
Bab VII. Hashing dan Kompresi ……….. 63VII.1. Konsep Hash ……….. 63VII.2. Linier Probing ……….. 65VII.3. Quadratic Probing ……….. 66VII.4. Kompresi ……….. 71Bab VIII Graph ……….. 80VIII.1. Defenisi Graph ……….. 80VIII.2. Shortest path Problem ……….. 81VIII.3. Algoritma Minimal Spanning Tree ……….. 82
-
Struktur Data
28Diktat Kuliah Struktur Data : Noferianto Sitompul
DAFTAR GAMBAR
Halaman :
Gambar 1.1. Bentuk List ……….. 2Gambar 1.2. Jenis-jenis Linked List ……….. 3Gambar 1.3. Bentuk Pohon ……….. 3Gambar 1.4. Bentuk Tumpukan ……….. 4Gambar 1.5. Bentuk Antrian ……….. 4Gambar 1.6. Bentuk salah satu graph .............. 4Gambar 3.1. Diagram Proses Array ……….. 8Gambar 3.2. Konsep Array dalam memory ............. 9Gambar 3.3. Bentuk Array Linier ……….. 10Gambar 3.4. Diagram Proses Record ……….. 10Gambar 3.5. Diagram Proses Set ……….. 11Gambar 4.1. Operasi New dan Dispose ……….. 13Gambar 4.2. Operasi Entry List ……….. 13Gambar 4.3. Operasi Pointer Next ……….. 13Gambar 4.4. Deskripsi Linked List ……….. 14Gambar 4.5. Operasi Pertukaran Head List ……….. 14Gambar 4.6. Linked List Dengan 5 Node ……….. 14Gambar 4.7. Proses Pointer Dalam Linked List ……….. 14Gambar 4.8. Bentuk Implementasi New Dalam List Array ……….. 14Gambar 4.9. Bentuk Sisipan List Baru Dalam Linked List ……….. 16Gambar 4.10. Proses penyisipan list baru pada Linked List ……….. 16Gambar 4.11. Proses penghapusan suatu list dari Linked List ……….. 17Gambar 4.12. Linked List Circular ……….. 21Gambar 4.13. List Dua Arah ……….. 22Gambar 4.14. List Circular Dua Arah ……….. 22Gambar 4.15. Proses Hapus Pada List dua Arah ……….. 23Gambar 4.16. Proses Sisip Node Baru Pada List dua Arah ……….. 23Gambar 5.1. Menara Hanoi ……….. 28Gambar 5.2. Operasi Stack ……….. 29Gambar 5.3. Diagram Antrian ……….. 31Gambar 5.4. Proses Enqueue ……….. 31Gambar 5.5. Proses Dequeue ……….. 31Gambar 6.1. Bentuk Umum Tree ……….. 33Gambar 6.2. Pohon Dengan Pola Rekursif ……….. 33Gambar 6.3. Subtree Dari Tree ……….. 34Gambar 6.4. Bentuk Binary Tree ……….. 37Gambar 6.5. Rute Kunjungan Dengan Preorder, Post Order, inorder ………. 37Gambar 6.6. Probe Dalam Pohon ……….. 39Gambar 6.7. Pohon Seimbang ……….. 39Gambar 6.8. Representasi BST Dalam Array ……….. 40Gambar 6.9. Operasi Sisip Node Dalam BST ……….. 41Gambar 6.10. Operasi Node Dengan BST ……….. 41Gambar 6.11. Rotasi Tunggal Pada AVL Tidak Seimbang ……….. 46Gambar 6.12. Rotasi Ganda Pada AVL Tidak Seimbang ……….. 46
-
Struktur Data
29Diktat Kuliah Struktur Data : Noferianto Sitompul
Halaman :
Gambar 6.13. Pohon Bentukan BST ……….. 47Gambar 6.14. AVL-Tree ……….. 48Gambar 6.15. B-Tree dengan M key ……….. 51Gambar 6.16. B-Tree Untuk Order 2 ……….. 51Gambar 6.17. B-Tree Dengan Sisipan Data ……….. 52Gambar 6.18. Keadaan B-Tree Setelah Proses Penyisipan Data ……….. 53Gambar 6.19. Keadaan B-Tree Setelah Proses Penghapusan Data ……….. 54Gambar 6.20. Representasi Node Dalam BB-Tree ……….. 58Gambar 6.21. Penyisipan Node Pada BB-Tree ……….. 59Gambar 6.22. Penghapusan Node Pada BB-Tree ……….. 59Gambar 6.23. Pengembangan Hedge Tree Pada Proses Sisip ……….. 60Gambar 7.1. Metode Midsquare ……….. 64Gambar 7.2. Proses Linier Probing ……….. 64Gambar 7.3. Quadratic Probing ……….. 66Gambar 7.4. Infinitive Probing ……….. 67Gambar 7.5. Rehashing ……….. 69Gambar 7.6. Pembentukan Subtree Pohon Huffman ……….. 71Gambar 7.7. Proses Pembentukan Pohon Huffman ……….. 73Gambar 8.1. Graph Berarah ……….. 80Gambar 8.2. Graph Berarah SPP ……….. 81Gambar 8.3. Graph Berarah SPP lain ……….. 81Gambar 8.4. Algoritma MST Prims ……….. 83Gambar 8.5. Algoritma MST Kruskal ……….. 83
-
Struktur Data
30Diktat Kuliah Struktur Data : Noferianto Sitompul
DAFTAR TABEL
Halaman :
Tabel 2.1. Tipe Data Integer ……….. 6Tabel 2.2. Tipe Data Real ……….. 7Tabel 5.1. Skala Prioritas ……….. 26Tabel 5.2. Operasi Stack ……….. 27Tabel 6.1. Jumlah Data Tiap Level ……….. 39Tabel 7.1. Proses Probing ……….. 66Tabel 7.2. Proses Infinitive Probing ……….. 67Tabel 7.3. Konversi Alpabetik Dengan Fungsi Ordinal ……….. 68Tabel 7.4. Fungsi Rehashing ……….. 68Tabel 7.5. Penempatan Probing ……….. 68Tabel 7.6. Data Pohon Huffman ……….. 71Tabel 7.7. Kode Karakter ……….. 73Tabel 7.8. Proses Dekoding ……….. 78
-
Struktur Data
31Diktat Kuliah Struktur Data : Noferianto Sitompul
BAB IPENDAHULUAN
I.1. PENGERTIANBerbicara dengan struktur data maka perlu memperhatikan beberapa aspek seperti
logika, algoritma dan kompleksitas program. Struktur data menjadi sangat penting dalammendisain sebuah program yang efisien dengan akses yang sangat efektif. Sebuah programmerupakan proses bentukan dari stuktur data dan algoritma.
Data diorganisasi sedemikian rupa dengan cara yang berbeda-beda, baik menurutlogika maupun model model matematika kemudian disusun menurut aturan-aturan yangbenar yang disebut dengan struktur data. Data adalah fakta-fakta / angka-angka yang sudahterekam tetapi belum digunakan untuk suatu keperluan. Struktur adalah elemen-elemenpebentuk atau pengaturan hubungan antar elemen dalam suatu sistem.
Model data dapat dipandang dengan 2 cara yaitu :1. Struktur yang cukup menghubungkan data dalam dunia nyata2. Struktur sederhana untuk dapat mengefektifkan proses data yang diperlukan.
Struktur data dibagi atas 3 tingkatan struktur yaitu :1. Defenisi fungsional2. Referensi logika3. Struktur fisik
Nilai data (data value) adalah suatu data yang dipandang sebagai satu kesatuan tunggal(single entity) sedangkan tipe data adalah kombinasi antara himpunan nilai data (set ofvalue) dan himpunan operasi terhadap nilai-nilai data tersebut.
Struktur data abstrak dibagi menjadi beberapa bagian yaitu :1. List linier (Linked list)2. linked list banyak (Multi linked list)3. Tumpukan (Stack)4. Antrian (Queue)5. Pohon (Tree)6. Grafik (Graph)
Struktur data non abstrak dikelompokkan dalam beberapa bagian yaitu :1. Set2. Array3. Record4. File5. Pointer, dan lain-lain
Tipe data abstrak (TDA)Dapat dipadang sebagai model matematika dan sekumpulan operasi yang
didefenisikan terhadap suatu model.
-
Struktur Data
32Diktat Kuliah Struktur Data : Noferianto Sitompul
Contoh :Himpunan bilangan bulat : {...,-3,-2,-1,0,1,2,3,...} operasi yang dapat dilakukan terhadaphimpunan ini adalah gabungan, irisan, dan lain-lain.TDA dapat dibagi menjadi :1. Generalisasi : proses membangkitkan tipe-tipe data dasar / primitif (real, integer, dan
lain-lain) seperti juga prosedur yang merupakan generalisasi dari operasi-operasi dasar,seperti : +, -, *, /, dan lain-lain
2. Enkapsulasi : Merupakan TDA yang melingkupi / menyelimuti tipe data, artinyadefenisi jenis data dan operasi-operasi yang diperbolehkan dilokalisasi dalam satubagian program. Tipe data dari sebuah variabel adalah kumpulan nilai tertentu yangdimuat oleh variabel tersebut. Misalnya tipe data boolean yang hanya bernilai true ataufalse dan tidak boleh yang lain.
I.2. KONSEP ARRAYArray merupakan struktur data yang paling sederhana, kesederhanaannya dapat
dilihat dari pemberian notasi model linier (dimensi). Dalam array linier dengan jumlah dataterbatas (finite) didefenisikan sebagai berikut : A1, A2, A3, ..., An atau dengan notasi dalamkurung :
A(1), A(2), A(3), ..., A(n)atau dengan notasi dalam kurung siku :
A[1], A[2], A[3], ... A[n].Dilihat dari notasi-notasi di atas bahwa A adalah variabel operand dan 1, 2, 3, ... , n adalahindeks yang menyatakan sekuensi proses.
Selain model notasi linier satu dimensi juga diperbolehkan untuk dua atau tigadimensi misalnya, dengan dimensi 2 :
A[1,1], A[1,2], ..., A[1,n], A[2,1], A[2,2], …, A[m,n]dan oleh karena itu array disebut juga dengan dense list (struktur data statis).
Dimensi Array :1. Array 1 dimensi : List dan vektor2. Array 2 dimensi : tabel dan matriks3. Array multidimensional : secara teoritis bahwa jumlah dimensi tidak terbatas akan tetapi
hanya dibatasi oleh besarnya memory4. Array-array special :− Array segitiga (triagular array) :
¾ Lower triangular array : array 2-dimensi berbentuk bujur sangkar (U1 = U2),dimana semua komponen di atas diagonal berisi 0
¾ Upper triangular array : perbedaan lower triangular array adalah semua komponendi bawah diagonal yang berisi 0. Penyimpanan memerlukan lebih sedikit memory,karena angka 0 tidak perlu disimpan. Rumus AMF untuk triangular array adalah :Address (S[i,j] = C0 + C1 x (i x (i-1)) + C2 x j, dimana C0 = B, C1 = L/2 , C2 = LJumlah elemen = (U x (U+100/2 danJumlah memory = L x jumlah elemen− Array jarang (Sparse Array) : Array yang kebanyakan komponennya mempunyai satu
nilai yang sama, misalnya nilai 0, hanya sebagian kecil yang tidak sama dengan 0.
-
Struktur Data
33Diktat Kuliah Struktur Data : Noferianto Sitompul
I.3. KONSEP LINKED LISTList dianalogikan sebagai daftar (record), kemudian beberapa daftar / record
digabung atau dihubungkan sebagai rangkaian suatu proses yang disebut dengan link. Suatuentitas dimana record-recor yang termuatdi dalamnya dihubungkan (linked) menjadi satuproses bersama disebut linked list. Linked list untuk pertama kalinya dapat dikenali dandihubungkan dengan suatu pointer head. Perhatikan diagram berikut dalam gambar 1.1Contoh :
Gambar 1.1. Bentuk list
Pada gambar 1.1. ditunjukkan bahwa head akan merujuk (menyimpan alamat) recordtersebut. Rangkaian linked list dikenali dengan head, listlist terkait dan tail
Jenis-jenis linked list antara lain :
Gambar 1.2. Jenis-jenis linked list
-
Struktur Data
34Diktat Kuliah Struktur Data : Noferianto Sitompul
I.4. KONSEP TREETree (pohon) adalah struktur data yang menyatakan frekuensi data dengan relasi
dalam suatu hirarki antara elemen-elemen data, induk relasi tersebut adalah root (akar) dancabang-cabang yang memiliki data disebut dengan leave dan leaf.
Contoh :Record : mahasiswa {nim, nama, alamat{jalan, area{kota,kdpos}}, umur, jurusan, hobby}Perhatikan diagram berikut dalam gambar 1.3.
Gambar 1.3. Bentuk pohon
I.5. KONSEP STACKStack (tumpukan) adalah struktur data (list linier) yang menganut paham LIFO (last
in first out), dimana proses yang dapat dilakukan adalah sisip dan hapus data, dan selalumengambil posisi di akhir tumpukan (top of stack) dengan bentuk penotasiannya denganpostfix. Operasi pada stack adalah PUSH (memasukkan data dalam stack) dan POP(mengambil data dari stack). Perhatikan diagram berikut dalam gambar 1.4.
Gambar 1.4. Bentuk Tumpukan
-
Struktur Data
35Diktat Kuliah Struktur Data : Noferianto Sitompul
I.6. KONSEP QUEUEQueue (antrian) adalah struktur data (list linier) yang menganut paham FIFO (first in
first out) dimana operasi penghapusan dilakukan di depan (front) list dan operasi sisipdilakukan di belakang (rear) list. Perhatikan diagram berikut dalam gambar 1.5.
Gambar 1.5. Bentuk Antrian
1.7. KONSEP GRAPHGraph (grafik) merupakan bagian struktur data yang mengindikasikan adanya relasi-
relasi (many to many) yang beraturan dan tidak beraturan diantara pasangan elemen-elemendata baik untuk tipe yang sama atau berbeda dengan berbentuk network / jaringan.
Contoh Grafik :
Gambar 1.6. Bentuk salah satu graph
-
Struktur Data
36Diktat Kuliah Struktur Data : Noferianto Sitompul
BAB IIFUNGSI, TIPE DATA DAN NOTASI ALGORITMA
Pemahaman struktur data lebih lanjut perlu mengetahui bentuk-bentuk fungsi dannotasi yang sering digunakan baik dalam algoritma maupun program.
II.1. FUNGSI DAN NOTASI MATEMATIKA
FUNGSI FLOOR DAN CEILINGMisalkan X adalah bilangan real, dimana X berada diantara 2 buah bilangan integer
disebut dengan FLOOR dan CEILING.
FLOOR X ( X ) adalah pembulatan nilai X ke bawah dan diambil desimal terbesar.CEILING X ( X ) adalah pembulatan nilai X ke atas dan diambil desimal terbesar.Contoh :
3.14 = 3 3.14 = 48.5 = 8 8.5 = 9
FUNGSI SISA (MODULUS)Misalkan X adalah nilai integer dan M adalah positif integer maka nilainya adalah
sisa pembagian. Bentuknya adalah X (mod) M.Contoh :
25 (mod) 7 = 4 25 (mod) 5 = 0 35 (mod) 11 = 2
FUNGSI INTEGER dan ABSOLUTEMisalkan X adalah integer, maka nilai integer X ditulis INT(X) dengan
mengkonversi X ke dalam integer dan menghapus bagian fraksional bilangan.Contoh :
int (3.14) = 3 int (8.5) = 8 int (7) = 7abs |-15| = 15 abs |-3.33| = 3.33 abs|4.44| = 4.44
FUNGSI SUM (Σ)Proses berdasarkan sikuensi a1, a2, a3, ... , an maka a1 + a2 + a3 + ... + an maka
bentuknya adalah :n
Sum (Σ) = Σ aij=1
FUNGSI FAKTORIALMisalkan bilangan integer positif dari satu sampai dengan n dinotasi dengan n !
maka bentuknya adalah n ! = 1 x 2 x 3 x ... x (n-2) x (n-1) x n.Contohnya :
5! = 5 * 4!4 = 4 * 3!
3 = 3 * 2!2 = 2 * 1!
= 2 * 1 = 23 = 3 * 2 = 6
4 = 4 * 6 = 245 ! = 5 * 24 = 120
-
Struktur Data
37Diktat Kuliah Struktur Data : Noferianto Sitompul
FUNGSI PERMUTASIJumlah pasangan berurutan suatu himpunan dari n buah objek dengan jumlah
pasangan masing-masing adalah r buah besaran, dimana r ≤ n.Misalnya : {a, b, c}
b (a,b) terdapat 6 buah pasangan n = 3 dan r = 2 makaa rumus :
c (a,c)
a (b,a)b
c (b,c)
a (c,a)c
b (c,b)
n !P (n, r) =
(n –r) !
II.2. TIPE DATADalam mendisain sebuah program yang baik maka sangat penting memperhatikan
jenis tipe data yang akan dipakai untuk menentukan efisiensi penggunaan memori.
Jenis-jenis tipe data sebagai berikut :- Numeric integer (Int)- Numerik real (real, Float)- Charakter (Char)- String- Boolean (True, False)- Pointer- Ordinal (subset tipe data sederhana kecuali tipe data real dan tipe data yang didefenisi
oleh user yaitu enumerate type dan subrange type)
NUMERIK INTEGERMerupakan nilai bilangan bulat dalam bentuk decimal maupun hexadecimal.
Perhatikan tabel 2.1. berikut :
Tabel 2.1. Tipe data integerTipe Ukuran memori
(byte)Range nilai
ByteShortintIntegerWordLongint
1248
10
0 ... 125-128 ... 127
-32768 …327670 … 65535
-2147483648 … 2147483647
-
Struktur Data
38Diktat Kuliah Struktur Data : Noferianto Sitompul
NUMERIK REALNilai konstanta numeric berkisar dari 1E-38 sampai dengan 1E + 38 dengan
mantissa yang signifikan sampai dengan 11 digit. Nilai E menunjukkan 10 pangkat. Nilaikonstanta numerik real menempati memori 6 byte.
Tabel 2.2. Tipe data realTipe Ukuran Memori
(byte)Range nilai Signifikansi
DigitSingleDoubleExtendedComp
48
1016
1.5 x 10E-45 … 3.4 x 10E385.0 x 10E-324 … 1.7 x 10E3081.9 x 10E-4951 … 1.1 x 10E4932-2E + 63 + 1 … 2E +63- 1
7 – 815 – 1619 – 2019 - 20
II.3. NOTASI ALGORITMANotasi algoritma yang dipakai pada umumnya adalah :Assign ekspressi adalah = atau := atau ←Misalnya : untuk meng-assign suatu nilai terhadap suatu variabelX = 2 atau X := 2 atau X ← 2
Assign kondisi adalah == atau =
Pembanding adalah case … of atau if … then … [else] ….Misalnya untuk membandingkan dua buah nilai butuh operator == atau =(tergantung bahasa pemrograman yang digunakan) dan dimuatkan ke dalam suatupembanding atau perulangan suatu operasi dapat dilakukan dengan :If (a == b) then ekspressi atau if (a ==b) then ekspressi1 else ekspressi 2
Case a of1: ekspressi1 ; 2: ekspressi2; ...... end;
Operator adalah + atau - atau / atau *Misalya : untuk mejumlahkan atau mengurangkan atau membagi bahkan untukmengalikan dilakukan dengan :a * b atau a / b atau a + b atau a-b
Perulangan adalah for … do atau while ... do atau do … while atau repeat … until ()Relasi adalah ≥ atau > atau ≤ atau < atau atau .GE. atau .GT. atau .LE. atau .LT. atau.NE. dan lain-lain.
Misalnya : untuk membandingkan dua buah nilai maka harus menggunakanoperator kondisi atau looping
for ( a < b) do ekspressi atau while (a < b) do ekspressiRepeat
EkspressiUntil (kondisi)
-
Struktur Data
39Diktat Kuliah Struktur Data : Noferianto Sitompul
BAB IIIARRAY, RECORD, SET, POINTER
III.1. ARRAYMerupakan gugus yang menggambarkan struktur yang mengalokasi alamat (storage)
di memory untuk suatu operand dengan suatu indeks. Array dapat bertipe data sederhanaataupun tipe data enumerate. Perhatikan diagram berikut pada gambar 3.1.
Gambar 3.1. Diagram proses Array
Pencapaian / akses data dibagi 2 :1. Positional access
Merupakan akses dilakukan berdasarkan nilai indeksnya, sedangkan2. Associative access
Merupakan akses berdasarkan nilai atau isi komponennya. Akses berdasarkan indeksadalah alamat komponen memory dapat dihitung berdasarkan komponen indeksnya.
Akses berdasarkan indeks dibedakan :1. Alamat (address) komponen dalam memory dapat dihitung berdasarkan nilai indeksnya2. Untuk array dengan D dimensi, dibutuhkan D penjumlahan dan D perkalian3. Kecepatan perhitungan tidak tergantung kepada banyaknya komponen, tetapi tergantung
kepada besarnya dimensi.
Parameter array adalah berdasarkan :1. Base Address (B)
Alamat (byte pertama) dari array yang diberikan pada saat binding time. Binding timeadalah waktu dimana array diberikan pada suatu lokasi /address di memory, bisa padasaat compile, execute, dan lain-lain.
2. Component length (L)Panjangnya memory untuk menyimpan satu komponen. L tergantung dari tipekomponen dan bahasa pemrograman, misalnya pada Turbo Pascal 7.0 tipe integermempunyai L=2, Turbo C 2.0 tipe integer L = 2, Visual C++ 5.0 tipe integer L = 4
3. Upper Bound (Ik) dan Lower bound (Uk)Ik adalah nilai indeks yang terkecil sedangkan Uk adalah nilai indeks yang terbesar.Contoh : int s[10]; maka Ik = 0 , Lk = 9
4. Dimension (D)Besarnya dimensi dari suatu array.Contoh : int S[10][20]; atau var S : array[1..10][1..20] of integer; maka D = 2
int S[9]; atau var S : array[1..9] of integer; maka D = 1
-
Struktur Data
40Diktat Kuliah Struktur Data : Noferianto Sitompul
Gambar 3.2. Konsep Array dalam memory
ARRAY MAPPING FUNCTION (AMF)AMF merupakan suatu fungsi untuk memetakan nilai indeks ke alamat komponen.
Fungsi Mapping / Pemetaan yaitu :1. Row major order
Merupakan cara penyimpanan array dalam bahasa pemrograman2. Virtual origin atau virtual base
nilai konstan C0 (lokas dari komponen dengan indeks 0) dalam AMF.
Rumus dalam AMF :Address (S[I1][I2] … [Id]) = C0 + C1 x I1 + C2 x I2 + … + Cn x id ;dimana Cd = L
Ct-1 = (Ut – It + 1) x Cd x Ct ; dan i
-
Struktur Data
41Diktat Kuliah Struktur Data : Noferianto Sitompul
S[1] = 500 + (2 x 1) = 502
Besarnya memory yang dibutuhkan adalah :M = L x ( U1 – I1 + 1) = 2 x (5 – 0 + 1) = 10 byte
Bila dideklarasikan suatu variabel dengan var x : array [1..n] of integer;maka implementasi array secara linier dalam memory adalah :
Gambar 3.3. Bentuk array linier
Contoh fragmen program dari/* Bahasa Pascal adalah : */ /* Bahasa C/C++ adalah : */Uses CRT; #include ,stdio.h>Var x : array [1..7] of integer; int x[7], i;
i : byte; { for (i=0; i
-
Struktur Data
42Diktat Kuliah Struktur Data : Noferianto Sitompul
Proses pembacaannya dapat digantikan dengan cara :Begin
With x do beginReadln(nama, umur);
endend;
III.3. SETBagian struktur data yang mengatur objek-objek dalam set, dimana anggota-anggota
set mempuyai tipe yang sam (base type) yaitu tipe ordinal (integer, boolean, cahr, skalarkecuali real).
Perhatikan diagram berikut pada gambar 3.4.
Gambar 3.5. Diagram proses Set
Fragmen program dari Bahasa Pascal adalah :Contoh1 :Type huruf_hidup = set of (’a’, ’e’, ’o’, ’i’, ’u’);Var teks : string;
Jlh, i : integer;Begin
Readln(teks);Jlh := 0;For i:=1 to ord(teks[0]) do
If teks[i] in huruf_hidup thenJlh := jlh + 1;
Writeln (‘Jumlah huruf hidup : ‘, jlh);End.Contoh 2 :{ Menghasilkan huruf yang pernah dipakai dalam suatu kalmia }Type karakter = set of char;Var karset : karakter;
i : byte;pakai, kalimat : string;
BeginKarset := [];Write(‘Masukkan suatu kalimat : ‘); readln(kalimat);For i:=1 to length(kalimat) do
If not ([kalimat[i]]
-
Struktur Data
43Diktat Kuliah Struktur Data : Noferianto Sitompul
III.4. POINTERMerupakan struktur data berupa variable dinamis yang tidak dapat dideklarasikan
secara eksplisit seperti variabel statis dan tidak dapat langsung ditunjukkan oleh suatupengenal (identifier).
Pointer ini hanya dapat ditunjukkan oleh variable khusus yang berisi alamat memoryyang digunakan oelh variable dinamis. Jadi variabel pointer hanya dapat dideklarasikandengan tipe data pointer (simbol ↑ baca carat atau circumflex). Perhatikan contoh fragmenprogram berikut :
Contoh 1 :Type kalimat : string; pointkal = ^kalimat;Var nama : pointkal;Begin
Nama^ := ’Belajar struktur data’;Write(nama^);
End.
Contoh 2 :Type kar = ^catchar;
Catchar = recordKode : string;Nama : string;Gaji : real;
End;Var datakar : array [1..5] of kar;
i : byte;Begin
For i := 1 to 5 doBegin
New (datakar[i]);With datakar[i]^ doBegin
Readln(kode);Readln(nama);Readln(gaji);
End;End;For i := 1 to 5 doBegin
With datakar[i]^ doBegin
Writeln(i, kode, nama, gaji);End;
End;End;
Tugas : Buatlah program dari salah satu bahasa pemrograman untuk menginput beberapadata kemudian mengurutkan hasilnya secara menaik (ascending) atau menurun(descending).
-
Struktur Data
44Diktat Kuliah Struktur Data : Noferianto Sitompul
BAB IVLINKED LIST
Linked list merupakan struktur data dinamis, dimana list dianalogikan sebagai daftar/ record yang berisi item data. Dalam list kita harus mengenali masing-masing elemen /node, misalnya : elemen1, elemen2, ...., elemenn.
Elemen-elemen ini harus dihubungkan (link) dengan suatu pointer (penujuk) padaalamat-alamat tertentu. Berikut akan dijelaskan lebih dahulu deklarasi-deklarasi list.
IV.1. STATEMENT NEW, DISPOSE DAN VARIABEL POINTER
Statement NEWDigunakan untuk mengalokasi storage dalam node baru kemudian kita mereferensi
masing-masing node baru yang menyimpan informasi tentang variabel pointer tersebut.
Statement DISPOSEDigunakan untuk membebaskan list dari rangkaian linked list yang ada.
Perhatikan diagram berikut pada gambar 4.1.Type Str1 = array [1..3] of char;
Node = RecordKata : String;Next : ^node;
End;Nodepointer = ^node;
Sehingga operasi dapat dilakukan dengan :
Gambar 4.1. Operasi New dan Dispose
Jika dimisalkan entry data adalah : P^.Kata =’Agus’ dan Q^.Kata = ’Budi’ maka bentuklistnya adalah sebagai berikut :
Gambar 4.2. Operasi entri list Gambar 4.3. Operasi pointer next
Perhatikan proses perpindahan ke list berikutnya dengan memisalkan bahwa :P^.Next = 3 dan Q^.Next = 5 maka bentuk listnya pada gambar 4.3.
-
Struktur Data
45Diktat Kuliah Struktur Data : Noferianto Sitompul
Sehingga bentuk linked list yang sebenarnya dapat dideskripsikan sebagai berikut :
Gambar 4.4. Deskripsi linked list
Misalkan statement r:=q ; p:=q; q:=r maka bentuk linked listnya :
Gambar 4.5. Operasi pertukaran head list
Bila gambar 4.5. dibubuhi operasi : Write(P^.Kata, Q^.Kata, R^.Kata) maka akan diperolehhasilnya : BudiAgusAgus.
IV.2. LINKED LIST (LINIER)Linked list (linier) merupakan deretan list-list yang terhubung dengan suatu head /
start di depan. Perhatikan diagram berikut pada gambar 4.6.
Gambar 4.6. Linked list dengan 5 node
Implementasi data dalam linked list dengan pointer yang merujuk mulai dari list awalsampai dengan list terakhir. Perhatikan diagram berikut dalam gambar 4.7.
Gambar 4.7. Proses pointer dalam linked list
-
Struktur Data
46Diktat Kuliah Struktur Data : Noferianto Sitompul
Dalam merepresentasi list-list dalam array dilakukan dengan :
Gambar 4.8. Bentuk implementasi New dalam array
IV.2.1. ALGORITMA TRAVERSAL LINKED LISTa.Traversal proses linked list// Traversing dengan array :Ptr = headWhile (ptr nil) do
Proses (info [ptr]); Ptr = link [ptr]Endwhile
// Traversing proses dengan pointer :Ptr = headWhile (ptr nil) do
Proses (ptr^.info); Ptr = ptr^.nextEndwhile
b.Traversal cetak linked list// Dengan array :Ptr = headWhile (ptr nil) do
Write (info [ptr]); Ptr = link [ptr]Endwhile
// Dengan pointer :Ptr = headWhile (ptr nil) do
Write (ptr^.info); Ptr = ptr^.nextEndwhile// Menghitung jumlah proses :num =0ptr = headWhile (ptr nil) do
Num = num + 1; Ptr = ptr^.nextEndwhile
-
Struktur Data
47Diktat Kuliah Struktur Data : Noferianto Sitompul
c.Algoritma mencari suatu item padadata tidak terurut :
ptr = headWhile (ptr nil) do
If (item = ptr^.info) thenLoc = ptr
Else Ptr = ptr^.next EndifLoc = nil
Endwhile
d. Algoritma mencari suatu item padadata terurut :
ptr = headwhile (ptr nil) do
if (item = ptr^.info) thenptr = ptr^.next
elseif (item = ptr^.info) then
loc = ptr; exitelse loc = nilendif
endifEndwhile
IV.2.2. ALGORITMA SISIP DATA DALAM LINKED LIST
Gambar 4.9. Bentuk sisipan list baru dalam linked list
A. SISIP AWAL
a. Sisip list baru di awal linked list
-
Struktur Data
48Diktat Kuliah Struktur Data : Noferianto Sitompul
B. SISIP TENGAH
b. Sisip list baru di tengah linked list
C. SISIP AKHIR
c. Sisip list baru di akhir linked listGambar 4.10. Proses penyisipan list baru pada linked list
IV.2.3. ALGORITMA HAPUS DATA DALAM LINKED LIST
A. HAPUS LIST AWAL
a. Hapus list awal dari linked list
B. HAPUS LIST TENGAH
b. Hapus list awal dari linked list
-
Struktur Data
49Diktat Kuliah Struktur Data : Noferianto Sitompul
C. HAPUS LIST AKHIR
Gambar 4.11. Proses penghapusan suatu list dari Linked List
Berikut ini disajikan program pascal yang mengimplementasi proses linked list (sisip awal,tengah, akhir dan hapus awal, tengah, akhir) :
Uses CRT;Const garis = ’-------------------------------’;
Pesan =’Linked list masih kosong’ ;Type simpul = ^data;
Data = RecordNama : string;Alamat : string;Next : simpul;
End;Var head, tail : simpul;
Pilih : char;Cacah : integer;
Function menu : char;Var p : char;Begin
Clrscr;Writeln(’Pilihan Anda : ’);Writeln(‘a. Sisip list di awal’);Writeln(‘b. Sisip list di tengah’);Writeln(‘c. Sisip list di akhir’);Writeln(‘d. Hapus list di awal’);Writeln(‘e. Hapus list di tengah’);Writeln(‘f. Hapus list di akhir’);Writeln(‘g. Cetak isi linked list’);Writeln(’h. Selesai’);Repeat
Writeln(’Pilih salah satu : ’);P := upcase (readkey);
Until p in[‘A’,‘B’,‘C’,‘D’,’E’,’F’,’G’];Menu := p
End;
Function simpul_baru : simpul;Var b : simpul;Begin New(b)
; With b^do
BeginWriteln(‘Nama :‘); readln(nama);Writeln(‘Alamat :’); readln(alamat);Next := nil;
End;Simpul_baru := b
End;
Procedure sisip_awal(n : integer);Var baru : simpul;Begin
If n 0 thenBegin
Writeln(‘Menambah list di awal link list’);Writeln(copy(garis,1,45))
End;Baru := simpul_baru;If head = nil then tail := baru elseBaru^.next := head;Head :=baru
End;
Procedure sisip_tengah;Var baru, Bantu : simpul;
Posisi, i : integer;Begin
Writeln(’Menambah list ditengah linked list’)Writeln(garis);Writeln(’Linked list berisi :’,cacah:2,’ simpul’);Repeat
Writeln(‘List baru ditempatkan di urutanberapa ?’);
Readln(posisi);Until posisi in[1 .. cacah+1);If posisi = 1 then sisip_awal(0) elseIf posisi = cacah+1 then sisip_akhir(0) elseBegin
Baru := simpul_baru;
-
Struktur Data
25Diktat Kuliah Struktur Data : Noferianto Sitompul
Bantu := head;For i:=1 to posisi-2 do
Bantu := Bantu^.next;Baru^.next := Bantu^.next;Bantu^.next := baru;
End;End;
Procedure sisip_akhir(n:integer);Var baru : simpul;Begin
If n 0 thenBegin
Writeln(’Tambah list baru di akhir list’);Writeln(copy(garis,1,46))
End;Baru := simpul_baru;If head = nil then
Head = baru elseTail^.next := baru;Tail := baru;
End ;
Procedure hapus_awal ;Begin
If head nil thenBegin
Head := head^.next;Writeln(‘List awal telah dihapus’)
End else writeln(pesan);Writeln(‘Tekan sembarang tombol’);Repeat until keypressed
End;
Procedure hapus_tengah;Var posisi,I : integer;
Bantu, bantu1 : simpul;Begin
If cacah = 0 thenBegin
Writeln(pesan);Writeln(‘Tekan sembarang tombol’);Repeat until keypressed
End elseBegin
Writeln(‘Menghapus list di tengah’);Writeln(copy(garis,1,35));Writeln(‘List berisi :’,cacah:2,’ simpul’);Repeat
Writeln(‘Urutan list akan dihapus ? ’);Readln(posisi);
Until posisi in[1..cacah];If posisi = 1 then hapus_awal elseIf posisi = cacah then hapus_akhir elseBegin
For i:=1 to pisisi – 2 doBantu := Bantu^.next;
Bantu1 := bantu^.next;Bantu^.next := bantu1^.next;
Bantu1^.next := nil;Dispose(bantu1)
EndEnd
End;
Procedure hapus_akhir;Var bantu : simpul;
h : integer;Begin
If head = nil thenBegin
Writeln(pesan);h := 0
End elseIf head = tail thenBegin
Head := nil;Tail := nil;h : = 1
End elseBegin
Bantu := head;While (bantu^.next tail) do
Bantu := bantu^.next;Tail := bantuTail^.next := nil;h := 1
End ;If h=1 then
Writeln(‘List akhir telah dihapus’) ;Writeln(‘Tekan sembarang tombol’);Repeat until keypressed
End;
Procedure baca_list;Var bantu : simpul;
i : integer;Begin
i := 1;Writeln(’Membaca isi linked list’);Writeln(‘copy(garis,1,42));Bantu := head;If bantu = nil then writeln(pesan) else
While (bantu nil) doBegin
Writeln(‘Simpul:‘,i:2,’→nama:‘,bantu^.nama);
Writeln(’ ’:17,’Alamat : ’,bantu^.next);Inc (i)
End;Repeat until keypressed
End;
{Program utama}Begin
Cacah := 0;Head := nil;Tail := nil;
-
Struktur Data
26Diktat Kuliah Struktur Data : Noferianto Sitompul
RepeatPilih := menu;Clrscr ;Case pilih of‘a’ : sisip_awal(1) ;‘b’ : sisip_tengah;‘c’ : sisip_akhir(1);‘d’ : hapus_awal;‘e’ : hapus_tengah;‘f’ : hapus_akhir;
‘g’ : baca_list;End;
If pilih in [‘A’,’B’,’C’,] thenInc(cacah) else
If pilih in [’D’,’E’,’F’] and (cacah 0)Then dec(cacah);
Until pilih = ‘H’End.
Tugas :1. Buatlah prosedur untuk mengiput dua buah linked list dan menggabung keduanya
menjadi Satu2. Buatlah prosedur untuk mencari data tertentu pada linked list3. Buat prosedur untuk mengganti data tertentu dalam linked list4. Buatlah prosedur untuk mengurutkan data linked list
IV.3. LINKED LIST DENGAN MULTI POINTER
IV.3.1. LIST CIRCULARList circular (list berputar) adalah linked list yang tidak mempunyai node awal dan
node akhir. Perhatikan diagram berikut pada gambar 4.12.
Gambar 4.12. Linked list circular
Operasi-operasi pada list circular ditunjukkan pada algoritma berikut :Traverse :P = headPtr = p^.nextWhile ptr p do
Proses ptr^.dataPtr = ptr^.next
Endwhile
Mencari (search) posisi loc yang berisi item :
Procedure search (data, next, p, item, loc)Ptr = p^.nextWhile (ptr^.next item) and (ptr p) do
Ptr = p^.nextEndwhileIf ptr^.data = item then
Loc = ptrElse loc = nil
-
Struktur Data
25Diktat Kuliah Struktur Data : Noferianto Sitompul
EndifEndprocMenemukan posisi loc pada node awal dimana item berada :
Procedure FindHL (data, next, p, item, locp);Save = pPtr = p^.nextWhile (ptr^.data item) and (ptr p) do
Save = ptrPtr = p^.next
Endwhile
If ptr^.data = item thenLoc = ptrLocp = save
ElseLoc = nilLocp = save
EndifEndproc
Menghapus (delete) node awal :
Procedure dellocHL (data, next, p, avail, item)FindHL (data, next, p, item, locp)If loc = nil then
Write(‘Data tidak ada dalam list’)Exit
EndifLocp^.next = loc^.nextLoc^.next = availAvail = loc
Endproc
IV.3.2. LINKED LIST MULTI ARAH
Deklarasi tipe data sebagai berikut :Type link = ^multi_node;
Multi_node = Recordfield1 : type_field1 ;… : …….. ;fieldn : type_fieldn ;left, right : link ;
End;
-
Struktur Data
26Diktat Kuliah Struktur Data : Noferianto Sitompul
Bentuk umum diagram multi linked list diperlihatkan pada gambar 4.13.
Gambar 4.13. Linked list dua arah
Linked list 2 arah dengan bentuk circular terdapat perbedaan dengan linked list lainnya.Perhatikan diagram berikut pada gambar 4.14.
Gambar 4.14. Linked list circular dua arah
Perhatikan proses penghapusan node tertentu dalam linked list dua arah dan urutan proses,ditunjukkan dalam gambar 4.15. berikut :
Gambar 4.15. Proses penghapusan Linked list dua arah
Demikian juga proses penyisipan node baru pada posisi tertentu dalam linked list 2 arah.Perhatikan urutan proses pada gambar 4.16. berikut :
Gambar 4.16. Proses penyisipan node baru pada linked list dua arah
-
Struktur Data
27Diktat Kuliah Struktur Data : Noferianto Sitompul
Operasi-operasi pada linked list 2 arah diperlihatkan pada algoritma berikut :Menyisip list baru ke dalam linked 2 arah :
Procedure insert (data, forwd, back, p, avail, locA, locB, item)If avail = nil then
Write(‘Overflow’)Exit
EndifBaru = availAvail = forwd^.availBaru^.data = itemLocA^.forwd = newNew^.forwd = locBLocB^.back = locA
Endproc
Menghapus node tertentu dalam linked list dua arah :
Procedure delete (data, forwd, back, p, avail, loc)Loc^.(back^.forwd) = loc^.forwd(Loc^.forwd)^.back = loc^.backLoc^.forwd = availAvail = loc
Endproc
Berikut ini implementasi algoritma linked list dua arah dalam Bahasa pemrograman Pascal :Program linked_list;Type Penunjuk = ^RecNama;
RecNama = RecordNama : string;Pra, post : penunjuk;
End;Var datanama, head, tail : penunjuk;
Procedure MasukData;Var lagi : char;Begin
Mark(datanama);Head : datanama;Tail := datanama;Lagi := ’Y’;While (UpCase(lagi)=’Y’) doBegin
New (datanama);Writeln(‘Nama : ‘);Readln(datanama^.nama);Datanama^.pra := nil;Tail^.post := datanama;Datanama^.pra := nil;Tail:= datanama;Write(’Ada lagi (Y/T) : ’);Readln(lagi0 ;
End ;End ;
Procedure urutkan ;Var x, i, j : penunjuk ;Begin
Tail = head;Datanama := head^.post;Head^.pra := nil;While (datanama^.nama nil) doBegin
i := datanama^.post;If datanama^.nama >= tail^.namaThen begin
Datanama^.pra := tail;Tail^.post := datanama;Tail := datanama;Datanama^.post := nil
End elseBegin
j := tail^.pra;While(datanama^.nama
-
Struktur Data
25Diktat Kuliah Struktur Data : Noferianto Sitompul
x := j^.post;j^.post := datanama;x^.pra := datanama;datanama^.pra := j;datanama^.post := x;
EndEndDatanama := i
EndEnd;
Procedure tampilkan;Begin
Datanama := head;While datanama nil doBegin
Writeln(datanama^.nama);Datanama := datanama^.post
EndEnd;
{ Program utama }Begin
MasukData;Writeln(’Data sebelum diurutkan : ’);Tampilkan;Urutkan;Writeln(’Data sesudah diurutkan : ’);Tampilkan;
End.
-
Struktur Data
26Diktat Kuliah Struktur Data : Noferianto Sitompul
BAB VNOTASI POLISH, REKURSIF, STACK, QUEUE
V.1. NOTASI POLISHSuatu metode untuk menulis/memetakan semua operator-operator sesuai dengan
presedensi (prioritas) sebelum (prefix) operand-operand, sesudah (postfix) operand-operand atau diantara (infix) operand-operand yang juga merupakan operasi dalam stack.
Berikut diberikan evaluasi skala prioritas operator seperti :
Tabel 5.1. Skala prioritasOperator-operator Keterangan Presedensi
(prioritas)^
* , / , div , mod+ , - (binary)
= , ≠ , < , > , ≤ , ≥not and
, or:=
Ekponensial / pemangkatanPerkalian, pembagian, sisa bagiPenjumlahan, PenguranganSama dengan, tidak sama dengan, lebih kecil,lebih besar, Lebih kecil atau sama dengan,Lebih besar atau sama denganTidakDan, AtauSama dengan
6543
210
Notasi infix adalah jika operator berada diantara kedua operandnya, misalnya : suatuekspressi c := a + b.
Notasi prefix (notasi polish) adalah jika operator berada di depan kedua operandnya,misalnya : dari infix c := a + b menjadi := c + a b.
Notasi postfix/suffix (reverse polish) adalah jika operator berada di belakang keduaoperandnya, misalnya : dari infix c := a + b menjadi c a b + :=
Algoritma infix :1. Scan dari kiri ke kanan sampai ketemu dengan kurung tutup yang paling awal2. Scan kembali dari posisi sebelumnya ke kiri sampai ketemu kurung buka pertama3. Lakukan operasi yang berada dalam tanda kurung4. Ganti ekspresi di dalam kurung tersebut dengan hasil operasi5. Ulangi langkah 1 sampai dengan selesai.
Kelemahan algoritma ini adalah lama dan tidak efisien
Algoritma posfix/suffix :1. Scan dari kiri ke kanan sampai ketemu dengan operator2. Ambil 2 operand yang berada langsung di sebelah kiri operator tersebut3. Ganti ekspresi dengan hasil operasi4. Scan lagi hasil operasi tadi ke kanan, jadi tidak perlu discan dari depan sekali seperti
pada proses infix
-
Struktur Data
27Diktat Kuliah Struktur Data : Noferianto Sitompul
Keuntungan dari notasi postfix/suffix ini adalah tidak perlu memakai tanda kurung untukmenyatakan prioritas pengerjaan serta lebih cepat dan efisien, karena tidak perlu selaluscan dari depan atau paling kiri.
Untuk pekerjaan algoritma posfix/suffix ini, dipergunakan stack untuk menyimpanoperand yang dibaca, yang belum dilakukan operasi terhadapnya.
Perhatikan contoh ekspresi berikut :Infix : ( A + ( B * C – ( D / E ^ F ) * G ) * H )Postfix : A B C * D E F ^ / G * - h * +
Tabel 5.2. Operasi StackNo Simbol
yangdiscan
Stack Ekspresi postfix Keterangan
1234567891011121314151617181920
A+(B*C-(D/E^F)*G)*H)
(( +( + (( + (( + ( *( + ( *( + ( -( + ( - (( + ( - (( + ( - ( /( + ( - ( /( + ( - ( / ^( + ( - ( / ^( + ( -( + ( - *( + ( - *( +( + *( + *
AAAABABABCABC*ABC*ABC*DABC*DABC*DEABC*DEABC*DEFABC*DEF^/ABC*DEF^/ABC*DEF^/GABC*DEF^/G*-ABC*DEF^/G*-ABC*DEF^/G*-HABC*DEF^/G*-H*+
Baris 13 : Tanda ^ dipop karenasudah ketemu pasangan ( dan )
Baris 16 : Pasangan ( dan ) sudahketemu maka dipop semuaoperator yang ada diantara ( dan )Baris 19 : sudah ketemu pasangan( dan )
V.2. REKURSIFRekursif adalah merupakan salah bagian yang penting yang harus dipahami untuk
operasi stack (tumpukan) maupun queue (antrian).
Karakteristik rekursif adalah :1. Terdapat satu atau lebih kasus sederhana dengan solusinya (stopping cases)2. Kasus lain diselesaikan dengan mensubstitusi satu atau lebih kasus yang
disederhanakan (closer to stopping cases)3. Masalah yang disederhanakan hanya pada stopping cases yang relatif mudah
diselesaikan.
-
Struktur Data
28Diktat Kuliah Struktur Data : Noferianto Sitompul
Fungsi-fungsi yang menggunakan prinsip rekursif adalah :a. Fungsi faktorial
Misalkan n ! = 1 x 2 x 3 x … x nJika n = 0 atau 1 maka n ! = 1 lainnya n ! = n * (n – 1) !Contoh : 4 ! = 4 * 3 !
3 ! = 3 * 2 !2 ! = 2 * 1 !
= 2 * 1 = 23! = 3 * 2 = 6
4 ! = 4 * 6 = 24
Algoritma :Function Factorial (n : integer) : integer;Begin
If (n = 0) or (n = 1) then Factorial := 1 elseFactorial := n * Factorial (n –1);
End;
b. Fungsi FibonacciJika n=0 atau n = 1 atau n = 2 maka Fibonacci = 1 lainnyaFibonacci = Fibonacci (n-1) * Fibonacci(n-2);
Algoritma :Function Fibo(n : integer) : integer;Begin
If (n=0) or (n=1) or (n=2) then Fibo := 1 elseFibo := Fibo(n-1) * Fibo(n-2);
End;
c. Fungsi LoopProses penulisan ulang dengan cara berulang-ulang (rekursif)
Algoritma :Procedure Deret (n : integer);Begin
Writeln(n:3);If n
-
Struktur Data
29Diktat Kuliah Struktur Data : Noferianto Sitompul
Gambar 5.1. Menara Hanoi
Implementasi algoritma dengan fragmen program dalam bahasa pemrogramanpascal :
Var cacah, cacah_gerak : integer;Procedure Hanoi(var cacah_gerak : integer; cacah, asal, lewat, tujuan : integer);Begin
If cacah>0 thenBegin
Hanoi(cacah_gerak, cacah-1, asal, tujuan, lewat);Cacah_gerak := succ(cacah_gerak);Write(‘Langkah ke : ‘, cacah_gerak:2);Write(‘, pindahkan piringan no. ‘, cacah:2);Write(‘ dari tiang ‘, char(asal+64));Writeln(‘ ke tiang ‘, char(tujuan+64));Hanoi(cacah_gerak, cacah-1, lewat, asal, tujuan);
EndEnd;
BeginWrite(‘Berapa jumlah piringan : ‘); readln(cacah);Cacah_gerak := 0;Hanoi(cacah_gerak, cacah, 1, 2, 3);Writeln(‘Piringan sebanyak : ‘, cacah:2, ‘ buah, memerlukan’,
Cacah_gerak:3,’ kali pemindahan’);End.
V.3. STACKStack (tumpukan) merupakan bagian dari list (struktur linier) dimana item-item
data ditambah atau dihapus selalu di posisi terakhir (LIFO =last in first out) yang disebuttop. Pada stack terdapat terminologi Push dan Pop, dimana push maksudnya adalahmemasukkan elemen data pada stack sedangkan pop adalah mengambil elemen data padastack.
Manfaat Stack adalah sebagai berikut :1. Pengelolaan struktur yang bersarang (nested) atau yang berisi salinan dirinya sendiri
dalam dirinya. Misalnya pengelolaan ekspressi aljabar, himpunan dari himpunan2. Implementasi algoritma parsing, evaluasi dan backtracking3. Digunakan oleh sistem operasi untuk memungkinkan prosedur yang nested4. Digunakan untuk memungkinkan konversi program rekursif menjadi non rekursif
-
Struktur Data
30Diktat Kuliah Struktur Data : Noferianto Sitompul
5. Untuk mendukung pushdown automata6. Untuk mendukung kompiler mengkonversi infix menjadi postfix dan kemudian
mengevaluasi postfix menjadi atomik (assembly) command.
Perhatikan diagram berikut : misalkan terdapat deretan input : A, B, C
Gambar 5.2. Operasi Stack
Perhatikan implementasi algoritma berikut :
Const sentinel = ‘#’;Type stackpointer = ^stacknode;
Stacknode = RecordData : char;Next : stackpointer;
End;Var top : stackpointer;
Nextchar : char;
Function emptystack(top : stackpointer) :boolean;Begin
Emptystack := top = nilEnd;
Procedure push(nextchar : char; var top :stackpointer);Var temp : stackpointer;Begin
New(temp);Temp^.data := nextchar;Temp^,next := top;Top := temp;
End;
Procedure pop(var item : char; var top :stackpointer);Var temp : stackpointer;Begin
If emptystack(top) thenWriteln(‘Stack kosong’) elseBegin
Item := top^.data;Top := top^.next;
End;End;Begin { program utama }
Top := nil;Readln(nextchar);While nextchar = sentinel doBegin
Push (nextchar);Readln(nextchar)
End;While not emptystack (top) doBegin
Writeln(nextchar);Pop(nextchar,top)
EndEnd.
-
Struktur Data
31Diktat Kuliah Struktur Data : Noferianto Sitompul
V.4. QUEUESuatu queue (antrian) juga bagian dari linked list yang digunakan untuk memodelkan
sesuatu, seperti barisan tunggu pada suatu counter dengan model FIFO (first in first out).Operasi-operasi yang digunakan oleh queue antara lain enqueue adalah untuk memasukkandata dalam antrian sedangkan dequeue adalah untuk mengeluarkan data dari queue.
Manfaat queue sebagai berikut :1. Digunakan oleh sistem operasi untuk mengatur eksekusi task dalam suatu sistem untuk
mencapai perlakuan “adil” (waiting line)2. Untuk mail box dalam komunikasi antar proses3. Untuk buffer dalam mekanisme print spooler komunikasi data4. Untuk simulasi dan modelling, misalnya simulasi sistem pengendali lalu lintas udara
dalam memprediksi performansi.
Untuk lebih jelasnya perhatikan diagram berikut :
Gambar 5.3. Diagram Antrian
Berikut akan disajikan bagaimana proses enqueue dan dequeue dalam queue seperti diagramdi bawah ini :
Gambar 5.4. Proses enqueue
-
Struktur Data
32Diktat Kuliah Struktur Data : Noferianto Sitompul
Gambar 5.5. Proses dequeue
Berikut diberikan implementasi algoritma queue :
{untuk mencek apakah queue dalamkeadaan kosong atau tidak}function emptyqueue(front : passpointer): boolean;begin
emptyqueue := front = nilend;Procedure enqueue(newpass : passanger;var front, rear : passpointer);Var temp : passpointer;Begin
New(temp);temp^.passinfo := newpass;rear^.next := temp;temp^.next := nil;rear := temp;If emptyqueue(front) then front := rear
End;
Procedure dequeue(var nextpass :passanger; var front, rear : passpointer);Begin
If emptyqueue(front) thenwriteln(‘Queue kosong’) else
Beginnextpass := front^.passinfo;front := front^.link;If emptyqueue(front) then
front := nilEnd
End;
-
Struktur Data
33Diktat Kuliah Struktur Data Noferianto Sitompul
BAB VIT R E E
VI.1. PEMAHAMANTree (pohon) didefenisikan sebagai set (himpunan) node-node atau simpul-simpul
dengan edge (penghubung node) secara langsung antara dua atau beberapa node. Prosestree tidak memiliki prinsip non rekursif.
Root suatu tree memiliki sifat-sifat antara lain :- Salah satu node sebagai root- Setiap node kecuali root terhubung dengan satu edge terhadap rootnya- Terdapat lintasan unik dari root terhadap node dan sejumlah edge harus dihubungkan
dengan panjang lintasan.
Perhatikan diagram di bawah ini yang menunjukkan bentuk pohon secara umum denganketinggian (heigh) dan kedalaman (depth) tertentu sebagai berikut :
Gambar 6.1. Bentuk umum tree
Terminologi-terminologi dalam tree sebagai berikut :a. Root/ parent adalah subtree yang paling atas pada sebuah pohonb. Child adalah anak dari suatu root, misalnya : b, c, d, e adalah child dari a dan f, g
adalah child dari b dan seterusnyac. Sabling adalah node yang tergolong dari root yang sama (saudara kandung), misalnya
: c, d, e adalah sabling dari b dan seterusnyad. Leaf adalah node-node yang tidak memiliki cabang lagi (tidak punya anak)e. Ancestor adalah nenek moyang (ayah dari nenek), misalnya : a adalah ancestor dari kf. Descendand adalah keturunan/ anak dari cucu, misalnya : k adalah descendand dari ag. Depth adalah kedalaman suatu node (length) yang terhitung dari root, misalnya :
Depth f, g, h, I, j adalah 2 ; Depth k adalah 3Depth b, d, c, e adalah 1 ; Depth a adalah 0
h. Heigh adalah ketinggian (level) dari suatu pohon yang terhitung dari root (pathterpanjang), misalnya heigh dari pohon diatas adalah 3
i. Satu node (single node) dapat juga disebut tree dengan heigh = 0 dan depth = 0Dari pohon di atas dapat dibentuk sub-sub tree untuk membedakannya sebagai berikut :
-
Struktur Data
34Diktat Kuliah Struktur Data Noferianto Sitompul
Gambar 6.2. Pohon dengan pola rekursif
Pada tree secara otomatis termuat konsep linked list, dimana di antara setiap nodediasumsikan sebagai record / list. Perhatikan diagram berikut ini :
Gambar 6.3. Subtree dari tree
Dalam pohon dikenal istilah keseimbangan yaitu jika masing-masing node pada subtreekiri dan subtree kanan memiliki perbedaan paling banyak satu.
Perhatikan implementasi algoritma berikut :
Type ref = ^node;Node = Record
Key : integer;Left, right : ref;
End;Var n : integer; root : ref;
Function tree(n : integer) : ref;Var newnode = ref;
x, nl, nr : integer;Begin
If n = 0 then tree := nil elseBegin
nl := n div 2;nr := n – nl –1;read (x); new (newnode);with newnode^ dobegin
key := x;left := tree(nl);right := tree(nr)
end;tree := newnode
endend;
Procedure printtree(t: ref; h : integer);Var I : integer;Begin
If t^ thenBegin
Printtree(left, h+1);For i:= 1 to h do write(‘ ‘);Writeln(key);Printtree(right, h+1)
End;End;
BeginWrite(‘Masukkan banyak data : ‘);Readln (n);Printtree(root, 0);
End.
-
Struktur Data
35Diktat Kuliah Struktur Data Noferianto Sitompul
Berikut akan dibuat suatu fragmen program untuk membangun pohon :
(* deklarasi *)Var i, n, nl, nr, x : integer;
Root, p, q, r, dmy : ref;s : array[1..30] of
record n : integer;rf : ref;
end;Begin
Write(‘Masukkan banyak data : ‘);Readln(n);New(root); new(dmy);i:= 1; s[1].n := n; s[1].rf := root;repeat
n := s[i].n; r:=s[i].rf ; i:=i-1; {pop}if (n=0) then r^.right := nil else
beginp := dmy;repeat
nl := n div 2; nr := n – nl –1;write(‘input banyak data:‘);readln(x);new(q); q^.key := x; {push}n := nl; p^.left := q; p := q;
until n = 0;q^.left := nil;r.right := dmy^.left;
end; until I = 0;printtree(root^.right,0);
end;
fragmen program untuk mencari data dari pohon sebagai berikut :
Var root : ref;k : integer;
Procedure printtree (w : ref; l : integer);Var i : integer;begin
if w nil thenwith w^ dobegin
printtree(left, l+1);for i:= 1 to l do
write(‘ ‘);writeln(key);printtree(right, l+1)
endend;
Procedure search(x : integer; var p : ref);Begin
If p = nil then
BeginNew(p);With p^ doBegin
key := x; count := 1;Left := nil; right := nil
EndEnd elseIf x p^.key then search(x, p^.right)Else p^.count := p^.count + 1
end;Begin
Root := nil;While not eof(input) doBegin
Read (k); search(k, root)End;Printtree(root,0)
End.
-
Struktur Data
36Diktat Kuliah Struktur Data Noferianto Sitompul
fragmen program untuk menghapus data dari pohon sebagai berikut :
Type ref = ^data;Data = Record
key : integer;count : integer;left, right : ref;
end;
Procedure delete(x : integer; var p : ref);Var p,q : ref;
Procedure del (var r : ref);Begin
If r^.right nil then del(r^.right)elseBegin q^.key:=r^.key;
q^.count:= r^.count;q := r; r := r^.left
endend;
BeginIf p= nil then
writeln(‘Tidak temu’) elseIf x < p^.key then delete(x,p^.left)else If x > p^.key then
delete(x,p^.right)Begin
If q^.right = nil thenp := q^.left else
If q^.left = nil thenp := q^.right else
Del(q^.left)End
End;
VI.2. BINARY TREEDikatakan suatu binary tree apabila suatu pohon dengan masing-masing node
maksimal memiliki dua anak. Perhatikan diagram berikut :
Gambar 6.4. Bentuk Binary tree
Traversal yang digunakan adalah inorder, preorder, dan postorder. Dari gambar 6.4 di atasdiperoleh informasi sebagai berikut :Preorder : RAB (kunjungan root sebelum subtree)Inorder : ARBPostorder : ABR (kunjungan root sesudah subtree)
Contoh suatu ekspressi : inorder : a + b / c * d – e * f menjadiPreorder : * + a / b c – d * e f menjadiPostorder : a b c / + d e f * - *
-
Struktur Data
37Diktat Kuliah Struktur Data Noferianto Sitompul
Proses perubahan dari inorder ke preorder dan postorder ditunjukkan pada gambar berikutini :
Gambar 6.5. Rute kunjungan dengan preorder, postorder, inorder
Sub klas binary tree :- Full binary tree : setiap interval node tepat memiliki 2 cabang- Perfect binary tree : semua node leaf berada pada level sama- Complete binary tree :
1. Semua node leaf berada pada level terendah, merapat ke sebelah kiri ataumembentuk perfect binary tree
2. Jika tinggi = 0 berarti node tunggal3. Jika tinggi = 1 berarti node hanya dianak kiri4. Jika tinggi = h yaitu perfect tree adalah root yang memiliki subtree dari root dengan
tinggi h-1 adalah perfect binary tree di sebelah kiri dan sebelah kanan5. Subtree di sebelah kiri root adalah complete binary tree dengan tinggi h-1 dan sub
tree dari root adalah complete binary tree di kanan dengan tinggi h-2- Extended binary tree : binary tree dengan penggambaran tree-tree kosong dengan label
(legenda) node yang lain.
Di bawah ini diberikan implementasi algoritma dengan bahasa pascal sebagai berikut :
Type ref = ^node;Node = Record
Data : string;Left, right : ref;
End;
Procedure preorder (t : ref);Begin
If t nil thenBegin
Write(t^.data);Preorder(t^.left);Preorder(t^.right)
EndEnd;
Procedure postorder (t : ref);Begin
If t nil thenBegin
Postorder(t^.left);Postorder(t^.right)Write(t^.data);
EndEnd;
Procedure inorder (t : ref);Begin
If t nil thenBegin
inorder(t^.left);Write(t^.data);inorder(t^.right)
EndEnd;
-
Struktur Data
38Diktat Kuliah Struktur Data Noferianto Sitompul
VI.3. BINARY SEARCH TREEVI.3.1. KONSEP UMUM BST
Binary search tree(BST) adalah suatu tree yang setiap nodenya berisi key-key dalamBST tersebut sebagai berikut :a. Key dari root lebih besar dari key yang ada pada subtree kirib. Key dari root kanan lebih besar dari key yang ada pada subtree kiri.Point a) dan b) juga berlaku pada node-node di subtree.
BST ini digunakan untuk menyusun data karena fleksibel (mudah digunakan) danefisien (memiliki probe log n) dan natural (memiliki sifat representasi alami). Probe adalahtempat yang harus dilalui sampai ditemukan data yang diinginkan, perhatikan diagramberikut :
Gambar 6.6. Probe dalam pohon
Bila jumlah data = jumlah level disebut perfect binary tree (pohon seimbang) dengan depthadalah log N dan jika tidak seimbang depth = log N-1 , dan untuk lebih jelas perhatikandiagram berikut :
Gambar 6.7. Pohon seimbang
Jika jumlah data = N maka jumlah level (L) : untuk batas bawah 2log n + 1 dan batas atas2log (n+1) .
Bila jumlah data untuk tiap level : root = level–1 dan jumlah node pada tiap levelke i = 1 .. 2i-1, lengkapnya perhatikan tabel berikut :
Tabel 6.1. Jumlah data tiap levelLevel ke – i Jumlah data1234567
1 .. 11 .. 21 .. 41 .. 81 .. 161 .. 321 .. 64
-
Struktur Data
39Diktat Kuliah Struktur Data Noferianto Sitompul
Jika tiap level dari binary tree dengan L level penuh atau maksimum maka jumlah node jugamaksimum :
L-1
21-1 + 22-1 + 23-1 + .. + 2L-1 = 20 + 21 + 22 + .. + 2L-1 = ∑ 2i = 2L-1i=0
Perhatikan contoh berikut :1. N=10 maka Lmin =
2log 10 + 1 = 3 + 1 = 4 atau Lmax =2log (10+1) = 3.0…. ≈ 4
2. N= 130 maka L = 8 atau Lmin =2log 130 + 1 = 7 + 1 = 8
Misalkan sebuah pohon biner memiliki Llevel maka jumlah data adalah L .. 2i-1, dari contoh
di atas untuk L = 5 maka jumlah data = 5 .. 25-1 = 5 .. 31.
VI.3.2. REPRESENTASI BST DALAM ARRAYUntuk mencek posisi-posisi data dipohon dalam bentuk implementasi array bahwa
node root berada pada posisi i, anak kiri menempati posisi 2*i dan anak kanannyamenempati posisi 2*i+1 ; i adalah level.
Perhatikan bentuk pohon sebagai berikut :
a. BST dalam pohon
Selanjutnya juga dalam bentuk implementasi array, perhatikan diagram berikut ini :
b. BST dalam array
Gambar 6.8. Representasi BST dalam array
-
Struktur Data
40Diktat Kuliah Struktur Data Noferianto Sitompul
VI.3.3. OPERASI SISIP, HAPUS DALAM BSTA. Operasi SISIP
Dapat digambarkan untuk setiap keadaan sebagai berikut :
Gambar 6.9. Operasi sisip node dengan BST
B. Operasi HAPUSDapat digambarkan untuk setiap keadaan sebagai berikut :
Gambar 6.10. Operasi hapus node dengan BST
-
Struktur Data
41Diktat Kuliah Struktur Data Noferianto Sitompul
Berikut diberikan implementasi algoritma BST :
Type data = record….. : ….;
end;BST = record
node : tipe_data;left, right : ^BST;
end;T = ^BST;
Function makenull(P : T) : T;Begin
P := nil; makenull := p;End;
Procedure sisip(x : tipe_data ; var p : T);Begin
If p = nil thenBegin
New(p);P^.data := x; p^.left := nil;P^.right := nil;
End elseIf x.key p^.data.key then
sisip(x, p^right) elseWrite(‘duplikat’);
End;
Function cari (x : tipe_data, p : T) : boolean;Begin
If p=nil then cari := false elseIf x=p^.data.key thencari := true elseIf x
-
Struktur Data
42Diktat Kuliah Struktur Data Noferianto Sitompul
Terminologi yang digunakan antara lain :- Successor adalah penghapusan suatu node dimana posisi-posisi nilai node sesudahnya
akan dipindahkan ke rootnya- Predecessor adalah melihat apakah ada nilai node (child) di sebelah kiri dimasukkan ke
root dan di sebelah kanan tetap- Balanced value / vector adalah suatu proses penambahan node untuk melakukan
keseimbangan.
Proses AVL tree dengan BST dimana setiap internal node (node dalam) adalahmaksimum jumlah record kiri (ketinggian sub tree) dan jumlah record kanan (ketinggiansubtree kanan) berbeda maksimum 1 (0, 1). Faktor kesetimbangan yang diterima (kiri, root,kanan) adalah (-1,0,1).
Faktor kesetimbangan dapat dilakukan dengan rotasi, yang pada dasarnyapenyeimbangan kembali dilakukan dengan merotasikan node-node tertentu dalam subtreetersebut berdasarkan harga-harga faktor ketimbangan tingkat node-node atas dalam subtree.
Ada 4 jenis rotasi :1. Rotasi kiri tunggal
Bila N adalah subtree dimana terjadi penyisipan ( atau N adalah node baru di sisipan itusendiri) dan N adalah ancestor paling bawah yang mendapatkan faktor keseimbanganmenjadi –2, sementara P anak kiri dari R yang mana N adalah anak kiri dari P denganfaktor kesetimbangan P=-1. Rotasi dilakukan sehingga P menjadi ayah dari N dan Ryang masing-masing anak kiri dan kanan dari P sementara jika ada subtree kanan dari Pdengan x sebagai root maka akan menjadi subtree kiri dari R. Faktor kesetimbangan dariR dan P keduanya menjadi 0.
2. Rotasi kanan tunggalBila N adalah subtree dimana terjadi penyisipan ( atau N adalah node baru di sisipan itusendiri) dan N adalah ancestor paling bawah yang mendapatkan faktor keseimbanganmenjadi +2, sementara P anak kanan dari R yang mana N adalah anak kanan dari Pdengan faktor kesetimbangan P=+1. Rotasi dilakukan sehingga P menjadi ayah dari Ndan R yang masing-masing anak kiri dan kanan dari P sementara jika ada subtree kanandari P dengan x sebagai root maka akan menjadi subtree kanan dari R. Faktorkesetimbangan dari R dan P keduanya menjadi 0.
3. Rotasi kiri gandaBila N adalah subtree dimana terjadi penyisipan ( atau N adalah node baru di sisipan itusendiri) dan R adalah ancestor paling bawah yang mendapatkan faktor keseimbanganmenjadi –2, sementara P anak kiri dari R yang mana N adalah anak kanan dari P denganfaktor kesetimbangan P=-1. Rotasi dilakukan 2 kali pertama dalam subtree P yangmenghasilkan P sebagai anak kiri dari N. Jika N memiliki subtree kanan maka subtreeini menjadi subtree kiri dari R dan juga jika N memiliki subtree kiri maka subtree inimenjadi subtree kanan dari P. Faktor kesetimbangan menjadi 0. Faktor kesetimbangan Ndan R tergantung faktor kesetimbangan N semula. Jika faktor kesetimbangan N=0 makafaktor kesetimbangan P dan R keduanya menjadi 0. Jika faktor kesetimbangan =-1 makafaktor kesetimbangan menjadi 0 dan R = +1. Jika faktor kesetimbangan N = +1 makafaktor kesetimbangan P = -1 dan faktor kesetimbangan R = 0.
4. Rotasi kanan gandaBila N adalah subtree dimana terjadi penyisipan (atau N adalah node baru di sisipan itusendiri) dan R adalah ancestor paling bawah yang mendapatkan faktor keseimbanganmenjadi +2, sementara P anak kanan dari R yang mana N adalah anak kiri dari P denganfaktor kesetimbangan P=-1. Rotasi dilakukan 2 kali pertama dalam subtree P yang
-
Struktur Data
43Diktat Kuliah Struktur Data Noferianto Sitompul
menghasilkan P sebagai anak kanan dari N. Jika N memiliki subtree kiri maka subtreeini menjadi subtree kanan dari R dan juga jika N memiliki subtree kanan maka subtreeini menjadi subtree kiri dari P. Faktor kesetimbangan menjadi 0. Faktor kesetimbanganN dan R tergantung faktor kesetimbangan N semula. Jika faktor kesetimbangan N=0maka faktor kesetimbangan P dan R keduanya menjadi 0. Jika faktor kesetimbangan =-1maka faktor kesetimbangan menjadi 0 dan R = +1. Jika faktor kesetimbangan N = +1maka faktor kesetimbangan P = -1 dan faktor kesetimbangan R = 0.
Algoritma Menyeimbangkan kembali pada penyisisipan- Jika faktor kesetimbangan P semula adalah –1 (atau +1) dan sekarang menjadi 0 maka
proses selesai- Jika faktor kesetimbangan semula adalah 0 dan sekarang menjadi +1 (atau –1) maka
faktor kesetimbangan (ayah dari P) berkurang 1 dan jika P anak kiri dari R atau faktorkesetimbangan (ayah dari P) bertambah 1 jika P anak kanan dari R
- Bila faktor kesetimbangan R menjadi 0 maka selesai- (Berarti faktor kesetimbangan R menjadi –1 atau +1) Periksa secara rekursif ayah dari R
(jika ada) sebagai R sekarang, R semula menjadi P, P semula menjadi N sampai denganR = root atau selesai akibat kasus-kasus point sebelumnya
- (Berarti faktor kesetimbangan R semula adalah +1 menjadi +2 atau semula –1 menjadi –2). Periksa faktor kesetimbangan R dan P :1. Kasus faktor kesetimbangan P = -1 atau 0 dan faktor kesetimbangan R = -2.
Lakukan rotasi kiri tunggal dan selesai2. Kasus faktor kesetimbangan P = +1 dan faktor kesetimbangan R = -2. Lakukan
rotasi kanan ganda dan selesai3. Kasus faktor kesetimbangan P = +1 atau 0 dan faktor kesetimbangan R = +2.
Lakukan rotasi kiri tunggal dan selesai4. Kasus faktor kesetimbangan P = -1 dan faktor kesetimbangan R = +2. Lakukan
rotasi kanan ganda dan selesai
Algoritma Menyeimbangkan kembali pada penghapusan- Tahap pertama penghapusan suatu node pada AVL tree adalah melakukan penghapusan
sebagai yang dilakukan BST dan dilanjutkan dengan menyeimbangkan kembali- Misalkan suatu node yang dihapus adalah D, setiap ancestor R mulai dari ayah D ke atas
dilakukan pemeriksaan apakah terjadi perubahan faktor kesetimbangan- Jika D adalah suatu anak (keturunan) kanan dari R dan faktor kesetimbangan R semula
adalah 0 (yang menjadi –1 maka subtree R tetap seimbang serta tidak terjadipemendekan R sehingga proses selesai
- Jika D adalah suatu anak (keturunan) kiri dari R dan faktor kesetimbangan R semulaadalah 0 (yang menjadi +1 maka subtree R tetap seimbang serta tidak terjadipemendekan R sehingga proses selesai
- Jika faktor keseimbangan R semula adalah +1 atau –1 dan menjadi 0 maka terjadipemendekan subtree R dan proses pemeriksaan dilanjutkan ke ayah dari R sebagai Rsekarang
- Jika faktor keseimbangan R semula adalah –1 menjadi –2 (catatan : D adalahketurunan/anak kanan dari R) maka dengan anak kiri R disebut P dari anak kanan Rdisebut N1. Jika faktor keseimbangan P = 0 maka lakukan rotasi kanan tunggal dan selesai
karena tidak terjadi pemendekan subtree R
-
Struktur Data
44Diktat Kuliah Struktur Data Noferianto Sitompul
2. Jika faktor keseimbangan P = -1 maka lakukan rotasi kanan tunggal namun karenaterjadi pemendekan subtree R pemeriksaan untuk penyeimbangan kembalidilanjutkan pada ayah R sebagai R sekarang
3. (Berarti faktor keseimbangan = +1) dilakukan rotasi kanan ganda dan karena terjadipemendekan R dan proses penyeimbangan kembali dilakukan pada ayah R sebagai Rsekarang
- Faktor keseimbangan R semula adalah +1 dan menjadi +2 (catatan D adalahketurunan/anak kiri dari R) maka anak kanan R disebut P dan anak kiri R disebut N :1. Jika faktor keseimbangan P = 0 maka dilakukan rotasi kanan tunggal dan selesai
karena tidak terjadi pemendekan subtree R2. Jika faktor keseimbangan P = +1 maka dilakukan rotasi kanan tunggal namun karena
terjadi pemendekan subtree R pemeriksaan untuk penyeimbangan kembalidilanjutkan pada ayah R sebagai R sekarang
3. (Berarti faktor keseimbangan = -1) dilakukan rotasi kiri ganda dan karena terjadipemendekan R dan proses penyeimbangan kembali dilakukan pada ayah R sebagai Rsekarang
Contoh 1:
Gambar 6.11. Rotasi tunggal pada AVL tidak seimbang
Contoh 2:
Gambar 6.12. Rotasi ganda pada AVL tidak seimbang
-
Struktur Data
45Diktat Kuliah Struktur Data Noferianto Sitompul
Contoh 3 : Diberikan data sebagai berikut : 35, 40, 10, 12, 16, 17Bentuklah BST dan tahap-tahap AVL tree dari data ini.
Gambar 6.13. Pohon bentukan BST
Tahap-tahap pembentukan AVL tree :
Gambar 6.14. AVL tree
-
Struktur Data
46Diktat Kuliah Struktur Data Noferianto Sitompul
Berikut di bawah ini disajikan implementasi algoritma :Algoritma sisip dapat diambil dari yang sebelumnya dengan melakukan search dankemudian insert sebagai berikut :
Type ref =^node;Node = Record
Key : integer;Count : integer;Left, right : ref;Bal : -1 .. 1
End;
Procedure search (x : integer; var p : ref; varh : boolean;Var p1, p2 : ref; { h := false }Begin
If p = nil thenBegin
New (p); h := true;With P^ do begin
Key := x; count :=1;left := nil; right := nil;Bal := 0
EndEnd elseIf x p^.key thenbegin
search(x, p^.right, h);if h then
Case p^.bal of1 : begin
p^.bal := 0; h:= false;end;
0 : p^.bal := 1;-1 : begin {rebalanced}
p1 := p^.right;if p1^.bal := 1 thenbegin{single rotasi kanan }p^.right := p1^.left;p1^.left := p;
p^.bal := 0; p:=p1;end elsebegin (double rotasi}p2 := p1^.left;p1^.left := p2^.rightp2^.right := p1;p^.right := p2^.left;p2^.left := p;
if p2^.bal = 1 thenp^.bal := -1 elsep^.bal := 0;if p2^.bal := -1 thenp1^.bal := 1 elsep1^.bal :=0; p := p2;
end;p^.bal := 0; h:=false
endend else
beginp^.count := p^.count + 1;h:=false
end
-
Struktur Data
47Diktat Kuliah Struktur Data Noferianto Sitompul
Procedure delete(x : integer; var p : ref; varh : boolean);Var q, ref; {h := false}
Procedure balance1(var p : ref; var h :boolean);
Var p1, p2 : ref;b1,b2 :-1..1;
begincase p^.bal of-1 : p^.bal := 0;0 : begin
p^.bal := 1; h := false;end;
1 : beginp1 := p1^right;b1 := p1^.bal;if b1 >=0 thenbegin { single rotasi kiri }
p^.right := p1.left;p1.left:= p;if b1 = 0 then
beginp^.bal := 1;
p1^.bal := -1; h:=falseend elsebegin
p^.bal := 0; p1^.bal :=0;end;p := p1;
end elsebegin{ rotasi ganda }
p2 := p1^.left;b2 := p2^.bal;p1^.left := p2^.right;
p2^.right := p1;p^.right := p2^.left;p2^.left := p;if b2 = 1 then p^.bal := -1
else p^.bal := 0;if b2 = -1 then
p1^.bal := +1else p1^.bal := 0;p := p2; p2^.bal := 0;
end;end;
end;end;
Procedure balance2(var p : ref; var h :boolean);Var p1, p2 : ref;
B1, b2 : -1 .. 1;Begin
Case p^.bal of1 : p^.bal := 0;
0 : begin p^.bal := -1; h:=fasle; end;-1 : begin { rebalance }
p1 := p^.left; b1 := p1^.bal;if b1
-
Struktur Data
48Diktat Kuliah Struktur Data Noferianto Sitompul
If p^.key thenBegin
Delete(x, p^.left, h);If h then balance1(p,h)
End elseIf x > p^.key thenBegin
Delete(x,p^.right,h);If h then balance2(p,h)
End elseBegin
q := p;if q^.right = nil then
beginp := q^.left; h:= true
end elseif q^.left = nil thenbegin
p := q^.right; h:= trueend elsebegin
del(q^.left, h);if h then balance1(p,h)
endend
end;
VI.5. B-TREEB-Tree adalah struktur data yang sangat populer untuk pencarian disk bound. Sifat-
sifat B-Tree adalah :1. Item data disimpan pada leaves2. Node-node non leaf data sampai ke key M-1 yang merujuk pencarian key I yang
merepresentasi key yang paling kecil dalam subtree i+13. Root adalah juga suatu leaf atau yang memiliki anak antara 2 sampai dengan M4. Semua node non leaf (kecuali root) memiliki anak antara M/2 dan M5. Semua leaves dengan depth sama memiliki anak anatara L/2 dan L untuk setiap L
Perhatikan diagram berikut :
P0 K1 P1K2 …. Pm-
Gambar 6.15. B-Tree dengan M key
Misalnya di bawah ini ditunjukkan suatu B-Tree dengan order 2 dan 3 level, semua frameberisi 2, 3 atau 4 kecuali root diijinkan item tunggal.
Gambar 6.16. B-Tree untuk Order 2
Jika pencarian tidak berhasil kita berada dalam salah satu situasi berikut :1. Ki < X < Ki+1 untuk 1
-
Struktur Data
49Diktat Kuliah Struktur Data Noferianto Sitompul
1. Key 22 tidak ada dalam frame, sisip di frame C, ini tidak memungkinkan sebab frame Cpenuh
2. Frame C dipecah menjadi 2 frame, misalnya frame baru D dialokasi3. Key m+1 adalah sama diletakkan pada C dan D key tengah pindah ke atas 1 level
kedalam ancestor frame A.
Untuk melihat keadaan penyisipan, perhatikan diagram berikut :
Gambar 6.17. B-Tree dengan sisipan data
Contoh 1:Buatlah B-Tree dengan sikuensi data sebagai berikut :20; 40 10 30 15 ; 35 7 26 18 22 ; 5 ; 42 13 46 27 8 32 ; 38 24 45 25 ;Catatan : tanda ; adalah batas frame.
Gambar 6.18. Keadaan B-Tree setelah proses penyisipan data
-
Struktur Data
50Diktat Kuliah Struktur Data Noferianto Sitompul
Contoh 2:Buatlah B-Tree dengan sikuensi data yang akan dihapus sebagai berikut :25; 45 24 ; 38 32 ; 8 27 46 13 42 ; 5 22 18 26 ; 7 35 15 ;
Gambar 6.19. Keadaan B-Tree setelah penghapusan data
-
Struktur Data
51Diktat Kuliah Struktur Data Noferianto Sitompul
Berikut perhatikan implementasi algoritma dengan bahasa pemrograman Pascal :
Const n = 2;nn = 4; { page size }
type ref = ^frame;item = record
key : integer;p : ref;count : integer
end;end;
end;m := n; b^.m := n;
b^.p0 := v.p; v.p := b;end;
end;frame = record
m : 0 .. nn;po : ref;e : array[1..nn] of item
end;var root, q : ref;
x : integer;h : boolean;u : item;
Procedure search(x : integer; a : ref; var h :boolean; var v : item);Var k,l, r : integer; q : ref; u: item;Procedure insert;Var I : integer; b: ref;Begin
With a^ doBegin
If n < nn thenBegin
Inc(m); h:=false;For i:= m downto r+2 do
e[i]:=e[i-1];e[r+1] := u
end elsebegin
new(b);if r 1 thenbegin
e[k].count := e[k].count + 1;h:= false
end elsebegin
if r=0 then q:=p0else q := e[r].p;search(x,q,h,u);If h then insert
EndEnd;
End;
Procedure delete (x : integer; a : ref; var h :boolean);Var i, k, l, r : integer; q : ref;Procedure underflow (c,a : ref; s : integer;var h : boolean);Var b : ref; i, k, mb, mc : integer;Begin
mc := c^.m;if s < mc thenbegin
s := s+1; b:= c^.e[s].p;mb := b^.m ; k:= (mb-n+1) div 2;a^.e[n] := c^.e[s];a^.e[n].p := b^.p0;
-
Struktur Data
52Diktat Kuliah Struktur Data Noferianto Sitompul
if k>0 thenbegin
for i:= 1 to k-1 doa^.e[i+n] := b^.e[i];
c^.e[s] := b^.e[k]; c^.e[s].p := b;b^.p0 := b^.e[k].p; mb:=mb – k;for i:= 1 to mb do
b^.e[i] := b^.e[i+k];b^.m := mb; a^.m := n-1+k;h:= false;
end elsebegin
for i:= 1 to n doa^.e[i+n] := b^.e[i];
for i:= s to mc-1 doc^.e[i] := c^.e[i+1];
a^.m := nn; c^.m := mc –1;h := c^.m < n
endend elsebegin
if s=1 then b:= c^.p0else b:=c^.e[s-1].p;mb := b^.m + 1; k := (mb-n) div 2;if k>0 thenBegin
For i:= n-1 downto 1 doa^.e[i+k] := a^.e[i];
a^.e[k] := c^.e[s];a^.e[k].p := a^.p0; mb := mb – k;For i:= k-1 downto 1 do
a^.e[i] := b^.e[i+mb];a^.p0 := b^.e[mb].p;c^.e[s] := b^.e[mb];
c^.e[s].p := a; b^.m := mb-1;a^.m := n-1+k; h:= false
end elsebegin
b^.e[mb] := c^.e[s];b^.e[mb].p a^.p0;for i:= 1 to n-1 do
b^.e[i+mb] := a^.e[i];b^.m := nn; c^.m := me-1;h:= c^.m 1 thenbegin
if q = nil thenbegin
dec(m); h:= m
-
Struktur Data
53Diktat Kuliah Struktur Data Noferianto Sitompul
Writeln;Printtree(p0,l+1);For i:= 1 to m do
Printtree(e[i].p, l+1);End;
End;
BeginRoot := nil;While x 0 doBegin
Writeln(‘Cari key’,x);Search(x,root,h,u);
If h thenBegin
q := root; new(root);with root^ dobegin
m := 1; p0 := q; e[1] := uend
end;printtree(root,1);read(x)
endEnd.
VI.6. BINARY B-TREEBinary B-Tree (BB-Tree) adalah B-Tree khusus dimana order pertama B-Tree (n=1)
yang mengaproksimasi setengah frame-frame hanya akan berisi item tunggal untukdisimpan (store) yang berada pada satu level.
B-Tree berisi node-node (frame) dengan 1 atau 2 item lainnya, kemudian 1 page /frame berisi 2 atau 3 pointer (terhadap sabling) yang akan mengindikasikan 2 sampaidengan 3 tahap pohon.
Berdasarkan B-Tree bahwa semua node/frame leaf berada pada level yang sama, dansemua frame (keturunan) non leaf yang kedua 2 atau ketiga termasuk root. Alternatif darisuatu alokasi linked yang masing-masing berisi masing-masing node terdapat linked listdengan panjang item 1 atau 2. Perhatikan diagram di bawah ini untuk lebih memperjelaspemahaman akan BB-Tree sebagai berikut :
Gambar 6.20. Representasi node dalam BB-Tree
Proses pencarian pohon menjamin panjang path maksimum P = 2 log N
-
Struktur Data
54Diktat Kuliah Struktur Data Noferianto Sitompul
Saat melakukan penyisipan ada 4 kemungkinan yang perlu diperhatikan antara lain :1. Pada saat subtree kanan dibuat dan A merupakan key pada frame tersebut, kemudian
keturunan B menjadi sabling (saudara) A, misalnya pointer vertikal menjadi horijontalpointer
2. Tentukan frame berikut dengan 3 node dengan memecah dan merotasinya.
3. Bila subtree B diproses pada ketinggian tertentu maka pointer A akan merepresentasiketurunan, kemudian keturunan subtree A diijinkan menjadi saudara B. Dengandemikian frame mempunyai anggota 3 node sebagai berikut :
4. Dengan adanya pemotongan tanpa memperhatikan seperti langkah kedua, maka akandiperoleh sebagai berikut :
Gambar 6.21. Penyisipan node dalam BB-Tree
Pencarian dengan cara seperti diatas menunjukkan perbedaan (tidak efektif) apakahproses sepanjang horijontal dan vertikal (kasus langkah ketiga). Untuk menangani haltersebut subtree kiri dan kanan diselesaikan secara intuisi yaitu “fisky” dengan membuangyang asimetris, sehingga dinamakan Symetric Binary B-Tree (SBB-Tree).
Pencarian yang lebih efektif, untuk mencapai rata-rata, tetapi proses sisip dan hapusakan lebih kompleks dimana masing-masing nodc butuh 2 bit (variabel boolean lh dan rh)untuk mengindikasi 2 pointer secara alami.
Berikut dibawah ini terdapat 4 kasus penyisipan dalam SBB-Tree, semuanya akanmerepleksikan kejadian frame yang overflow dan pemisahan sub sikuensi frame.
-
Struktur Data
55Diktat Kuliah Struktur Data Noferianto Sitompul
Gambar 6.22. Penyisipan node dalam SBB-Tree
Contoh :Deretan data (; adalah tanda pemisah frame (sanpshot)) dimana semua node tersebut beradadalam 1 level disebut hedge.(1) 1 2 ; 3 ; 4 5 6 ; 7 ;(2) 5 4 ; 3 ; 1 2 7 6 ;(3) 6 2 ; 4 ; 1 7 3 5 ;(4) 4 2 6 ; 1 7 ; 3 5 ;
-
Struktur Data
56Diktat Kuliah Struktur Data Noferianto Sitompul
Gambar 6.23. Pengembangan Hedge Tree pada proses sisip
Hal-hal yang perlu diperhatikan sebagai berikut :1. Jika h=0 maka subtree P tidak meminta pertukaran struktur pohon2. Jika h=1 maka node P mempunyai sabling (saudara tertentu)3. Jika h=2 maka subtree P memiliki pertambahan dalam ketinggian.
Implementasi algoritma dengan bahasa pemrograman pascal sebagai berikut :
Procedure search(x : integer; var p : ref; varh : integer);Var p1, p2 : ref;Begin
If p = nil thenBegin
New(p); h := 2;With p^ doBegin
Key := x; count := 1;Left := nil; right := nil;Lh := false; rh := false
EndEnd elseIf x < p^.key thenBegin
Search(x, p^.left, h);
If h 0 thenIf p^.lh thenBegin
P1 := p^.left ;h:=2;p^.lh := false;If p1^.lh thenBegin
P^.left := p1^.right;P1^.right := p;p1^.lh := false;p:= p1
End elseIf p1^.rh thenbegin
P2 := p1^.right;p1^.rh := false;
-
Struktur Data
57Diktat Kuliah Struktur Data Noferianto Sitompul
endend elsebegin
P1^.right := p2^.left;p2^.left := p1;p^.left:= p2^.right;p2^.right := p; p:=p2;
h:= h-1;if h 0 then
p^.lh :=trueend;
end elseIf x < p^.key thenBegin
Search(x, p^.right, h);If h 0 then
If p^.rh thenBegin
P1 := p^.left ;h:=2;p^.rh := false;If p1^.rh thenBegin
P^.right := p1^.left;P1^.left := p;
p1^.rh := false;p:= p1
End elseIf p1^.lh thenbegin
P2 := p1^.left; p1^.lh:= false; P1^.left :=p2^.right; p2^.right:= p1; p^.right:=p2^.left; p2^.left := p;p:=p2;
endend elsebegin
h:= h-1;if h 0 then
p^.rh :=trueend;
end elsebegin
p^.count := p^.count+1 ;h:= 0;
endend;
-
Struktur Data
58Diktat Kuliah Struktur Data Noferianto Sitompul
BAB VII HASHING DANKOMPRESI
VII.1. KONSEP HASHTabel hashing digunakan untuk mengimplementasikan kamus dalam waktu
konstan per operasi. Tabel hash mendukung pemanggilan dan penghapusan padabeberapa item yang telah dinamai sebelumnya.
Untuk mengimplementasikan hash dapat mempergunakan array, dimana arraytersebut akan diinisialisasi dengan indeks-indeks tertentu untuk melaksanakan prosespenyisipan data dengan memetakan item-item ke dalam indeks dikenal fungsi.
Fungsi hash digunakan untuk mengkonversi suatu item yang bernilai integerdengan indeks array dimana item tersimpan. Jika fungsi hash satu ke satu, kita dapatmengakses item dengan indeks arraynya sendiri sedangkan yang lainnya sebagian itemmengambil beberapa indeks yang sama dan akan mengakibatkan tabrakan (collision).Misalnya suatu fungsi polinomial : A3x
3 + A2x2 + A1x
1 + A0x0 dapat dievaluasi
sebagai (((A3)x + A2)x + A1)x + A0
Metode pemilihan key adalah :1. Metode pembagian modulus (mod) yaitu menggunakan sisa dari setiap item data,
dimana f(key) = h(key) = k mod b ; dimana k adalah key dan b adalah jumlah blokyang tersedia (biasanya bilangan prima).
2. Metode midsquare yaitu masing-masing item-item data yang akan disimpandikwadratkan, kemudian memilih blok (bucket) penampung sesuai dengan nilai digityang di tengah dari hasil data yang dikuadratkan tersebut.
Misalnya jumlah blok (bucket) = 13
Gambar 7.1. Metode midsquare
3. Metode penjumlahan digit yaitu setiap digit dari suatu bilangan dijumlah dankemudian data tersebut disimpan pada blok yang sesuaiContoh :
169 529 225 256f(K)= 1+6+9 5+2+9 2+2+5 2+5+6
= 16 16 9 13
Collision
Jenis-jenis hashing :1. Open hashing (hashing terbuka)
Open hash (external hash) adalah suatu table dimana proses pertukaran item datadengan pointer masing-masing (tidak terpisahkan) tidak terbatas
-
Struktur Data
59Diktat Kuliah Struktur Data Noferianto Sitompul
F(key) : 3 0 10 2 3 0 1 11 8 11Maka :
2. Close hashing (hashing tertutup)Proses pemetaan data dalam tabel dengan indeks masing-masing, dimanakelemahannya sering terjadi collision.
Untuk mengatasi collision terdapat beberapa cara :1. Metode separate chaining
Bahwa tabel hash T[0], T[1], T[2], … , T[n] akan berisi header list yang merujuk listdengan nilai f(K). Setiap lokasi berisi header list pada elemen data f(key) = i. Metodeini membutuhkan temporary space (tempat tambahan)
2. Metode closed chainingMerupakan modifikasi separate chaining dimana setiap item data ditambahkan link[i]yang merujuk item data selanjutnya. Proses ini akan selalu mencari tempat yangkosong untuk memetakan data, sedang pencarian biasanya dilakukan mulai dari posisiN sampai dengan posisi 1 dengan catatan tidak ditemukan collision.
3. Linier probing dan quadratic probing (open addressing)Merupakan metode chaining yang secara sekuensial yang tidak menggunakan spaceuntuk link item data.
Probe adalah suatu proses perbandingan nilai data pertama dengan data lain. Probeminimum (terbaik) = 1 berarti kompleksitasnya O(N) = 1 dan probe maksimum(terburuk) = N berarti kompleksitasnya O(N) = N (terurut) dan probe rata-rata = (1 + n)/2berarti kompleksitasnya O(1+N)/2 = (1 + N)/2 dan probe kegagalan adalah O(N) = 0.
Perhatikan contoh berikut :Diberikan deretan data adalah : 3, 13, 23, 15, 16, 26, 27, 37, 47, 50 data-data ini akandipetakan ke dalam 13 blok (bucket) untuk menyimpan item-item data sebagai berikut :- f(3) = 3 mod 13 = 3- f(13) = 13 mod 13 = 0- f(23) = 23 mod 13 = 10- f(15) = 15 mod 13 = 2- f(16) = 16 mod 13 = 3- f(23) = 26 mod 13 = 0- f(27) = 27 mod 13 = 1- f(37) = 37 mod 13 = 11- f(47) = 47 mod 13 = 8- f(50) = 50 mod 13 = 11
Collision
Collision
Collision
VII.2. LINIER PROBINGMerupakan pencarian secara sekuensial dalam array, pencarian dilakukan nulai
dari posisi awal sampai dengan akhir tabel. Jika collision pada suatu alamat maka akandicari alamat kosong kemudian kembali ke awal pengalamatan.
Data : 3 13 23 15 16 26 27 37 47 50
-
Struktur Data
60Diktat Kuliah Struktur Data Noferianto Sitompul
Key Fungsi Probe (kali)313231516
f(3)=3f(13)=0f(23)=10f(15)=2f(16)=3
11111
Gambar 7.2. Proses linier probing
Jadi melihat proses pemetaan data ke dalam array maka dapat kita lihat berapa kali prosesprobing, seperti diperlihatkan pada tabel 7.1. berikut di bawah ini :
Tabel 7.1. Proses probing
Jumlah probeRata-rata probe = -----------------
Jumlah data= 17/10 = 1,7
-
Struktur Data
61Diktat Kuliah Struktur Data Noferianto Sitompul
26
27
374750
f(16)=4f(26)=0f(26)=1f(27)=1f(27)=2f(27)=3f(27)=4f(27)=5f(37)=11f(47)=8f(50)=11f(50)=12
111111111111
Total 17
VII.3. QUADRATIC PROBINGProses mengkwadratkan posisi-posisi elemen data, kemudian membagi (mod)
setiap elemen data, misalnya x = 5 bila B = 100 maka alamat hash (x) = 52 mod 100 = 25untuk menghindari collision digunakan quadratic probing.
Misalnya h(x) = y maka h2(x) = (y2 + y) mod B atau hi(x) = (hi-1(x) + P) mod B ; dimanap = 1,2,3…Hash function mengevaluasi H kemudian mencoba H2+12 ; H2+22 ;H2+32; …; H2+n2 ;dengan qwadratic probing dapat diselesaikan dilakukan dengan 2 cara :
Cara I :
Gambar 7.3. Qaudratic probing
Berarti :
-
Struktur Data
62Diktat Kuliah Struktur Data Noferianto Sitompul
Cara II :
Tabel 7.2. Proses infinitive probingIndeks Key Modulo Address Probe Collision
123456
7
89
H(2)H(3)H(5)H(7)H(11)H(13)H(13)H(17)H(17)H(19)H(23)H(23)H(23)H(23)
…..
2 %102 %105 %107 %1011 %1013 %10(13+12) %1017 % 10(17 + 12) %1019 % 1023 % 10(23+12)%10(23+22)%10(23+32)%10
……
23571347893472
……
11111111111111
….
1
1
1111
……
Sehingga untuk sikuensi data diatas apabila diselesaikan dengan quadratic probing akanterjadi collision yang tidak terbatas (infinity) seperti pada item data 23 (tabel 7.2)
Gambar 7. 4. Infinitive Probing
Kasus :Selesaikan dengan quadratic probing kasus berikut :Diberikan key-key yang akan diinput dalam tabel hash “satu”, “dua”, “tiga”, “empat”,“lima”, “enam”, “tujuh”, “delapan”, “sembilan”, “sepuluh”.Spesifikasi :- Jumlah blok/bucket (ukuran hash) = 17 (indeks 0 sampai dengan 16)- Fungsi hash H(x) berdasarkan metode perkalian dengan A = 0.618- Fungsi ordinal () total bilangan alpabetik dari huruf-huruf pada key (“a”=1, “b”=2,
“c”=3, ..., “z”=26)- Coallision dipecahkan dengan cara rehashing dengan fungsi h2(x,i)=-i *
((ord*(x)%5)+1) sehingga penempatan probing ke i adalah hi(x) = h1(x) + h2(x)dengan i =1,2,3, …
Tunjukkan urutan penempatan key-key tersebut dalam tabel dan berapa jumlah collisionyang terjadi pada masing-masing penempatan key.Jawab :
Tabel 7.3. Konversi alpabetik dengan fungsi ordinal
-
Struktur Data
63Diktat Kuliah Struktur Data N