85
Struktur Data 24 Diktat Kuliah Struktur Data : Noferianto Sitompul STRUKTUR DATA Diktat Kuliah OLEH : Noferianto Sitompul STMIK BUDIDARMA MEDAN 2016

Struktur Data - ryancom.files.wordpress.com · Title: Microsoft Word - Struktur Data.DOC Author: ��Sinurat Created Date: ��D:20180405094645Z

  • Upload
    others

  • View
    2

  • Download
    0

Embed Size (px)

Citation preview

  • 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