• Tidak ada hasil yang ditemukan

Struktur Data materi dimas (1)

N/A
N/A
Protected

Academic year: 2018

Membagikan "Struktur Data materi dimas (1)"

Copied!
86
0
0

Teks penuh

(1)

Hal : 16

SINAR SINURAT, ST STMIK BUDIDARMA

BAB I

PENDAHULUAN

I.1. PENGERTIAN

Berbicara dengan struktur data maka perlu memperhatikan beberapa aspek seperti logika, algoritma dan kompleksitas program. Struktur data menjadi sangat penting dalam mendisain sebuah program yang efisien dengan akses yang sangat efektif. Sebuah program merupakan proses bentukan dari stuktur data dan algoritma.

Data diorganisasi sedemikian rupa dengan cara yang berbeda-beda, baik menurut logika

maupun model model matematika kemudian disusun menurut aturan-aturan yang benar yang disebut dengan struktur data. Data adalah fakta-fakta / angka-angka yang sudah terekam tetapi belum digunakan untuk suatu keperluan. Struktur adalah elemen-elemen pebentuk atau pengaturan hubungan antar elemen dalam suatu sistem.

Model data dapat dipandang dengan 2 cara yaitu :

1. Struktur yang cukup menghubungkan data dalam dunia nyata

2. Struktur sederhana untuk dapat mengefektifkan proses data yang diperlukan.

Struktur data dibagi atas 3 tingkatan struktur yaitu : 1. Defenisi fungsional

2. Referensi logika 3. Referensi 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 of value) 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. Set

2. Array

3. Record

4. File

5. Pointer, dan lain-lain

Tipe data abstrak (TDA)

(2)

Hal : 17

SINAR SINURAT, ST STMIK BUDIDARMA

Contoh :

Himpunan bilangan bulat : { ...,-3,-2,-1,0,1,2,3, ... } operasi yang dapat dilakukan terhadap himpunan 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, artinya defenisi jenis data dan operasi-operasi yang diperbolehkan dilokalisasi dalam satu bagian program. Tipe data dari sebuah variabel adalah kumpulan nilai tertentu yang dimuat oleh variabel tersebut. Misalnya tipe data boolean yang hanya bernilai true atau false dan tidak boleh yang lain.

I.2. KONSEP ARRAY

Array merupakan struktur data yang paling sederhana, kesederhanaannya dapat dilihat dari pemberian notasi model linier (dimensi). Dalam array linier dengan jumlah data terbatas (finite) didefenisikan sebagai berikut : A1, A2, A3, ..., An atau dengan notasi dalam kurung :

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 adalah indeks yang menyatakan sekuensi proses.

Selain model notasi linier satu dimensi juga diperbolehkan untuk dua atau tiga dimensi 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 vektor 2. Array 2 dimensi : tabel dan matriks

3. Array multidimensional : secara teoritis bahwa jumlah dimensi tidak terbatas akan tetapi hanya dibatasi oleh besarnya memory

4. 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 komponen di 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 = L

Jumlah elemen = (U x (U+100/2 dan Jumlah memory = L x jumlah elemen

− Array jarang (Sparse Array) : Array yang kebanyakan komponennya mempunyai satu

(3)

Hal : 18

SINAR SINURAT, ST STMIK BUDIDARMA

I.3. KONSEP LINKED LIST

List dianalogikan sebagai daftar (record), kemudian beberapa daftar / record digabung atau dihubungkan sebagai rangkaian suatu proses yang disebut dengan link. Suatu entitas dimana record-recor yang termuatdi dalamnya dihubungkan (linked) menjadi satu proses bersama disebut linked list. Linked list untuk pertama kalinya dapat dikenali dan dihubungkan dengan suatu pointer head. Perhatikan diagram berikut dalam gambar 1.1

Contoh :

Pada gambar 1.1. ditunjukkan bahwa head akan merujuk (menyimpan alamat) record tersebut. Rangkaian linked list dikenali dengan head, listlist terkait dan tail

Jenis-jenis linked list antara lain :

1. List dengan elemen terkahir menunjuk diri sendiri

2. List yang mencatat dari elemen pertama sampai terakhir

3. List circular

4. Double linked list

5. Binary list

6. Multiple linked list

Gambar 1.1. Bentuk list Record / list

tail prev prev tail

head head

head head

(4)

Hal : 19

SINAR SINURAT, ST STMIK BUDIDARMA

I.4. KONSEP TREE

Tree (pohon) adalah struktur data yang menyatakan frekuensi data dengan relasi dalam suatu hirarki antara elemen-elemen data, induk relasi tersebut adalah root (akar) dan cabang-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.

I.5. KONSEP STACK

Stack (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 selalu mengambil posisi di akhir tumpukan (top of stack) dengan bentuk penotasiannya dengan postfix. Operasi pada stack adalah PUSH (memasukkan data dalam stack) dan POP (mengambil data dari stack). Perhatikan diagram berikut dalam gambar 1.4.

I.6. KONSEP QUEUE

Mahasiswa

NIM Nama Alamat Umur Jurusan Hobby

Jalan Area

Kota kdpos

Gambar 1.3. Bentuk pohon

(5)

Hal : 20

SINAR SINURAT, ST STMIK BUDIDARMA

Queue (antrian) adalah struktur data (list linier) yang menganut paham FIFO (first in first out) dimana operasi penghapusan dilakukan di depan (front) list dan operasi sisip dilakukan di belakang (rear) list. Perhatikan diagram berikut dalam gambar 1.5.

1.7. KONSEP GRAPH

Graph (grafik) merupakan bagian struktur data yang mengindikasikan adanya relasi-relasi (many to many) yang beraturan dan tidak beraturan diantara pasangan elemen-elemen data baik untuk tipe yang sama atau berbeda dengan berbentuk network / jaringan.

Contoh Grafik :

out in

Gambar 1.5. Bentuk Antrian

(6)

Hal : 21

SINAR SINURAT, ST STMIK BUDIDARMA

BAB II

FUNGSI, TIPE DATA DAN NOTASI ALGORITMA

Demi kelancaran pemahaman akan struktur data lebih lanjut maka perlu mengetahui bentuk-bentuk fungsi dan notasi yang sering digunakan baik dalam algoritma maupun program.

II.1. FUNGSI DAN NOTASI MATEMATIKA

FUNGSI FLOOR DAN CEILING

Misalkan 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⎤ = 4

⎣8.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 ABSOLUTE

Misalkan 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) = 7

abs |-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 :

FUNGSI FAKTORIAL

Misalkan 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 = 2 3 = 3 * 2 = 6

4 = 4 * 6 = 24 5 ! = 5 * 24 = 120

n

Sum (Σ) = Σ ai

(7)

Hal : 22

SINAR SINURAT, ST STMIK BUDIDARMA

FUNGSI PERMUTASI

Jumlah 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 maka a rumus :

c (a,c)

a (b,a) b

c (b,c)

a (c,a) c

b (c,b)

II.2. TIPE DATA

Dalam 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 INTEGER

Merupakan nilai bilangan bulat dalam bentuk decimal maupun hexadecimal. Perhatikan tabel 2.1. berikut :

Tabel 2.1. Tipe data integer

Tipe Ukuran memori

(byte)

Range nilai

Byte Shortint Integer Word Longint

1 2 4 8 10

0 ... 125 -128 ... 127 -32768 …32767 0 … 65535

-2147483648 … 2147483647

NUMERIK REAL

Nilai konstanta numeric berkisar dari 1E-38 sampai dengan 1E + 38 dengan mantissa yang signifikan sampai dengan 11 digit. Nilai E menunjukkan 10 pangkat. Nilai konstanta numerik real menempati memori 6 byte.

n !

(8)

Hal : 23

SINAR SINURAT, ST STMIK BUDIDARMA

Tabel 2.2. Tipe data real

Tipe Ukuran Memori

(byte)

Range nilai Signifikansi

Digit Single

Double Extended Comp

4 8 10 16

1.5 x 10E-45 … 3.4 x 10E38 5.0 x 10E-324 … 1.7 x 10E308 1.9 x 10E-4951 … 1.1 x 10E4932 -2E + 63 + 1 … 2E +63- 1

7 – 8 15 – 16 19 – 20 19 - 20

II.3. NOTASI ALGORITMA

Notasi algoritma yang dipakai pada umumnya adalah :

Assign ekspressi adalah = atau := atau ←

Misalnya : untuk meng-assign suatu nilai terhadap suatu variabel

X = 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 suatu pembanding atau perulangan suatu operasi dapat dilakukan dengan :

If (a == b) then ekspressi atau if (a ==b) then ekspressi1 else ekspressi 2

Case a of

1: ekspressi1 ; 2: ekspressi2; ... end;

Operator adalah + atau - atau / atau *

Misalya : untuk mejumlahkan atau mengurangkan atau membagi bahkan untuk mengalikan 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 menggunakan operator kondisi atau looping

for ( a < b) do ekspressi atau while (a < b) do ekspressi

Repeat

(9)

Hal : 24

SINAR SINURAT, ST STMIK BUDIDARMA

BAB III

ARRAY, RECORD, SET, POINTER

II.1. ARRAY

Merupakan gugus yang menggambarkan struktur yang mengalokasi alamat (storage) di memory untuk suatu operand dengan suatu indeks. Array dapat bertipe data sederhana ataupun tipe data enumerate. Perhatikan diagram berikut pada gambar 3.1.

Pencapaian / akses data dibagi 2 : 1. Positional access

Merupakan akses dilakukan berdasarkan nilai indeksnya, sedangkan 2. Associative access

Merupakan akses berdasarkan nilai atau isi komponennya. Akses berdasarkan indeks adalah alamat komponen memory dapat dihitung berdasarkan komponen indeksnya.

Akses berdasarkan indeks dibedakan :

1. Alamat (address) komponen dalam memory dapat dihitung berdasarkan nilai indeksnya

2. Untuk array dengan D dimensi, dibutuhkan D penjumlahan dan D perkalian

3. 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 time adalah waktu dimana array diberikan pada suatu lokasi /address di memory, bisa pada saat compile, execute, dan lain-lain.

2. Component length (L)

Panjangnya memory untuk menyimpan satu komponen. L tergantung dari tipe komponen dan bahasa pemrograman, misalnya pada Turbo Pascal 7.0 tipe integer mempunyai 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

Tipe Ordinal Array

Tipe Array [ ]

;

Tipe Indeks of Tipe

Tipe indeks

(10)

Hal : 25

SINAR SINURAT, ST STMIK BUDIDARMA

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 pemrograman 2. 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<t ≤ d ;

C0 = B – (C1 x I1) - … - (Cd x Id)

Rumus perhitungan besarnya penggunaan memory (M) : M = L x ( U1 – I1 + 1) x … x (Cd – Id + 1)

Contoh deklarasi program pascal:

Var a : array [0..4] of integer; atau int S[5];

Jika diketahui : B = 500, L = 2 Maka I1 = 0, U1 = 4

C1 = L = 2

C0 = B + (C1 x I1)

= 500 + (2 x 0) = 500

Catatan : dalam bahasa C bahwa indek selalu dimulai dari 0, maka C0 = B sedangkan dalam

bahasa Pascal dideklarasikan sendiri oleh programmer-nya. jadi address dalam pemrograman bahasa C:

Sistem Operasi

(11)

Hal : 26

SINAR SINURAT, ST STMIK BUDIDARMA

S[I] = C0 + C1 x I1 maka

S[4] = 500 + (2 x 4) = 508 S[3] = 500 + (2 x 3) = 506 S[2] = 500 + (2 x 2) = 504 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 :

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 <= 7; i++)

Begin scanf(“%d”, &x[i]);

For i := 1 to 7 do Readln(x[i]); for (i=0; i<=7;i++)

For i := 1 to 7 do Writeln(x[i]); printf(“%d\n”,x[i]);

End. }

II.2. RECORD

Data terstruktur yang mengumpulkan beberapa item data untuk masing-masing tipe data yang sama atau berbeda disebut field. Perhatikan diagram berikut pada gambar 3.3.

? ? ? ? ? ? X[1] X[2] X[3] X[4] … X[n]

Gambar 3.3. Bentuk array linier

Record

Tipe Record Tipe

(12)

Hal : 27

SINAR SINURAT, ST STMIK BUDIDARMA

Contoh fragmen program dari

/* Bahasa Pascal adalah : */ /* Bahasa C/C++ adalah : */

Uses CRT #include <stdio.h>

Type Data = Record struct data {

Nama :string; char *nama;

Umur : byte; int umur; }

End; data x;

Var x : data; {

Begin scanf(“%s”, &x.nama);

Readln(x.nama); scanf(“%d”, &x.umur);

Readln(x.umur); printf(“%s\n”, x.nama);

Writeln(x.nama, x.umur); printf(“%d\n”, x.umur);

End; }

Proses pembacaannya dapat digantikan dengan cara : Begin

With x do begin

Readln(nama, umur);

end; end

III. SET

Bagian struktur data yang mengatur objek-objek dalam set, dimana anggota-anggota set mempuyai tipe yang sam (base type) yaitu tipe ordinal (integer, boolean, cahr, skalar kecuali real).

Perhatikan diagram berikut pada gambar 3.4.

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 then Jlh := jlh + 1;

Writeln (‘Jumlah huruf hidup : ‘, jlh); End.

Gambar 3.5. Diagram proses Set Tipe Ordinal Set

(13)

Hal : 28

SINAR SINURAT, ST STMIK BUDIDARMA

Contoh 2 :

{ Menghasilkan huruf yang pernah dipakai dalam suatu kalmia } Type karakter = set of char;

Var karset : karakter; i : byte;

pakai, kalimat : string; Begin

Karset := [];

Write(‘Masukkan suatu kalimat : ‘); readln(kalimat); For i:=1 to length(kalimat) do

If not ([kalimat[i]] <= karset) then Begin

Karset := karset + kalimat[i]; Pakai := pakai + kalimat[i] + ’ ’ End;

Writeln (‘Karakter-karakter yang digunakan : ‘, pakai); End.

III.4. POINTER

Merupakan struktur data berupa variable dinamis yang tidak dapat dideklarasikan secara eksplisit seperti variabel statis dan tidak dapat langsung ditunjukkan oleh suatu pengenal (identifier).

Pointer ini hanya dapat ditunjukkan oleh variable khusus yang berisi alamat memory yang digunakan oelh variable dinamis. Jadi variabel pointer hanya dapat dideklarasikan dengan tipe data pointer (simbol ↑ baca carat atau circumflex). Perhatikan contoh fragmen program 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 = record

Kode : string; Nama : string; Gaji : real;

End;

Var datakar : array [1..5] of kar; i : byte;

Begin

For i := 1 to 5 do

Begin

(14)

Hal : 29

SINAR SINURAT, ST STMIK BUDIDARMA

With datakar[i]^ do Begin

Readln(kode); Readln(nama); Readln(gaji); End;

End;

For i := 1 to 5 do Begin

With datakar[i]^ do Begin

Writeln(i, kode, nama, gaji); End;

End; End;

(15)

Hal : 30

SINAR SINURAT, ST STMIK BUDIDARMA

BAB IV

LINKED 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) pada alamat-alamat tertentu. Berikut akan dijelaskan lebih dahulu deklarasi-deklarasi list.

IV.1. STATEMENT NEW, DISPOSE DAN VARIABEL POINTER

Statement NEW

Digunakan untuk mengalokasi storage dalam node baru kemudian kita mereferensi masing-masing node baru yang menyimpan informasi tentang variabel pointer tersebut.

Statement DISPOSE

Digunakan untuk membebaskan list dari rangkaian linked list yang ada.

Perhatikan diagram berikut pada gambar 4.1.

Type Str1 = array [1..3] of char; Node = Record

Kata : String; Next : ^node;

End;

Nodepointer = ^node;

Sehingga operasi dapat dilakukan dengan :

Jika dimisalkan entry data adalah : P^.Kata =’Agus’ dan Q^.Kata = ’Budi’ maka bentuk listnya adalah sebagai berikut :

Perhatikan proses perpindahan ke list berikutnya dengan memisalkan bahwa : ?

New (P)

? New (Q)

Dispose (P) { List P akan hilang }

Dispose (Q) { List Q akan hilang } P

Q

Gambar 4.1. Operasi New dan Dispose

Agus

Budi

P

Q

(16)

Hal : 31

SINAR SINURAT, ST STMIK BUDIDARMA

P^.Next = 3 dan Q^.Next = 5 maka bentuk listnya sebagai berikut :

Sehingga bentuk linked list yang sebenarnya dapat dideskripsikan sebagai berikut :

Misalkan statement r:=q ; p:=q; q:=r maka bentuk linked listnya adalah :

Bila gambar 4.5. dibubuhi operasi : Write(P^.Kata, Q^.Kata, R^.Kata) maka akan diperoleh hasilnya : 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.

Agus 3 P

Gambar 4.3. Operasi pointer next

Budi 5

Q

Agus 2 Budi

1 2 3 4 5

Head Head

Gambar 4.4. Deskripsi linked list

Gambar 4.5. Operasi pertukaran head list

Agus 3 P

Budi 5

Q

Sehingga :

Agus 3

R

Budi 5

P Q

? ? ? ?

1 2 3 4 5

?

Head

Gambar 4.6. Linked list dengan 5 node

Next pointer field = nil = null Informasi tentang data (record data item)

(17)

Hal : 32

SINAR SINURAT, ST STMIK BUDIDARMA

Bagaimana implementasi data dalam linked list dengan pointer masing-masing yang merujuk mulai dari list awal sampai dengan list terakhir. Perhatikan diagram berikut dalam gambar 4.7.

Dalam merepresentasi list-list dalam array dilakukan dengan :

IV.2.1. ALGORITMA TRAVERSAL LINKED LIST

a.Traversal proses linked list // Traversing dengan array : Ptr = head

While (ptr <> nil) do Proses (info [ptr]) Ptr = link [ptr] Endwhile

// Traversing proses dengan pointer : Ptr = head

While (ptr <> nil) do Proses (ptr^.info) Ptr = ptr^.next Endwhile

b.Traversal cetak linked list // Dengan array :

Ptr = head

While (ptr <> nil) do Write (info [ptr]) Ptr = link [ptr] Endwhile

// Dengan pointer : Ptr = head

While (ptr <> nil) do Write (ptr^.info) Ptr = ptr^.next Endwhile

Gambar 4.7. Proses pointer dalam linked list P = Head

Agus Budi Cerry

1 2 3

Dedy

Head

4

P^.Kata P^.Next^.Kata P^.Next^.Next^.Kata P^.Next^.Next^.Next^.Kata

P^.Next P^.Next^.Next P^.Next^.Next^.Next P^.Next^.Next^.Next^.Next = nil

1 Agus 2

Budi 3

Cerry 4

Dedy 0

Agus 2 Budi 3

Cerry 4

Dedy 0

? ?

1

a. List original b. Operasi New

(18)

Hal : 11

SINAR SINURAT, ST STMIK BUDIDARMA

// Menghitung jumlah proses : num =0

c.Algoritma mencari suatu item pada data tidak terurut :

d. Algoritma mencari suatu item pada data terurut :

IV.2.2. ALGORITMA SISIP DATA DALAM LINKED LIST

A. SISIP AWAL

a. Sisip list baru di awal linked list

Head Gambar 4.9. Bentuk sisipan list baru dalam linked list

(19)

Hal : 20

SINAR SINURAT, ST STMIK BUDIDARMA

B. SISIP TENGAH

C. SISIP AKHIR

IV.2.3. ALGORITMA HAPUS DATA DALAM LINKED LIST

A. HAPUS LIST AWAL

B. HAPUS LIST TENGAH

New (Q) a. Sisip list baru di tengah linked list

(2)

a. Sisip list baru di akhir linked list (2)

Gambar 4.10. Proses penyisipan list baru pada linked list

P = Head

Q = P^.Next ………. (1) P^.Next = P^.Next^.Next ……(2) Q^.next = nil

Dispose (Q)

Catatan :

Untuk menentukan posisi data yang akan dihapus maka dapat dibuat suatu pembanding

b. Hapus list awal dari linked list

Head a. Hapus list awal dari linked list

Head

(20)

Hal : 21

SINAR SINURAT, ST STMIK BUDIDARMA

C. HAPUS LIST AKHIR

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; Function menu : char; Var p : char;

Function simpul_baru : simpul; Var b : simpul;

Procedure sisip_awal(n : integer); Var baru : simpul;

b. Hapus list awal dari linked list (1)

(2)

Head

Gambar 4.11. Proses penghapusan

Suatu list dari

(21)

Hal : 22

SINAR SINURAT, ST STMIK BUDIDARMA

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 Var posisi,I : integer; Bantu, bantu1 : simpul; Writeln(‘Tekan sembarang tombol’); Repeat until keypressed

(22)

Hal : 23

1. Buatlah prosedur untuk mengiput dua buah linked list dan menggabung keduanya

menjadi Satu

2. Buatlah prosedur untuk mencari data tertentu pada linked list 3. Buat prosedur untuk mengganti data tertentu dalam linked list 4. Buatlah prosedur untuk mengurutkan data linked list

IV.3. LINKED LIST DENGAN MULTI POINTER

IV.3.1. LIST CIRCULAR

List circular (list berputar) adalah linked list yang tidak mempunyai node awal dan node akhir. Perhatikan diagram berikut pada gambar 4.12.

Operasi-operasi pada list circular ditunjukkan pada algoritma berikut : Traverse :

(23)

Hal : 24

SINAR SINURAT, ST STMIK BUDIDARMA

Mencari (search) posisi loc yang berisi item :

Procedure search (data, next, p, item, loc) Ptr = p^.next

While (ptr^.next <> item) and (ptr <> p) do Ptr = p^.next

Endwhile

If ptr^.data = item then Loc = ptr

Else loc = nil Endif

Endproc

Menemukan posisi loc pada node awal dimana item berada :

Procedure FindHL (data, next, p, item, locp); Save = p

Ptr = p^.next

While (ptr^.data <> item) and (ptr <> p) do Save = ptr

Ptr = p^.next Endwhile

If ptr^.data = item then Loc = ptr

Locp = save Else

Loc = nil Locp = save Endif

Endproc

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

Endif

(24)

Hal : 25

SINAR SINURAT, ST STMIK BUDIDARMA

IV.3.2. LINKED LIST MULTI ARAH

Deklarasi tipe data sebagai berikut : Type link = ^multi_node;

Multi_node = Record

field1 : type_field1 ; … : …….. ; fieldn : type_fieldn ; left, right : link ; End;

Bentuk umum diagram multi linked list diperlihatkan pada gambar 4.13.

Linked list 2 arah dengan bentuk circular terdapat perbedaan dengan linked list lainnya. Perhatikan diagram berikut pada gambar 4.14.

Perhatikan proses penghapusan node tertentu dalam linked list dua arah dan urutan proses, ditunjukkan dalam gambar 4.15. berikut :

Gambar 4.13. Linked list dua arah

Head Tail

Pointer next Pointer back Data field

Gambar 4.14. Linked list circular dua arah

Pointer next Pointer back Data field

Head Tail

Gambar 4.15. Proses penghapusan Linked list dua arah

(25)

Hal : 26

SINAR SINURAT, ST STMIK BUDIDARMA

Demikian juga proses penyisipan node baru pada posisi tertentu dalam linked list 2 arah. Perhatikan urutan proses pada gambar 4.16. berikut :

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

Endif Baru = avail

Avail = forwd^.avail Baru^.data = item LocA^.forwd = new New^.forwd = locB LocB^.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^.back Loc^.forwd = avail

Avail = loc Endproc

Berikut ini implementasi algoritma linked list dua arah dalam Bahasa pemrograman Pascal :

Program linked_list;

Type Penunjuk = ^RecNama; RecNama = Record

Nama : string;

Pra, post : penunjuk; End;

Var datanama, head, tail : penunjuk;

Gambar 4.16. Proses penyisipan node baru pada linked list dua arah

Loc A

Baru

(26)
(27)

Hal : 28

SINAR SINURAT, ST STMIK BUDIDARMA

BAB V

NOTASI POLISH, REKURSIF, STACK, QUEUE

V.1. NOTASI POLISH

Suatu 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 prioritas

Operator-operator Keterangan Presedensi

(prioritas) ^

* , / , div , mod + , - (binary) = , ≠ , < , > , ≤ , ≥

not and , or

:=

Ekponensial / pemangkatan Perkalian, pembagian, sisa bagi Penjumlahan, Pengurangan

Sama dengan, tidak sama dengan, lebih kecil, lebih besar, Lebih kecil atau sama dengan, Lebih besar atau sama dengan

Tidak Dan, Atau Sama dengan

6 5 4 3

2 1 0

Notasi infix adalah jika operator berada diantara kedua operandnya, misalnya : suatu ekspressi 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 kedua operandnya, 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 awal 2. Scan kembali dari posisi sebelumnya ke kiri sampai ketemu kurung buka pertama

3. Lakukan operasi yang berada dalam tanda kurung

4. Ganti ekspresi di dalam kurung tersebut dengan hasil operasi 5. 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 operator

2. Ambil 2 operand yang berada langsung di sebelah kiri operator tersebut 3. Ganti ekspresi dengan hasil operasi

(28)

Hal : 29

SINAR SINURAT, ST STMIK BUDIDARMA

Keuntungan dari notasi postfix/suffix ini adalah tidak perlu memakai tanda kurung untuk menyatakan prioritas pengerjaan serta lebih cepat dan efisien, karena tidak perlu selalu scan dari depan atau paling kiri.

Untuk pekerjaan algoritma posfix/suffix ini, dipergunakan stack untuk menyimpan operand 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 Stack No Simbol

yang discan

Stack Ekspresi postfix Keterangan

1 sudah ketemu pasangan ( dan )

Baris 16 : Pasangan ( dan ) sudah ketemu maka dipop semua operator yang ada diantara ( dan ) Baris 19 : sudah ketemu pasangan ( dan )

V.2. REKURSIF

Rekursif 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

(29)

Hal : 30

SINAR SINURAT, ST STMIK BUDIDARMA

Fungsi-fungsi yang menggunakan prinsip rekursif adalah :

a. Fungsi faktorial

Misalkan n ! = 1 x 2 x 3 x … x n

Jika n = 0 atau 1 maka n ! = 1 lainnya n ! = n * (n – 1) ! Contoh : 4 ! = 4 * 3 !

3 ! = 3 * 2 !

2 ! = 2 * 1 ! = 2 * 1 = 2

3! = 3 * 2 = 6 4 ! = 4 * 6 = 24

Algoritma :

Function Factorial (n : integer) : integer; Begin

If (n = 0) or (n = 1) then Factorial := 1 else Factorial := n * Factorial (n –1);

End;

b. Fungsi Fibonacci

Jika n=0 atau n = 1 atau n = 2 maka Fibonacci = 1 lainnya Fibonacci = 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 else Fibo := Fibo(n-1) * Fibo(n-2);

End;

c. Fungsi Loop

Proses penulisan ulang dengan cara berulang-ulang (rekursif)

Algoritma :

Procedure Deret (n : integer); Begin

Writeln(n:3); If n <=10 then Deret(n+1); End;

d. Menara Hanoi

Merupakan proses rekursif dalam implementasi stack. Konsep rekursif ini dipakai untuk memindahkan piringan dari tiang 1 ke tiang 3 dengan bantuan tiang 2.

(30)

Hal : 31

SINAR SINURAT, ST STMIK BUDIDARMA

Implementasi algoritma dengan fragmen program dalam bahasa pemrograman pascal :

Var cacah, cacah_gerak : integer;

Procedure Hanoi(var cacah_gerak : integer; cacah, asal, lewat, tujuan : integer); Begin

If cacah>0 then Begin

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); End

End; Begin

Write(‘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. STACK

Stack (tumpukan) merupakan bagian dari list (struktur linier) dimana item-item data ditambah atau dihapus selalu di posisi terakhir (LIFO =last in first out) yang disebut top. Pada stack terdapat terminologi Push dan Pop, dimana push maksudnya adalah memasukkan elemen data pada stack sedangkan pop adalah mengambil elemen data pada stack.

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 himpunan

Tiang 1 Tiang 2 Tiang 3

(31)

Hal : 32

SINAR SINURAT, ST STMIK BUDIDARMA

2. Implementasi algoritma parsing, evaluasi dan backtracking

3. Digunakan oleh sistem operasi untuk memungkinkan prosedur yang nested

4. Digunakan untuk memungkinkan konversi program rekursif menjadi non rekursif

5. Untuk mendukung pushdown automata

6. 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

Perhatikan implementasi algoritma berikut : Const sentinel = ‘#’;

Type stackpointer = ^stacknode; Stacknode = Record

Data : char;

Next : stackpointer; End;

Var top : stackpointer; Nextchar : char;

Function emptystack(top : stackpointer) : boolean;

Begin

Emptystack := top = nil End;

Procedure push(nextchar : char; var top : stackpointer);

Var temp : stackpointer; Begin

Procedure pop(var item : char; var top : stackpointer);

Var temp : stackpointer; Begin

(32)

Hal : 33

SINAR SINURAT, ST STMIK BUDIDARMA

V.4. QUEUE

Suatu 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 memasukkan data 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 proses

3. Untuk buffer dalam mekanisme print spooler komunikasi data

4. Untuk simulasi dan modelling, misalnya simulasi sistem pengendali lalu lintas udara dalam memprediksi performansi.

Untuk lebih jelasnya perhatikan diagram berikut :

Berikut akan disajikan bagaimana proses enqueue dan dequeue dalam queue seperti diagram dibawah ini :

Budi Ekonomi 2

Johan Komputer 1

Wardi Teknik 1

Dulman Fisika 2

front rear

temp (2)

(3)

(1) (4)

Hapus list

Sisip list

Gambar 5.3. Diagram Antrian

a

a b Emptyqueue()

Size = 0

back

Front back

front back

Front enqueue(a)

Size = 1

enqueue(b) Size = 2

(33)

Hal : 34

SINAR SINURAT, ST STMIK BUDIDARMA

Berikut diberikan implementasi algoritma queue :

{untuk mencek apakah queue dalam keadaan kosong atau tidak}

function emptyqueue(front : passpointer) : boolean;

begin

emptyqueue := front = nil end;

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) then writeln(‘Queue kosong’) else Begin

nextpass := front^.passinfo; front := front^.link;

If emptyqueue(front) then front := nil

End End;

b

front back

Front dequeue()

Size = 1

dequeue() Size = 0

(34)

Hal : 36

SINAR SINURAT, ST STMIK BUDIDARMA

BAB VI

T R E E

VI.1. PEMAHAMAN

Tree (pohon) didefenisikan sebagai set (himpunan) node-node atau simpul-simpul dengan edge (penghubung node) secara langsung antara dua atau beberapa node. Proses tree 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 dengan ketinggian (heigh) dan kedalaman (depth) tertentu sebagai berikut :

Terminologi-terminologi dalam tree sebagai berikut :

a. Root / parent adalah subtree yang paling atas pada sebuah pohon

b. Child adalah anak-anak dari suatu root, misalnya : b, c, d, e adalah child dari a dan f, g adalah child dari b dan seterusnya

c. Sabling adalah node-node yang tergolong dari root yang sama (saudara kandung),

misalnya : c, d, e adalah sabling dari b dan seterusnya

d. Leaf adalah node-node yang tidak memiliki cabang lagi (tidak punya anak)

e. Ancestor adalah nenek moyang (ayah dari nenek/kakek), misalnya : a adalah ancestor dari k

f. Descendand adalah keturunan/anak dari cucu, misalnya : k adalah descendand dari a g. Depth adalah kedalaman suatu node (length) yang terhitung dari root, misalnya :

Depth f, g, h, I, j adalah 2 ; Depth k adalah 3

Depth b, d, c, e adalah 1 ; Depth a adalah 0

h. Heigh adalah ketinggian (level) dari suatu pohon yang terhitung dari root (path

terpanjang), misalnya heigh dari pohon diatas adalah 3

i. Satu node (single node) dapat juga disebut tree dengan heigh = 0 dan depth = 0 Dari pohon di atas dapat dibentuk sub-sub tree untuk membedakannya sebagai berikut :

a

b c d e

f g h i j

k Gambar 6.1. Bentuk umum tree

Level 0

Level 1

Level 2

(35)

Hal : 37

SINAR SINURAT, ST STMIK BUDIDARMA

Pada tree secara otomatis termuat konsep linked list, dimana di antara setiap node diasumsikan sebagai record / list. Perhatikan diagram berikut ini :

Dalam pohon dikenal istilah keseimbangan yaitu jika masing-masing node pada subtree kiri 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 else Begin

nl := n div 2; nr := n – nl –1;

read (x); new (newnode); with newnode^ do begin

key := x; left := tree(nl); right := tree(nr) end;

Root

……...

T1 T2 T3 Tn

Gambar 6.2. Pohon dengan pola rekursif

F

D H

C E G J

(36)

Hal : 38

Procedure printtree(t: ref; h : integer); Var I : integer;

Berikut akan dibuat suatu fragmen program untuk membangun pohon : (* deklarasi *)

fragmen program untuk mencari data dari pohon sebagai berikut : Var root : ref;

k : integer;

Procedure printtree (w : ref; l : integer); Var i : integer;

(37)

Hal : 39

SINAR SINURAT, ST STMIK BUDIDARMA

If x <p^.key then search(x, p^.left) else

If x >p^.key then search(x, p^.right) Else p^.count := p^.count + 1 end;

Begin

Root := nil;

While not eof(input) do Begin

Read (k); search(k, root) End;

Printtree(root,0) End.

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) else

Begin

q^.key:=r^.key; q^.count:= r^.count;

q := r; r := r^.left end

end;

Begin

If p= nil then

writeln(‘Tidak temu’) else If x < p^.key then delete(x,p^.left) else If x > p^.key then

delete(x,p^.right) Begin

If q^.right = nil then p := q^.left else If q^.left = nil then p := q^.right else Del(q^.left)

End End;

VI.2. BINARY TREE

Dikatakan suatu binary tree apabila suatu pohon dengan masing-masing node maksimal memiliki dua anak. Perhatikan diagram berikut :

Traversal yang digunakan adalah inorder, preorder, dan postorder. Dari gambar 6.4 di atas diperoleh informasi sebagai berikut :

Preorder : RAB (kunjungan root sebelum subtree) SL SR

SL = sabling kiri SR = sabling kanan

R

A B

(38)

Hal : 40

SINAR SINURAT, ST STMIK BUDIDARMA

Inorder : ARB

Postorder : ABR (kunjungan root sesudah subtree)

Contoh suatu ekspressi : inorder : a + b / c * d – e * f menjadi Preorder : * + a / b c – d * e f menjadi

Postorder : a b c / + d e f * - *

Proses perubahan dari inorder ke preorder dan postorder ditunjukkan pada gambar berikut ini :

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 atau membentuk perfect binary tree

2. Jika tinggi = 0 berarti node tunggal

3. Jika tinggi = 1 berarti node hanya dianak kiri

4. 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 kanan

5. 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.

7 1

2 3

4 6

5 preorder

7

1 6

3 5

2 4

postorder

2

1 5

3 7

4 6

(39)

Hal : 41

SINAR SINURAT, ST STMIK BUDIDARMA

Dibawah 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 then Begin

Write(t^.data); Preorder(t^.left); Preorder(t^.right) End

End;

Procedure postorder (t : ref); Begin

If t <> nil then Begin

Postorder(t^.left); Postorder(t^.right) Write(t^.data); End

End;

Procedure inorder (t : ref); Begin

If t <> nil then Begin

inorder(t^.left); Write(t^.data); inorder(t^.right)

End End;

VI.3. BINARY SEARCH TREE

VI.3.1. KONSEP UMUM BST

Binary search tree(BST) adalah suatu tree yang setiap nodenya berisi key-key dalam BST tersebut sebagai berikut :

a. Key dari root lebih besar dari key yang ada pada subtree kiri b. 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) dan efisien (memiliki probe log n) dan natural (memiliki sifat representasi alami). Probe adalah tempat yang harus dilalui sampai ditemukan data yang diinginkan, perhatikan diagram berikut :

A

B

C

D

Jumlah probe = 4

(40)

Hal : 42

SINAR SINURAT, ST STMIK BUDIDARMA

Bila jumlah data = jumlah level disebut perfect binary tree (pohon seimbang) dengan depth adalah ⎣log N⎦ dan jika tidak seimbang depth = ⎣log N-1⎦, dan untuk lebih jelas perhatikan diagram berikut :

Jika jumlah data = N maka jumlah level (L) : untuk batas bawah ⎣2log n ⎦ + 1 dan batas atas ⎡2log (n+1) ⎤.

Bila jumlah data untuk tiap level : root = level–1 dan jumlah node pada tiap level ke i = 1 .. 2i-1, lengkapnya perhatikan tabel berikut :

Tabel 6.1. Jumlah data tiap level Level ke – i Jumlah data 1

2 3 4 5 6 7

1 .. 1 1 .. 2 1 .. 4 1 .. 8 1 .. 16 1 .. 32 1 .. 64

Jika tiap level dari binary tree dengan L level penuh atau maksimum maka jumlah node juga maksimum :

21-1 + 22-1 + 23-1 + .. + 2L-1 = 20 + 21 + 22 + .. + 2L-1 = = 2L-1

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

A

B C

D E F G

Gambar 6.7. Pohon seimbang

L-1 ∑ 2i

(41)

Hal : 43

SINAR SINURAT, ST STMIK BUDIDARMA

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 ARRAY

Untuk mencek posisi-posisi data dipohon dalam bentuk implementasi array bahwa node root berada pada posisi i, anak kiri menempati posisi 2*i dan anak kanannya menempati posisi 2*i+1 ; i adalah level.

Perhatikan bentuk pohon sebagai berikut :

Selanjutnya juga dalam bentuk implementasi array, perhatikan diagram berikut ini : 5

2

3 4

7 8

6

a. BST dalam pohon i=1

i=2 i=3

i=4 i=5 i=6 i=7

Level 0

Level 1 Level 2 Level 3

2 3 4 - - 5 6 - - - - - - 7 8 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

b. BST dalam array

Gambar 6.8. Representasi BST dalam array Item data Posisi

2 3 4 5 6 7

(42)

Hal : 44

SINAR SINURAT, ST STMIK BUDIDARMA

VI.3.3. OPERASI SISIP, HAPUS DALAM BST

A. Operasi SISIP

Dapat digambarkan untuk setiap keadaan sebagai berikut :

B. Operasi HAPUS

Dapat digambarkan untuk setiap keadaan sebagai berikut :

a. Hapus node 2 dan node 4

b. Hapus node 5

3 • •

3 • 5 • •

3 5 • •

2 • • 3

2 • • 5 •

4 • •

Root left right

Sisip(3,Q) Q

Q

Q

Q Sisip(5,Q)

Sisip(2,Q)

Sisip(4,Q)

Gambar 6.9. Operasi sisip node dengan BST

3

2 5

4

3

2 5

4 Q^.kiri

Q := Q^.kiri Dispose(Q^.kiri)

3

(43)

Hal : 45

SINAR SINURAT, ST STMIK BUDIDARMA

c.Hapus node 3

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 then Begin New(p);

P^.data := x; p^.left := nil; P^.right := nil;

End else

If x.key <p^.data.key then sisip(x, p^left) else If x.key >p^.data.key then sisip(x, p^right) else

Write(‘duplikat’); End;

Function cari (x : tipe_data, p : T) : boolean; Begin

If p=nil then cari := false else If x=p^.data.key then cari := true else If x<p^.data.key then cari := cari(x, p^.left) else Cari := cari(x^.right) End;

Function cek_kosong(p:T) : boolean; Begin

If p=nil then kosong := true else Kosong := false

3

2 5

4

Terdapat 3 kemungkinan hasilnya

5

2 4

4

2 5

(44)

Hal : 46

SINAR SINURAT, ST STMIK BUDIDARMA

End;

Function cari_min(a:T) : T; Begin

If a^.left=nil then begin

cari_min := a^.node; a := a^.right; end else

cari_min := cari_min(a^.left); End;

Procedure hapus(x : tipe_data; var p :T); Begin

If p <> nil then If x<p^.data.key then Hapus(x, p^.left) else If x>p^.data.key then Hapus(x, p^.right) else

If (p^.left=nil) and (p^.right=nil) then p := nil else

If p^.left=nil then p := p^.right else If p^.right=nil then p := p^.left else P^.node := cari_min(p^.right); End;

VI.4. AVL-TREE

AVL (Adelson-Velski-Landis) tree adalah merupakan salah satu subset BST yang selalu

memperhatikan keseimbangan (balance) pohon. AVL tree sering disebut dengan balanced Binary tree. Keseimbangan berguna untuk menjamin bahwa depth algoritmik dalam worst case atau perubahan-perubahan yang relatif kecil.

Hal-hal yang perlu diperhatikan antara lain :

- Jika data yang disisip adalah acak maka akan menghasilkan Binary tree yang mendekati ideal (mendekati O(log n))

- Jika data yang disusun terurut maka akan menghasilkan binary tree yang memiliki struktur linier (mendekati O(log n) dan O(n))

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) adalah maksimum jumlah record kiri (ketinggian sub tree) dan jumlah record kanan (ketinggian subtree 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 dasarnya penyeimbangan kembali dilakukan dengan merotasikan node-node tertentu dalam subtree tersebut berdasarkan harga-harga faktor ketimbangan tingkat node-node atas dalam subtree.

(45)

Hal : 47

SINAR SINURAT, ST STMIK BUDIDARMA

1. Rotasi kiri tunggal

Bila N adalah subtree dimana terjadi penyisipan ( atau N adalah node baru di sisipan itu sendiri) dan N adalah ancestor paling bawah yang mendapatkan faktor keseimbangan menjadi –2, sementara P anak kiri dari R yang mana N adalah anak kiri dari P dengan faktor kesetimbangan P=-1. Rotasi dilakukan sehingga P menjadi ayah dari N dan R yang masing-masing anak kiri dan kanan dari P sementara jika ada subtree kanan dari P dengan x sebagai root maka akan menjadi subtree kiri dari R. Faktor kesetimbangan dari R dan P keduanya menjadi 0.

2. Rotasi kanan tunggal

Bila N adalah subtree dimana terjadi penyisipan ( atau N adalah node baru di sisipan itu sendiri) dan N adalah ancestor paling bawah yang mendapatkan faktor keseimbangan menjadi +2, sementara P anak kanan dari R yang mana N adalah anak kanan dari P dengan faktor kesetimbangan P=+1. Rotasi dilakukan sehingga P menjadi ayah dari N dan R yang masing-masing anak kiri dan kanan dari P sementara jika ada subtree kanan dari P dengan x sebagai root maka akan menjadi subtree kanan dari R. Faktor kesetimbangan dari R dan P keduanya menjadi 0.

3. Rotasi kiri ganda

Bila N adalah subtree dimana terjadi penyisipan ( atau N adalah node baru di sisipan itu sendiri) dan R adalah ancestor paling bawah yang mendapatkan faktor keseimbangan menjadi –2, sementara P anak kiri dari R yang mana N adalah anak kanan dari P dengan faktor kesetimbangan P=-1. Rotasi dilakukan 2 kali pertama dalam subtree P yang menghasilkan P sebagai anak kiri dari N. Jika N memiliki subtree kanan maka subtree ini menjadi subtree kiri dari R dan juga jika N memiliki subtree kiri maka subtree ini menjadi subtree kanan dari P. Faktor kesetimbangan menjadi 0. Faktor

kesetimbangan N dan R tergantung faktor kesetimbangan N semula. Jika faktor kesetimbangan N=0 maka faktor kesetimbangan P dan R keduanya menjadi 0. Jika faktor kesetimbangan =-1 maka faktor kesetimbangan menjadi 0 dan R = +1. Jika faktor kesetimbangan N = +1 maka faktor kesetimbangan P = -1 dan faktor kesetimbangan R = 0.

4. Rotasi kanan ganda

Bila N adalah subtree dimana terjadi penyisipan (atau N adalah node baru di sisipan itu sendiri) dan R adalah ancestor paling bawah yang mendapatkan faktor keseimbangan menjadi +2, sementara P anak kanan dari R yang mana N adalah anak kiri dari P dengan faktor kesetimbangan P=-1. Rotasi dilakukan 2 kali pertama dalam subtree P yang menghasilkan P sebagai anak kanan dari N. Jika N memiliki subtree kiri maka subtree ini menjadi subtree kanan dari R dan juga jika N memiliki subtree kanan maka subtree ini menjadi subtree kiri dari P. Faktor kesetimbangan menjadi 0. Faktor

kesetimbangan N dan R tergantung faktor kesetimbangan N semula. Jika faktor kesetimbangan N=0 maka faktor kesetimbangan P dan R keduanya menjadi 0. Jika faktor kesetimbangan =-1 maka faktor kesetimbangan menjadi 0 dan R = +1. Jika faktor kesetimbangan N = +1 maka 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 faktor kesetimbangan (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 dengan R = 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 selesai

2. Kasus faktor kesetimbangan P = +1 dan faktor kesetimbangan R = -2. Lakukan rotasi kanan ganda dan selesai

(46)

Hal : 48

SINAR SINURAT, ST STMIK BUDIDARMA

4. 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 terjadi pemendekan R sehingga proses selesai - Jika D adalah suatu anak (keturunan) kiri dari R dan faktor kesetimbangan R semula adalah 0 (yang

menjadi +1 maka subtree R tetap seimbang serta tidak terjadi pemendekan R sehingga proses selesai - Jika faktor keseimbangan R semula adalah +1 atau –1 dan menjadi 0 maka terjadi pemendekan subtree

R dan proses pemeriksaan dilanjutkan ke ayah dari R sebagai R sekarang

- Jika faktor keseimbangan R semula adalah –1 menjadi –2 (catatan : D adalah keturunan/anak kanan dari R) maka dengan anak kiri R disebut P dari anak kanan R disebut N

1. Jika faktor keseimbangan P = 0 maka lakukan rotasi kanan tunggal dan selesai karena tidak terjadi pemendekan subtree R

2. Jika faktor keseimbangan P = -1 maka lakukan rotasi kanan tunggal namun karena terjadi pemendekan subtree R pemeriksaan untuk penyeimbangan kembali dilanjutkan pada ayah R sebagai R sekarang

3. (Berarti faktor keseimbangan = +1) dilakukan rotasi kanan ganda dan karena terjadi pemendekan R dan proses penyeimbangan kembali dilakukan pada ayah R sebagai R sekarang

- Faktor keseimbangan R semula adalah +1 dan menjadi +2 (catatan D adalah keturunan/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 R

2. Jika faktor keseimbangan P = +1 maka dilakukan rotasi kanan tunggal namun karena terjadi pemendekan subtree R pemeriksaan untuk penyeimbangan kembali dilanjutkan pada ayah R sebagai R sekarang

3. (Berarti faktor keseimbangan = -1) dilakukan rotasi kiri ganda dan karena terjadi pemendekan R dan proses penyeimbangan kembali dilakukan pada ayah R sebagai R sekarang

Contoh 1: AVL tidak seimbang dengan rotasi tunggal sehingga AVL seimbang

7

5 10

3 6 9 12

8 11 15

14

10

7

12

5 9 11 15

3 6 8 14

(47)

Hal : 49

SINAR SINURAT, ST STMIK BUDIDARMA

Contoh 2:

Contoh 3 : Diberikan data sebagai berikut : 35, 40, 10, 12, 16, 17 Bentuklah BST dan tahap-tahap AVL tree dari data ini.

AVL tidak seimbang dengan rotasi ganda sehingga AVL seimbang

Gambar 6.12. Rotasi ganda pada AVL tidak seimbang 6

4 8

3 5

7 11

1

9 13

12 14 10

2 A

B

3

1 4

2 5

A : 11

8 13

12 14

10

7 9

B : 6

Gambar 6.13. Pohon bentukan BST

10

12

16

40

(48)

Hal : 50

SINAR SINURAT, ST STMIK BUDIDARMA

Tahap-tahap pembentukan AVL tree :

Sisip 35 Sisip 40 Sisip 10

Sisip 12 Sisip 16 (tidak balance) menjadi

Sisip 17 (tidak AVL), dilakukan rotasi sehingga :

Berikut dibawah ini disajikan implementasi algoritma :

Algoritma sisip dapat diambil dari yang sebelumnya dengan melakukan search dan kemudian insert sebagai berikut :

(49)

Hal : 51

Procedure search (x : integer; var p : ref; var h : boolean; begin {single rotasi kiri } p^.left := p1^.right; p1^.right := p;

p^.bal := 0; p:=p1; end else

begin (double rotasi} p2 := p1^.right;

(50)

Hal : 52

Procedure delete(x : integer; var p : ref; var h : boolean);

(51)

Hal : 53

(52)

Hal : 54

SINAR SINURAT, ST STMIK BUDIDARMA

if h then balance1(p,h) end

end end;

VI.5. B-TREE

B-Tree adalah struktur data yang sangat populer untuk pencarian disk bound. Sifat-sifat B-Tree adalah :

1. Item data disimpan pada leaves

2. Node-node non leaf data sampai ke key M-1 yang merujuk pencarian key I yang merepresentasi key yang paling kecil dalam subtree i+1

3. Root adalah juga suatu leaf atau yang memiliki anak antara 2 sampai dengan M 4. Semua node non leaf (kecuali root) memiliki anak antara ⎡M/2⎤ dan M

5. Semua leaves dengan depth yang sama memiliki anak anatara ⎡L/2⎤ dan L untuk setiap L Perhatikan diagram berikut :

Misalnya dibawah ini ditunjukkan suatu B-Tree dengan order 2 dan 3 level, semua frame berisi 2, 3 atau 4 kecuali root diijinkan item tunggal.

Jika pencarian tidak berhasil kita berada dalam salah satu situasi berikut : 1. Ki < X < Ki+1 untuk 1 <= i < m lanjutkan pencarian pada frame pi selanjutnya

2. Km < X Pencarian berlanjut pada frame Pm selanjutnya

P0 K1 P1K2 …. Pm-1Km-1PmKm

Gambar 6.14. B-Tree dengan M key

2 5 7 8 13 14 15 18 22 24 26 27 28 32 35 38 41 42 45 46 25

10 20 30 40

(53)

Hal : 55

SINAR SINURAT, ST STMIK BUDIDARMA

3. X < K1 Pencarian berlanjut pada frame P0 selanjutnya

Perhatikan proses penyisipan data baru pada sebuan B-Tree berikut : Sisip key 22 dalam B-Tree di order 2, ikuti langkah berikut :

1. Key 22 tidak ada dalam frame, sisip di frame C, ini tidak memungkinkan sebab frame C penuh 2. Frame C dipecah menjadi 2 frame, misalnya frame baru D dialokasi

3. 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 :

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.

20

7 10 15 18 26 30 35 40 A

B C

7 10 15 18 22 26 35 40 20 30

B C D

A

Gambar 6.16. B-Tree dengan sisipan data Menjadi :

20 a. Sisip 20

20

30 40 b. Sisip 40 10 30 15

10 15

(54)

Hal : 56

SINAR SINURAT, ST STMIK BUDIDARMA

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 ;

5 7 8 13 15 18 22 26 27 10 20 30 40 e. Sisip 42 13 46 27 8 32

42 46 32 35

5 7 8 13 15 18 22 24 f. Sisip 38 24 45 25

32 35 38 26 27

10 20 30 40

25

42 45 46

Gambar 6.17. Keadaan B-Tree setelah proses penyisipan data

5 7 8 13 15 18 22 24 a. Hapus 25 sebagai root

32 35 38 26 27

10 20 30 40

25

42 45 46

5 7 8 13 15 18 22 24 Hapus 45 24

32 35 38 26 27

10 20 30 40

(55)

Hal : 57

SINAR SINURAT, ST STMIK BUDIDARMA

f. Data terakhir b. Hapus 38 32

10 22 30 40

5 7 8 13 15 18 20 26 27 32 35 38 42 46

c. Hapus 8 27 46 13 42

10 22 30

5 7 8 13 15 18 20 26 27 35 40 42 46

d. Hapus 5 22 18 26

10 22

5 7 8 15 18 20 26 30 35 40

e. Hapus 7 35 15

15

7 10 20 30 35 40

10 20 30 40

(56)

Hal : 58

SINAR SINURAT, ST STMIK BUDIDARMA

(57)

Hal : 59

(58)

Hal : 60

SINAR SINURAT, ST STMIK BUDIDARMA

end;

procedure del(p: ref; var h : boolean); var a: ref;

Gambar

Gambar 3.5. Diagram proses Set
Gambar 4.1. Operasi New dan Dispose
Tabel 5.2. Operasi Stack No Simbol yang
Gambar 5.1. Menara Hanoi
+7

Referensi

Dokumen terkait

Kegiatan Tugas Akhir diakhiri dengan penulisan hasil kerja praktek atau penelitian tersebut dalam bentuk Laporan Tugas Akhir untuk program D3, Skripsi untuk program S1, Tesis

Berikutnya Shou- Ren Hu (2010) mengidintifikasi bahwa jumlah kereta api yang lewat, jalan raya pemisah, jumlah kendaraan, alat pendeteksi hambatan, dan rambu-rambu

informasi, pembinaan, bimbingan teknis, gerakan penanganan pascapanen padi, jagung dan kedelai, serta pengukuran susut hasil pascapanen jagung, kedelai dan

Prajurit Kulon 1650 KK 2018 86.000.000 Pembangunan Saluran Sumolepen (Lanjutan), Pembangunan Plengsengan Buzem Pulorejo (Lanjutan), Pembangunan Saluran Tenggilis

Data-data pedagang pasar yang diperlukan untuk kegiatan purposive sampling pedagang ini dikumpulkan dari hasil kegiatan pada Modul Identifikasi Pedagang Pasar dan

Oleh karena itu, efek signifikan natrium diklofenak terhadap licking time terjadi pada fase kedua (fase inflamasi), meskipun berdasarkan hasil penelitian yang

Mohon anda hubungi marketing apartemen Pasadena Suites Orange County diatas untuk mendapatkan informasi terbaru.... Monaco Bay Manado Resort City – Proyek

Pada kemampuan awal berdasarkan uji statistik, diperoleh data kedua kelas berdistribusi normal dengan harga Lhitung ≤ Ltabel, homogen dengan harga Fhitung ≤ F tabel dan