Hal : 16
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)
Dapat dipadang sebagai model matematika dan sekumpulan operasi yang didefenisikan
terhadap suatu model.
SINAR SINURAT, ST
STMIK BUDIDARMA
Hal : 17
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 lainlain) 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.
SINAR SINURAT, ST
STMIK BUDIDARMA
Hal : 18
Record / list
3. List circular
head
prev
tail
5. Binary list
head
tail
prev
head
SINAR SINURAT, ST
STMIK BUDIDARMA
Hal : 19
Nama
Alamat
Jalan
Umur
Jurusan
Hobby
Area
Kota
kdpos
STMIK BUDIDARMA
Hal : 20
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.
in
out
SINAR SINURAT, ST
STMIK BUDIDARMA
Hal : 21
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 :
n
Sum () = ai
j=1
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
SINAR SINURAT, ST
STMIK BUDIDARMA
Hal : 22
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)
a
c (a,c)
a (b,a)
b
n!
P (n, r) =
(n r) !
c (b,c)
a (c,a)
c
b (c,b)
Range nilai
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.
SINAR SINURAT, ST
STMIK BUDIDARMA
Hal : 23
Range nilai
Signifikansi
Digit
78
15 16
19 20
19 - 20
X := 2 atau
X2
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
Repeat
Ekspressi
Until (kondisi)
SINAR SINURAT, ST
STMIK BUDIDARMA
Hal : 24
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.
Tipe Array
Array
Tipe Indeks
of
Tipe
;
Tipe indeks
Tipe Ordinal
SINAR SINURAT, ST
STMIK BUDIDARMA
Hal : 25
Sistem Operasi
STMIK BUDIDARMA
Hal : 26
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 :
X[1] X[2] X[3] X[4] X[n]
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.
Tipe Record
Tipe
Record
Daftar field
SINAR SINURAT, ST
STMIK BUDIDARMA
Hal : 27
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.
Tipe Set
Set
of
Tipe Ordinal
SINAR SINURAT, ST
STMIK BUDIDARMA
Hal : 28
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
New (datakar[i]);
SINAR SINURAT, ST
STMIK BUDIDARMA
Hal : 29
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;
Tugas : Buatlah program dari salah satu bahasa pemrograman untuk menginput beberapa data
kemudian mengurutkan hasilnya secara menaik (ascending) atau menurun (descending).
SINAR SINURAT, ST
STMIK BUDIDARMA
Hal : 30
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 :
New (P)
New (Q)
P
?
STMIK BUDIDARMA
Hal : 31
Budi
Head
2
Agus
Budi
P
Agus
Budi
Sehingga :
R
Agus
Budi
P
Q
SINAR SINURAT, ST
STMIK BUDIDARMA
Hal : 32
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.
Head
1
Agus
P = Head
P^.Kata
P^.Next^.Kata
Cerry
Dedy
P^.Next^.Next^.Kata
P^.Next^.Next
P^.Next
Budi
P^.Next^.Next^.Next^.Kata
P^.Next^.Next^.Next^.Next = nil
P^.Next^.Next^.Next
Agus
Budi
Agus
Budi
Cerry
Cerry
Dedy
Dedy
a. List original
b. Operasi New
// Dengan pointer :
Ptr = head
While (ptr <> nil) do
Write (ptr^.info)
Ptr = ptr^.next
Endwhile
SINAR SINURAT, ST
STMIK BUDIDARMA
Hal : 11
Endwhile
d. Algoritma mencari suatu item pada
data terurut :
ptr = head
while (ptr <> nil) do
if (item = ptr^.info) then
ptr = ptr^.next
else
if (item = ptr^.info) then
loc = ptr
exit
else
loc = nil
endif
endif
Endwhile
New(P)
New(Q)
New(R)
A. SISIP AWAL
Head
(2)
New (Q)
(1)
SINAR SINURAT, ST
New (Q)
Read (q^.nilai) (3)
Q^.next = nil
P = Head
If p = nil then
Tail = Q
else
Q^.Next = P . (1)
P = Q .. (2)
STMIK BUDIDARMA
Hal : 20
B. SISIP TENGAH
Head
B
(2)
E
(1)
New (Q)
C
(3) Read (Q^.data
New (Q)
Read (Q^.nilai) , Q^.next = nil
P = Head
While (p<> nil)
If p^.nilai = B then
Q^.Next = P^.Next . (1)
P^.Next = Q .. (2)
Else p = p^.next
Endwhile
C. SISIP AKHIR
Head
B
(1)
C
New (Q)
D
(2)
E
(3) Read (Q^.data
new (Q)
Q^.nilai = E
Q^.next = nil
P = head
if p = nil then
P=Q
else
Tail^.next = Q
Tail = Q
endif
P = Head
If (P <> nil) then
Q = P . (1)
P = Q^.Next .. (2)
Dispose (Q)
Endif
(1)
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
Head
(2)
SINAR SINURAT, ST
STMIK BUDIDARMA
Hal : 21
Head
(2)
(1)
P = Head
If (P^.next = nil) then
Last = P
P = Nil
While (Last^.next <> Nil) do
P = Last
Last = Last^.Next
EndWhile
Q = Last
If (P = Nil) then
P^.next = nil
Else
P = p^.next
Endif
Else p = p^.next
endif
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 = Record
Nama : 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];
SINAR SINURAT, ST
Menu := p
End;
Function simpul_baru : simpul;
Var b : simpul;
Begin
New(b) ;
With b^ do
Begin
Writeln(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 then
Begin
Writeln(Menambah list di awal link list);
Writeln(copy(garis,1,45))
End;
Baru := simpul_baru;
If head = nil then tail := baru else
Baru^.next := head;
Head :=baru
End;
STMIK BUDIDARMA
SINAR SINURAT, ST
Hal : 22
Begin
Writeln(pesan);
Writeln(Tekan sembarang tombol);
Repeat until keypressed
End else
Begin
Writeln(Menghapus list di tengah);
Writeln(copy(garis,1,35));
Writeln(Linked list berisi :,cacah:2, simpul);
Repeat
Writeln(Urutan list yang akan dihapus ? );
Readln(posisi);
Until posisi in[1..cacah];
If posisi = 1 then hapus_awal else
If posisi = cacah then hapus_akhir else
Begin
For i:=1 to pisisi 2 do
Bantu := Bantu^.next;
Bantu1 := bantu^.next;
Bantu^.next := bantu1^.next;
Bantu1^.next := nil;
Dispose(bantu1)
End
End
End;
Procedure hapus_akhir;
Var bantu : simpul;
h : integer;
Begin
If head = nil then
Begin
Writeln(pesan);
h := 0
End else
If head = tail then
Begin
Head := nil;
Tail := nil;
h:=1
End else
Begin
Bantu := head;
While (bantu^.next <> tail) do
Bantu := bantu^.next;
Tail := bantu
Tail^.next := nil;
h := 1
End ;
If h=1 then
Writeln(List akhir telah dihapus) ;
Writeln(Tekan sembarang tombol);
Repeat until keypressed
End;
STMIK BUDIDARMA
Hal : 23
Cacah := 0;
Head := nil;
Tail := nil;
Repeat
Pilih := 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,] then
Inc(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 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
STMIK BUDIDARMA
Hal : 24
SINAR SINURAT, ST
STMIK BUDIDARMA
Hal : 25
: .. ;
fieldn : type_fieldn ;
left, right : link ;
End;
Bentuk umum diagram multi linked list diperlihatkan pada gambar 4.13.
Head
Tail
Pointer next
Pointer back
Data field
Head
Pointer next
Pointer back
Data field
SINAR SINURAT, ST
STMIK BUDIDARMA
Hal : 26
Demikian juga proses penyisipan node baru pada posisi tertentu dalam linked list 2 arah.
Perhatikan urutan proses pada gambar 4.16. berikut :
Loc B
Loc A
Baru
Gambar 4.16. Proses penyisipan node baru pada linked list dua arah
STMIK BUDIDARMA
Procedure MasukData;
Var lagi : char;
Begin
Mark(datanama);
Head : datanama;
Tail := datanama;
Lagi := Y;
While (UpCase(lagi)=Y) do
Begin
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) do
Begin
i := datanama^.post;
If datanama^.nama >= tail^.nama
Then begin
Datanama^.pra := tail;
Tail^.post := datanama;
Tail := datanama;
Datanama^.post := nil
End else
Begin
j := tail^.pra;
While(datanama^.nama<= j^.nama)
and (j <> nil) do
j := j^.pra;
If j = nil then
Begin
Head^.pra := datanama;
Datanama^.post := head;
Head := datanama
End else
SINAR SINURAT, ST
Hal : 27
Begin
x := j^.post;
j^.post := datanama;
x^.pra := datanama;
datanama^.pra := j;
datanama^.post := x;
End
End
Datanama := i
End
End;
Procedure tampilkan;
Begin
Datanama := head;
While datanama <> nil do
Begin
Writeln(datanama^.nama);
Datanama := datanama^.post
End
End;
{ Program utama }
Begin
MasukData;
Writeln(Data sebelum diurutkan : );
Tampilkan;
Urutkan;
Writeln(Data sesudah diurutkan : );
Tampilkan;
End.
STMIK BUDIDARMA
Hal : 28
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
^
* , / , div , mod
+ , - (binary)
=,,<,>,,
not
and , or
:=
Presedensi
(prioritas)
Ekponensial / pemangkatan
6
Perkalian, pembagian, sisa bagi
5
Penjumlahan, Pengurangan
4
Sama dengan, tidak sama dengan, lebih kecil,
3
lebih besar, Lebih kecil atau sama dengan,
Lebih besar atau sama dengan
Tidak
2
Dan, Atau
1
Sama dengan
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
4. Scan lagi hasil operasi tadi ke kanan, jadi tidak perlu discan dari depan sekali seperti
pada proses infix
SINAR SINURAT, ST
STMIK BUDIDARMA
Hal : 29
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 Stack
yang
discan
(
A
1
(+
+
2
(+(
(
3
(+(
B
4
(+(*
*
5
(+(*
C
6
(+(7
(+(-(
(
8
(+(-(
D
9
(+(-(/
/
10
(+(-(/
E
11
(+(-(/^
^
12
(+(-(/^
F
13
(+()
14
(+(-*
*
15
(+(-*
G
16
(+
)
17
(+*
*
18
(+*
19
H
20
)
Ekspresi postfix
A
A
A
AB
AB
ABC
ABC*
ABC*
ABC*D
ABC*D
ABC*DE
ABC*DE
ABC*DEF
ABC*DEF^/
ABC*DEF^/
ABC*DEF^/G
ABC*DEF^/G*ABC*DEF^/G*ABC*DEF^/G*-H
ABC*DEF^/G*-H*+
Keterangan
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
diselesaikan.
SINAR SINURAT, ST
STMIK BUDIDARMA
Hal : 30
SINAR SINURAT, ST
STMIK BUDIDARMA
Tiang 1
Tiang 2
Hal : 31
Tiang 3
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
SINAR SINURAT, ST
STMIK BUDIDARMA
2.
3.
4.
5.
6.
Hal : 32
A top
Push B
B
A
Push C
top
C
B
A
Pop C
Pop B
Pop A
top
B top
A
top
SINAR SINURAT, ST
STMIK BUDIDARMA
Hal : 33
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 :
front
rear
Budi
Johan
Wardi
Ekonomi
Komputer
Teknik
(4)
temp
(2)
Dulman
Fisika
Hapus list
(1)
Sisip list
2
(3)
back
Front
back
enqueue(a)
Size = 1
a
front
back
enqueue(b)
Size = 2
Front
STMIK BUDIDARMA
Hal : 34
back
b
front
back
dequeue()
Size = 0
Front
SINAR SINURAT, ST
STMIK BUDIDARMA
Hal : 36
BAB VI
TREE
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.
Level 1
Level 2
Level 3
STMIK BUDIDARMA
Hal : 37
Root
T1
T2
T3
...
Tn
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;
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;
STMIK BUDIDARMA
tree := newnode
end
end;
Procedure printtree(t: ref; h : integer);
Var I : integer;
Begin
If t^ then
Begin
Printtree(left, h+1);
For i:= 1 to h do write( );
Hal : 38
Writeln(key);
Printtree(right, h+1)
End;
End;
Begin
Write(Masukkan banyak data : );
Readln (n);
Printtree(root, 0);
End.
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
Hal : 39
Root := nil;
While not eof(input) do
Begin
Read (k); search(k, root)
End;
Printtree(root,0)
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;
SR
SINAR SINURAT, ST
STMIK BUDIDARMA
Hal : 40
: ARB
: 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 :
5
preorder
postorder
inorder
SINAR SINURAT, ST
STMIK BUDIDARMA
Hal : 41
Dibawah ini diberikan implementasi algoritma dengan bahasa pascal sebagai berikut :
Procedure postorder (t : ref);
Begin
Node = Record
Data : string;
Begin
Postorder(t^.left);
End;
Postorder(t^.right)
Write(t^.data);
End
Begin
End;
If t <> nil then
Procedure inorder (t : ref);
Begin
Begin
Write(t^.data);
Preorder(t^.left);
Preorder(t^.right)
Begin
inorder(t^.left);
End
Write(t^.data);
End;
inorder(t^.right)
End
End;
Key dari root lebih besar dari key yang ada pada subtree kiri
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
Jumlah probe = 4
B
C
STMIK BUDIDARMA
Hal : 42
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 :
A
B
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 = level1 dan jumlah node pada tiap level
ke i = 1 .. 2i-1, lengkapnya perhatikan tabel berikut :
Jumlah data
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
:
L-1
1-1
+2
2-1
+2
3-1
+ .. + 2
L-1
= 2 + 2 + 2 + .. + 2
L-1
L
= 2
-12i
i=0
SINAR SINURAT, ST
STMIK BUDIDARMA
Hal : 43
i
Misalkan sebuah pohon biner memiliki Llevel maka jumlah data adalah L .. 2 -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 :
Level 0
2
i=1
3
i=2
i=4
Level 1
i=5
i=3
i=6
i=7
Level 2
Level 3
Selanjutnya juga dalam bentuk implementasi array, perhatikan diagram berikut ini :
10
11
12
13 14
-
15
8
Posisi
2*1=2
2*1+1=3
2*3=6
2*3+1=7
2*7=14
SINAR SINURAT, ST
STMIK BUDIDARMA
Hal : 44
Sisip(3,Q)
Q
Sisip(5,Q)
Q
Sisip(2,Q)
Sisip(4,Q)
5
4
b. Hapus node
3 5
2
3
Q := Q^.kiri
Dispose(Q^.kiri)
5
4
Q^.kiri
SINAR SINURAT, ST
STMIK BUDIDARMA
Hal : 45
c.Hapus node 3
3
Terdapat 3
kemungkinan
hasilnya
4
4
2
5
Function makenull(P : T) : T;
Write(duplikat);
End;
Begin
P := nil; makenull := p;
End;
Begin
Procedure sisip(x : tipe_data ; var p : T);
Begin
If x=p^.data.key then
If p = nil then
Begin
If x<p^.data.key then
cari := cari(x, p^.left) else
New(p);
P^.data := x; p^.left := nil;
P^.right := nil;
Cari := cari(x^.right)
End;
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
SINAR SINURAT, ST
STMIK BUDIDARMA
Hal : 46
End;
Procedure hapus(x : tipe_data; var p :T);
Function cari_min(a:T) : T;
Begin
If a^.left=nil then
Begin
If p <> nil then
If x<p^.data.key then
Hapus(x, p^.left) else
begin
cari_min := a^.node;
If x>p^.data.key then
Hapus(x, p^.right) else
a := a^.right;
end else
cari_min := cari_min(a^.left);
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 perubahanperubahan yang relatif kecil.
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.
SINAR SINURAT, ST
STMIK BUDIDARMA
Hal : 47
1.
2.
3.
4.
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
3. Kasus faktor kesetimbangan P = +1 atau 0 dan faktor kesetimbangan R = +2. Lakukan rotasi kiri
tunggal dan selesai
SINAR SINURAT, ST
STMIK BUDIDARMA
Hal : 48
Kasus faktor kesetimbangan P = -1 dan faktor kesetimbangan R = +2. Lakukan rotasi kanan ganda
dan selesai
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
10
7
12
10
5
3
12
15
11
11
15
14
14
SINAR SINURAT, ST
STMIK BUDIDARMA
Hal : 49
Contoh 2:
6
8
A:
3
1
11
B:
3
1
11
13
A
9
13
12
14
14
12
10
10
Contoh 3 : Diberikan data sebagai berikut : 35, 40, 10, 12, 16, 17
Bentuklah BST dan tahap-tahap AVL tree dari data ini.
36
40
10
12
16
17
SINAR SINURAT, ST
STMIK BUDIDARMA
Hal : 50
Sisip 35
Sisip 40
Sisip 10
1
35
35
35
0
0
0
40
Sisip 12
10
40
35
1
10
-1
35
40
10
40
12
0
12
-1
35
40
12
10
16
0
12
35
1
12
-1
40
12
0
10
16
35
16
10
0
17
40
0
17
SINAR SINURAT, ST
STMIK BUDIDARMA
Hal : 51
begin (double rotasi}
p2 := p1^.right;
Node = Record
Key
p1^.right := p2^.left
: integer;
Count : integer;
p2^.left := p1;
p^.left := p2^.right;
Bal : -1 .. 1
p2^.right := p;
if p2^.bal = -1 then
End;
p^.bal := 1 else
p^.bal := 0;
if p2^.bal := 1 then
p1^.bal := -1 else
Begin
If p = nil then
end;
Begin
p^.bal := 0; h:=false
end
end;
end else
if x>p^.key then
begin
End
End else
if h then
If x <p^.key then
Begin
Case p^.bal of
1 : begin
Search(x,p^.left,h);
If h then
Case p^.bal of
1 : begin
0 : p^.bal := 1;
-1 : begin {rebalanced}
p1 := p^.right;
if p1^.bal := 1 then
begin
p1 := p^.left;
if p1^.bal := -1 then
begin {single rotasi kiri }
p^.left := p1^.right;
p1^.right := p;
p^.bal := 0; p:=p1;
end else
SINAR SINURAT, ST
STMIK BUDIDARMA
Hal : 52
p^.right := p1.left;
p1^.left := p2^.right
p1.left:= p;
p2^.right := p1;
if b1 = 0 then
p^.right := p2^.left;
begin
p2^.left := p;
p^.bal := 1;
if p2^.bal = 1 then
p^.bal := -1 else
p^.bal := 0;
end else
if p2^.bal := -1 then
begin
p^.bal := 0; p1^.bal :=0;
p1^.bal := 1 else
end;
p := p1;
end;
end else
p^.bal := 0; h:=false
end
end else
b2 := p2^.bal;
begin
p1^.left := p2^.right;
p^.count := p^.count + 1;
p2^.right := p1;
h:=false
p^.right := p2^.left;
end
p2^.left := p;
end;
if b2 = 1 then p^.bal := -1
else p^.bal := 0;
if b2 = -1 then
p1^.bal := +1
else p1^.bal := 0;
p := p2; p2^.bal := 0;
end;
end;
begin
case p^.bal of
-1 : p^.bal := 0;
end;
end;
0 : begin
p^.bal := 1; h := false;
end;
1 : begin
p1 := p1^right;
b1 := p1^.bal;
if b1 >=0 then
begin { single rotasi kiri }
SINAR SINURAT, ST
STMIK BUDIDARMA
Hal : 53
Del(r^.right, h);
-1 : begin { rebalance }
If h then balance2(r,h)
p1 := p^.left; b1 := p1^.bal;
if b1 <= 0 then
End else
Begin
p^.left := p1^right;
q^.key := r^.key;
p1^.right := p;
q^.count := r^.count;
if b1 = 0 then
begin
p^.bal := -1; p1^.bal := 1;
end
end;
h:= false
end else
begin
p^.bal := 0; p1^.bal := 0
Begin { Utama }
If p = nil then
Begin
end;
p := p1
H:= false
end else
End else
If p^.key then
p2 := p1^.right;
Begin
b2 := p2^.bal;
p1^.right := p2^.left;
If h then balance1(p,h)
p2^.left := p1;
End else
p^.left := p2^.right;
p2^.right := p;
Begin
Delete(x,p^.right,h);
If h then balance2(p,h)
if b2 = 1 then p1^.bal := -1
End else
else p1^.bal := 0;
Begin
p := p2; p2^.bal:= 0;
q := p;
if q^.right = nil then
end;
begin
end;
end;
end else
end;
SINAR SINURAT, ST
begin
p := q^.right; h:= true
end else
begin
del(q^.left, h);
STMIK BUDIDARMA
Hal : 54
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.
2.
3.
4.
5.
P0 K1 P1K2 . Pm-1Km-1PmKm
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.
25
30 40
10 20
2 5 7 8
13 14 15 18
22 24
26
27 28
32
41 42 45 46
35 38
Jika pencarian tidak berhasil kita berada dalam salah satu situasi berikut :
1.
2.
Ki < X < Ki+1 untuk 1 <= i < m lanjutkan pencarian pada frame pi selanjutnya
Km < X Pencarian berlanjut pada frame Pm selanjutnya
SINAR SINURAT, ST
STMIK BUDIDARMA
Hal : 55
1.
2.
3.
Key 22 tidak ada dalam frame, sisip di frame C, ini tidak memungkinkan sebab frame C penuh
Frame C dipecah menjadi 2 frame, misalnya frame baru D dialokasi
Key m+1 adalah sama diletakkan pada C dan D key tengah pindah ke atas 1 level kedalam ancestor
frame A.
20
10
15 18
10
30 35 40
Menjadi :
26
15 18
20
30
22
26
35
40
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.
a. Sisip 20
20
20
b. Sisip 40 10 30 15
10
15
30
SINAR SINURAT, ST
c. Sisip 35 7 26 18 22
40
STMIK BUDIDARMA
20
30
Hal : 56
e. Sisip 42 13 46 27 8 32
10
13 15 18
20 30 40
22 26 27
32
35
42
46
f. Sisip 38 24 45 25
25
10
20
13 15 18
30
22 24
40
26 27
32 35 38
42 45 46
10
20
13 15 18
30
22 24
40
26 27
32 35 38
42 45 46
32 35 38
42 45 46
Hapus 45 24
10
13 15 18
SINAR SINURAT, ST
20 30 40
22 24
26 27
STMIK BUDIDARMA
Hal : 57
b. Hapus 38 32
10
13
22 30 40
15 18 20
26 27
32 35 38
42
46
c. Hapus 8 27 46 13 42
10
13
22 30
15 18 20
26 27
35 40
42 46
d. Hapus 5 22 18 26
10
15
22
18 20
26
30 35 40
20
30 35 40
e. Hapus 7 35 15
15
f. Data terakhir
10
10
20 30 40
SINAR SINURAT, ST
STMIK BUDIDARMA
Hal : 58
Const n = 2;
begin
nn = 4; { page size }
v := e[n];
item = record
e[i] := e[i-1];
key : integer;
p
e[r+1] := u;
: ref;
end else
count : integer
end;
begin
frame = record
m : 0 .. nn;
r := r-n; v:=e[n+1];
po : ref;
e : array[1..nn] of item
b^.e[i] := u;
end;
b^.e[i] := a^.e[i+n];
: integer;
: boolean;
end;
: item;
m := n; b^.m := n;
b^.p0 := v.p; v.p := b;
end;
end;
end;
Procedure insert;
Var I : integer; b: ref;
Begin
begin { search }
if a = nil then
With a^ do
Begin
begin
h := true;
If n < nn then
Begin
with v do
begin
Inc(m); h:=false;
For i:= m downto r+2 do
e[i]:=e[i-1];
e[r+1] := u
end else
begin
new(b);
if r<=n then
begin
SINAR SINURAT, ST
key := x;
count := 1;
p:= nil
end else
with a^ do
begin
l := 1; r:= m;
repeat k := (l+r) div 2;
if x<e[k].key then r := k-1;
STMIK BUDIDARMA
Hal : 59
b^.m := mb; a^.m := n-1+k;
h:= false;
until r < l ;
if l-r > 1 then
end else
begin
begin
for i:= 1 to n do
e[k].count := e[k].count + 1;
a^.e[i+n] := b^.e[i];
h:= false
end else
c^.e[i] := c^.e[i+1];
begin
if r=0 then q:=p0
a^.m := nn;
else q := e[r].p;
h := c^.m < n
search(x,q,h,u);
end
If h then insert
end else
c^.m := mc 1;
begin
End
End;
else b:=c^.e[s-1].p;
End;
if k>0 then
Begin
a^.e[i+k] := a^.e[i];
a^.e[k] := c^.e[s];
a^.e[k].p := a^.p0; mb := mb k;
Begin
mc := c^.m;
if s < mc then
a^.p0 := b^.e[mb].p;
begin
s := s+1; b:= c^.e[s].p;
c^.e[s] := b^.e[mb];
c^.e[s].p := a; b^.m := mb-1;
a^.e[n] := c^.e[s];
a^.e[n].p := b^.p0;
if k>0 then
end else
begin
b^.e[mb] := c^.e[s];
begin
b^.e[mb].p a^.p0;
a^.e[i+n] := b^.e[i];
b^.e[i+mb] := a^.e[i];
for i:= 1 to mb do
b^.e[i] := b^.e[i+k];
end
end
SINAR SINURAT, ST
STMIK BUDIDARMA
Hal : 60
begin
end;
e[i] := e[i+1]
var a: ref;
end else
begin
begin
with p6 do
del(q,h);
begin
if h then underflow(a,q,r,h)
q := e[m].p;
end
end else
begin
begin
del (q,h);
delete(x,q,h);
if h then underflow(p.q.m,h)
if h then underflow(a,q,r,h)
end else
end
begin
p^.e[m].p := a^.e[k].p;
a^.e[k] := p^.e[m];
end;
end;
end
Begin
end
begin
if a = nil then
Begin
For i:= 1 to l do write( );
begin
For i:= 1 to m do
write(a[i].key:4);
end else
with a^ do
Writeln;
begin
Printtree(p0,l+1);
l := 1; r := m;
For i:= 1 to m do
repeat
Printtree(e[i].p, l+1);
k := (l+r) div 2;
if x <= e[k].key then r := k-1;
End;
End;
Begin
Root := nil;
While x <> 0 do
begin
Begin
if q = nil then
SINAR SINURAT, ST
Writeln(Cari key,x);
STMIK BUDIDARMA
Hal : 61
Search(x,root,h,u);
end
If h then
end;
Begin
printtree(root,1);
q := root; new(root);
read(x)
with root^ do
end
begin
End.
m := 1; p0 := q; e[1] := u
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 horijontal pointer
A
B
b
SINAR SINURAT, ST
B
b
STMIK BUDIDARMA
C
c
3.
Hal : 62
Bila subtree B diproses pada ketinggian tertentu maka pointer A akan merepresentasi keturunan,
kemudian keturunan subtree A diijinkan menjadi saudara B. Dengan demikian frame mempunyai
anggota 3 node sebagai berikut :
B
A
4.
B
c
Dengan adanya pemotongan tanpa memperhatikan seperti langkah kedua, maka akan
diperoleh sebagai berikut :
B
c
A
a
A
d
B
b
C
c
B
d
A
a
C
b
Pencarian dengan cara seperti diatas menunjukkan perbedaan (tidak efektif) apakah proses sepanjang
horijontal dan vertikal (kasus langkah ketiga). Untuk menangani hal tersebut subtree kiri dan kanan
diselesaikan secara intuisi yaitu fisky dengan membuang yang asimetris, sehingga dinamakan
Symetric Binary B-Tree (SBB-Tree).
SINAR SINURAT, ST
STMIK BUDIDARMA
Hal : 63
Pencarian yang lebih efektif, untuk mencapai rata-rata, tetapi proses sisip dan hapus akan 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 akan merepleksikan
kejadian frame yang overflow dan pemisahan sub sikuensi frame.
(LL)
(LR)
B
(RR)
(RL)
SINAR SINURAT, ST
STMIK BUDIDARMA
Hal : 64
(1)
1
(2)
(4)
(3)
SINAR SINURAT, ST
STMIK BUDIDARMA
Hal : 65
p^.left:= p2^.right;
p2^.right := p; p:=p2;
end
end else
If p = nil then
Begin
begin
h:= h-1;
New(p); h := 2;
if h<> 0 then
With p^ do
Begin
p^.lh :=true
end;
Key := x; count := 1;
Left := nil; right := nil;
Lh := false; rh := false
End
end else
If x < p^.key then
Begin
Search(x, p^.right, h);
End else
If h <> 0 then
If p^.rh then
Begin
P1 := p^.left ;
h:=2;
p^.rh := false;
Begin
If p1^.rh then
P1 := p^.left ;
Begin
h:=2;
P^.right := p1^.left;
p^.lh := false;
P1^.left := p;
If p1^.lh then
Begin
p1^.rh := false;
p:= p1
P^.left := p1^.right;
End else
P1^.right := p;
If p1^.lh then
p1^.lh := false;
p:= p1
begin
P2 := p1^.left;
End else
p1^.lh := false;
If p1^.rh then
P1^.left := p2^.right;
begin
P2 := p1^.right;
p1^.rh := false;
P1^.right := p2^.left;
p2^.left := p1;
SINAR SINURAT, ST
p2^.right := p1;
p^.right:= p2^.left;
p2^.left := p;
p:=p2;
end
STMIK BUDIDARMA
Hal : 66
end else
begin
h:= h-1;
if h<> 0 then
p^.rh :=true
end;
end else
begin
p^.count := p^.count+1 ;
h:= 0;
end
end;
SINAR SINURAT, ST
STMIK BUDIDARMA
Hal : 65
BAB VII
HASHING DAN KOMPRESI
VII.1. KONSEP HASH
Tabel hashing digunakan untuk mengimplementasikan kamus dalam waktu
konstan per operasi. Tabel hash mendukung pemanggilan dan penghapusan pada
beberapa item yang telah dinamai sebelumnya.
Untuk mengimplementasikan hash dapat mempergunakan array, dimana array
tersebut akan diinisialisasi dengan indeks-indeks tertentu untuk melaksanakan proses
penyisipan data dengan memetakan item-item ke dalam indeks dikenal fungsi.
Fungsi hash digunakan untuk mengkonversi suatu item yang bernilai integer
dengan indeks array dimana item tersimpan. Jika fungsi hash satu ke satu, kita dapat
mengakses item dengan indeks arraynya sendiri sedangkan yang lainnya sebagian item
mengambil beberapa indeks yang sama dan akan mengakibatkan tabrakan (collision).
Misalnya suatu fungsi polinomial : A3x3 + A2x2 + A1x1 + 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 blok
yang tersedia (biasanya bilangan prima).
2. Metode midsquare yaitu masing-masing item-item data yang akan disimpan
dikwadratkan, kemudian memilih blok (bucket) penampung sesuai dengan nilai digit
yang di tengah dari hasil data yang dikuadratkan tersebut.
Misalnya jumlah blok (bucket) = 13
13 23
K2
F(K) 4
15
16
26 27
37
47
12
50
collision
collision
Metode penjumlahan digit yaitu setiap digit dari suatu bilangan dijumlah dan kemudian data tersebut
disimpan pada blok yang sesuai
Contoh :
SINAR SINURAT, ST
STMIK BUDIDARMA
169
f(K)= 1+6+9
= 16
529
5+2+9
16
225
2+2+5
9
Hal : 66
256
2+5+6
13
Collision
Jenis-jenis hashing :
1. Open hashing (hashing terbuka)
Open hash (external hash) adalah suatu table dimana proses pertukaran item data
dengan pointer masing-masing (tidak terpisahkan) tidak terbatas
2. Close hashing (hashing tertutup)
Proses pemetaan data dalam tabel dengan indeks masing-masing, dimana
kelemahannya 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 list
dengan nilai f(K). Setiap lokasi berisi header list pada elemen data f(key) = i. Metode
ini membutuhkan temporary space (tempat tambahan)
2. Metode closed chaining
Merupakan modifikasi separate chaining dimana setiap item data ditambahkan link[i]
yang merujuk item data selanjutnya. Proses ini akan selalu mencari tempat yang
kosong untuk memetakan data, sedang pencarian biasanya dilakukan mulai dari posisi
N 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 space
untuk link item data.
Probe adalah suatu proses perbandingan nilai data pertama dengan data lain. Probe
minimum (terbaik) = 1 berarti kompleksitasnya O(N) = 1 dan probe maksimum
(terburuk) = N berarti kompleksitasnya O(N) = N (terurut) dan probe rata-rata = (1 + n)/2
berarti 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 akan
dipetakan ke dalam 13 blok (bucket) untuk menyimpan item-item data sebagai berikut :
- f(3) = 3 mod 13 = 3
- f(13) = 13 mod 13 = 0
Collision
- f(23) = 23 mod 13 = 10
- f(15) = 15 mod 13 = 2
Collision
- f(16) = 16 mod 13 = 3
- f(23) = 26 mod 13 = 0
- f(27) = 27 mod 13 = 1
- f(37) = 37 mod 13 = 11
Collision
- f(47) = 47 mod 13 = 8
- f(50) = 50 mod 13 = 11
SINAR SINURAT, ST
STMIK BUDIDARMA
Hal : 67
13
15
10 11 12
( 13 blok/bucket )
Langkah 1 .. 4
23
13
15
16
10 11 12
( 13 blok/bucket
Langkah 1 .. 5
23
13
26
15
16
10 11 12
( 13 blok/bucket
Langkah 1 .. 6
23
13
26
15
16 27
47
10 11 12
( 13 blok/bucket
Langkah 1 .. 9
23 37
13
26
15
16 27
8
47
10 11 12
23 37
( 13 blok/bucket
50
SINAR SINURAT, ST
STMIK BUDIDARMA
Hal : 68
Jadi melihat proses pemetaan data ke dalam array maka dapat kita lihat berapa kali proses
probing, seperti diperlihatkan pada tabel berikut di bawah ini :
Tabel 7.1. Proses probing
Key
Fungsi
3
f(3)=3
13
f(13)=0
23
f(23)=10
15
f(15)=2
16
f(16)=3
f(16)=4
26
f(26)=0
f(26)=1
27
f(27)=1
f(27)=2
f(27)=3
f(27)=4
f(27)=5
37
f(37)=11
47
f(47)=8
50
f(50)=11
f(50)=12
Total
Probe (kali)
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
17
Jumlah probe
Rata-rata probe = ----------------Jumlah data
= 17/10 = 1,7
2 kali
11 13 17 19
23 29
Terdapat 10 blok/bucket
Primer 7 blok/bucket
Averflow 3 blok/bucket
h(2) = 2 mod 7 = 2
h(3) = 3 mod 7 = 3
SINAR
h(5) SINURAT,
= 5 mod 7 ST
=5
h(7) = 7 mod 7 = 0
h(11) = 11 mod 7 = 4
h(13) = 13 mod 7 = 6
h(17) = 17 mod 7 = 3
collision
collision
collision
7
29
2
3
11
5
13
0
1
2
3
4
5
6
STMIK BUDIDARMA
Hal : 69
Berarti :
Key
: 2
Probe (kali) : 1
5
1
11 13 17 19
23 29
11 13 17 19
Terdapat 10 blok/bucket
23 29
..
Sehingga untuk sikuensi data diatas apabila diselesaikan dengan quadratic probing akan
terjadi collision yang tidak terbatas (infinity) seperti pada item data 23 (tabel 7.2)
0
11
13
17
19
STMIK BUDIDARMA
Hal : 70
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 collision
yang terjadi pada masing-masing penempatan key.
Jawab :
Tabel 7.3. Konversi alpabetik dengan fungsi ordinal
Ord()
Ordinal * A
Fractional (AK)
Ord(satu)
= 19+1+20+21 = 61
61 * 0.618 = 32,698 0.698
Ord(dua)
= 4 + 21 + 1 = 26
26 * 0.618 = 16.068 0.068
Ord(tiga)
= 20 + 9 + 7 + 1 = 37
22.866
0.866
Ord(empat) = 5 + 13 + 16 + 1 + 20 = 55
33.990
0.990
Ord(lima)
= 12 + 9 + 13 + 1 = 35
22.630
0.630
Ord(enam)
= 5 + 14 + 1 + 13 = 33
20.394
0.394
Ord(tujuh)
= 20 + 21 + 10 + 21 + 8 = 80
49.440
0.440
Ord(delapan) = 4+5+12+1+16+1+14=53
32.754
0.754
Ord(sembilan) = 19+5+13+2+9+12+1+14=75
46.350
0.350
Ord(sepuluh) = 19+5+16+21+12+21+8=102
63.036
0.036
Sebelum melakukan fungsi rehashing terhadap keseluruhan hasil ordinal huruf-huruf dari
masing-masing item data diatas maka dapat dilakukan dengan fungsi floor (pendekatan
pembulatan nilai ke bawah) pada fungsi hash H(x), seperti pada tabel berikut :
Tabel 7.4. Fungsi rehashing
Fungsi hash
Rehashing
H2(x,i) = -i * ((ord(x) % 5) + 1)
H(x) = m.frac(AK)
H(satu)
= 17 * 0.698 = 11
H2(x,1) = -1 * (61 % 5 + 1) = -2
H(dua)
= 17 * 0.068 = 1
H2(x,2) = -1 * (26 % 5 + 1) = -4
H(tiga)
= 17 * 0.866 = 14
H2(x,3) = -1 * (37 % 5 + 1) = -9
H(empat) = 17 * 0.990 = 16
H2(x,4) = -1 * (55 % 5 + 1) = -4
H(lima)
= 17 * 0.630 = 10
H2(x,5) = -1 * (35 % 5 + 1) = -5
H(enam)
= 17 * 0.394 = 6
H2(x,6) = -1 * (33 % 5 + 1) = -24
H(tujuh)
= 17 * 0.440 = 7
H2(x,7) = -1 * (80 % 5 + 1) = -7
H(delapan) = 17 * 0.754 = 12
H2(x,8) = -1 * (53 % 5 + 1) = -32
H(sembilan) = 17 * 0.350 = 5
H2(x,9) = -1 * (75 % 5 + 1) = -9
H(sepuluh) = 17 * 0.036 = 0
H2(x,10) = -1 * (102 % 5 + 1) = -30
Tabel ini tidak menunjukkan adanya collision.
SINAR SINURAT, ST
STMIK BUDIDARMA
Satu
Dua
Tiga
Empat
Lima
Enam
Tujuh
Delapan
Sembilan
Sepuluh
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
11
2
14
16
10
6
7
12
5
0
-2
-4
-9
-4
-5
-24
-7
-32
-9
-30
Hal : 71
Penempatan probing
H(x) = H(x) + H2*(x,i)
11
1
14
16
10
6
7
12
5
0
Sepuluh
Dua
Sembilan
Enam
Tujuh
Lima
Saturday
Delapan
Tiga
empat
STMIK BUDIDARMA
Hal : 72
before := nhash[count];
current := nhash[count]^.next;
while (before^.lagi <> nil ) and
(not selesai) do
begin
if current^.isi = x then
begin
before^.lagi := current^.lagi;
dispose(current);
selesai := true
end else
begin
before := current;
current := current^.next
end
end
end;
{prosedur untuk mencari data dalam
hash}
procedure search(x : byte; var nhash :
hash);
begin
count := 0;
if not member(x,bil) then
writeln(data tidak ada dalam hash)
else
writeln(data pada posisi : , count);
end;
{ prosedur menghapus data dari hash }
procedure delete(x : byte; var nhash :
hash);
var selesai : boolean;
begin
selesai := true;
count := nhash(x);
if nhash[count]^.isi = x then
begin
current := nhash[count];
nhash[count] :=
nhash[count]^.next;
dispose(current)
end else
begin
end
end;
procedure hapus(x : byte; nhash : hash);
begin
if member(x, bil) then
begin
delete(x, bil);
writeln(data telah dihapus)
end else
writeln(data telah dihapus);
end;
VII.4. KOMPRESI
Kompresi adalah suatu metode penghematan penyimpanan file dalam suatu media
simpan. Dalam mengkompresi suatu file ada banyak metode-metode yang dapat
digunakan dan salah satu yang akan dibahas adalah Algoritma Huffman.
Algoritma Huffman dipakai untuk mengkonstruksi kode prefix yang optimal,
yang memiliki proses penggabungan yang berulang-ulang terhadap bobot dua item data
yang terendah. Misalnya w1 dan w2 dua buah data yang berbobot paling kecil diantara
w1, w2, w3, , wn maka akan dibentuk tree w1+w2, w3, w4, , wn sehingga w1+w2
akan membentuk subtree sebagai berikut :
W1
W2
SINAR SINURAT, ST
STMIK BUDIDARMA
Hal : 73
Dengan cara yang sama untuk semua data dapat dibentuk sub-sub tree sampai akhirnya
membentuk sebuah pohon Huffman.
Contoh :
Tabel 7.6. Data pohon Huffman
Karakter
Frekwensi
Total Bit
a
e
i
s
t
sp
nl
10
15
12
3
4
13
1
30
30
24
15
16
26
5
15
12
13
sp
nl
2) dipilih 2 buah elemen data yang terkecil yaitu s dan nl dengan jumlah 4 dengan
membentuk subtree T1
4
T1
10
15
13
12
sp
nl
3) Kemudian dua buah elemen data lainnya dibandingkan untuk membentuk subtree
berikutnya yaitu T1 dan t
8
T2
4
T1
10
15
SINAR SINURAT, ST
13
12
sp
1
nl
STMIK BUDIDARMA
4)
Hal : 74
T2
4
T1
15
13
12
sp
nl
5) Perhatikan bahwa e=15, I=12, sp=13, dan t3=18 maka yang digabung adalah I dan sp
18
T3
10
T2
15
12
13
T1
T4
25
sp
nl
18
T3
10
T2
12
SINAR SINURAT, ST
13
sp
T1
T4
25
1
nl
STMIK BUDIDARMA
Hal : 75
33
25
T5
0
T4
1
18
T3
0
13
sp
10
T1
0
12
T2
0
15
1
nl
Char
0
1
2
3
4
5
6
7
8
Bobot
a
e
i
s
t
sp
nl
T1
T2
SINAR SINURAT, ST
10
15
12
3
4
13
1
4
8
Parent
(ayah)
9
11
10
7
8
10
7
8
9
Tipe
anak
1
1
0
0
1
1
1
0
0
STMIK BUDIDARMA
9
10
11
12
T3
T4
T5
T6
18
25
33
58
Hal : 76
11
12
12
0
0
1
0
-
SINAR SINURAT, ST
begin
outbufptr := bufsize;
printfile;
outbufptr := 0
end
end;
(* prosedur inisialisasi BST *)
procedure inittree;
var i : word;
begin
i := N +1;
repeat
right[i] := nul;
inc(i);
until (i>N+256);
i := 0;
repeat
mom[i] := nul;
inc(i);
until (i=n)
end;
(* prosedur menggeser posisi node keatas *)
prosedur shifted(me : word);
var ancestor, grdmtr, mother, child, brother :
word;
bexit : boolean;
begin
bexit := false;
repeat
mother := mom[me];
(* jika ibu bukan spesial node *)
if mother <= nul then
begin
grdmtr := mom[mother];
(* jika ibu bukan spesial node *)
if grdmtr <= nul then
begin
ancestor := mom[grdmtr];
(* jika aku anak kiri dari ibu *)
if left[mother] = me then
begin
(* jika ibu anak kiri dari nenek *)
if left[grdmtr] = mother then
begin
brother := right[mother];
left[grdmtr] := brother;
mom[brother] := grdmtr;
STMIK BUDIDARMA
SINAR SINURAT, ST
Hal : 77
end else
(* jika nenek spesial node *)
begin
(* apakah aku merupakan anak kiri *)
if left[mother] = me then
begin
child := right[me];
left[mother] := child;
right[me] := mother
end else
begin
child := left[me];
right[mother] := child;
left[me] := mother
end;
right[grdmtr] := me;
mom[child] := mother;
mom[me] := grdmtr;
mom[mother] := child;
bexit := true
end
end else
bexit := true;
until bexit;
end;
(* prosedur untuk menambah node baru *)
procedure addnode(position : word0;
var preposition, templen, child : word;
trigg : integer;
bexit : boolean;
begin
trigg := 1;
lengthmatch := 0;
height := 0;
preposition := textbuf[position] + n + 1;
right[position] := nul;
left[position] := nul;
bexit := false;
repeat
inc(height);
if trigg > 0 then
(* untuk node dikanan *)
begin
if right[preposition] = nul then
(* ditambah jika node sebelum kosong *)
begin
right[preposition] := position;
mom[position] := preposition;
bexit := true
end else
preposition := right[preposition]
end else
(* tambah node di kiri *)
begin
if left[preposition] = nul then
(* tambah, jika node sebelumnya null *)
STMIK BUDIDARMA
SINAR SINURAT, ST
Hal : 78
begin
while right[descend] <> nul do
descend := right[descend];
right[mom[descend]] :=
left[descend];
mom[left[descend]] :=
mom[descend];
left[descend] := left[me];
mom[left[me]] := descend;
child := descend
end;
right[child] := right[me];
mom[right[me]] := child
end else child := right[me];
end else child := left[me];
mom[child] := mother;
if right[mother] = me then
right[mother] = child
else left[mother] := child;
mom[me] := nul
end
end;
(* prosedur untuk mengkoding file *)
procedure encode;
var temp, ptrcodebuf, cycleencode.
Nchar, totread : byte;
ptrinsert, ptrencode : word;
bexit : boolean;
begin
inittree;
temp := 0;
codebuf[0] := 0;
ptrcodebuf := 1;
cycleencode := 1; ptrinsert := 0;
ptrencode := N F; bexit := false;
repeat
nchar := readchar;
if not beof then
begin
textbuf[ptrencode + temp] := nchar;
inc(temp)
end;
until (temp >= f) or (beof);
if temp > 0 then
begin
totread := temp;
addnode(ptrencode);
repeat
if lengthmatch > totread then
lengthmatch := totread;
if lengthmatch <= limit then
begin
lengthmatch := 1;
codebuf[0] := codebuf[0] or
cycleencode;
codebuf[ptrcodebuf] :=
textbuf[ptrencode];
inc(ptrcodebuf]
STMIK BUDIDARMA
SINAR SINURAT, ST
Hal : 79
inc(temp)
until temp >= ptrcodebuf
end;
bexit := true
end
until bexit
end
end;
(* prosedur mendekoding *)
procedure decode;
var
temp, headerbyte, nchar, cycledecode,
prefixbit : byte;
ptrtextbuf : word; bexit : boolean;
begin
cycledecode := 0; ptrtextbuf := N - F;
bexit := false;
repeat
cycledecode := cycledecode shr 1;
if cycledecode = then then
begin
nchar := readchar;
if beof then
bexit := true else
begin
cycledecode := 255;
headerbyte := nchar
end
end
if not bexit then
begin
prefixbit := headerbyte and 1;
headerbyte := headerbyte shr 1;
if prefixbit = 1 then
begin
nchar := readchar;
if beof then bexit := true else
begin
textbuf[ptrtextbuf] := nchar;
inc(ptrtextbuf);
ptrtextbuf := ptrtextbuf and (N-1);
printchar(nchar)
end
end else
begin
nchar := readchar;
if beof() then bexit := true else
begin
temp := nchar;
nchar := readchar;
if beof then bexit := true else
begin
posmatch := nchar shr 4;
posmatch := (posmatch shl 8 )
or temp;
lengthmatch := nchar and 15) +
limit = 1;
STMIK BUDIDARMA
SINAR SINURAT, ST
Hal : 80
writeln(Waktu proses =
,processtime,Detik);
end;
(* program utama *)
begin
clrscr;
if (paramcount < 2) or (paramcount > 4) then
begin
writeln( Sintak : , paramstr(0),
Input file outfile[dekompresi]);
halt;
end;
if paramstr(1) = paramstr(2) then
begin
writeln(Nama file harus beda);
halt
end;
assign(infile, paramstr(1));
{$I--}
reset(infile, 1);
if ioresult <> 0 then
begin
writeln(Salah input file ,paramstr(1));
halt
end;
assign(outfile, paramstr(2));
rewrite(outfile, 1);
{$I+}
if ioresult <> 0 then
begin
writeln(Salah output file ,paramstr(2));
halt
end;
gettime(h1, m1, s1, c10;
if paramcount <> 3 then
begin
press := true;
kompresi
end else
begin
press := false;
dekompresi
end;
gettime(h2, m2, s2, c2);
statistik;
close(outfile);
close(infile);
readln;
end.
STMIK BUDIDARMA
Hal : 1
BAB VIII
GRAPH
VIII.1. DEFENISI GRAPH
Suatu graph G=(V,E) berisi suatu himpunan vertex dan himpunan edge E, masingmasing edge adalah sepasang (v,w) dimana v,w V. Vertex sering disebut dengan node dan
edge disebut dengan arc.
Beberapa himpunan vertex yang terhubung dengan himpunan edge akan membentuk
graph. Jika sepasang edge diorder dan graph itu disebut dengan graph directed (digraph).
Dalam digraph bahwa vertex w adalah adjacent (bersinggungan) terhadap vertex v jika dan
hanya jika (iff) (v,w) E. Kadang-kadang edge memiliki komponen ketiga disebut weight
(bobot) atau cost (ongkos).
Misalkan V = { v0, v1, v2, v3, v4, v5, v6 } dengan 12 edge diperoleh :
(v0, v1, 2), (v0, v3, 1), (v0, v1, 3), (v1, v4, 10)
E = (v3, v4, 2), (v3, v6, 4), (v3, v5, 8), (v3, v2, 2)
(v2, v0, 4), (v3, v4, 2),(v4, v6, 6), (v6, v5, 1)
V0
V2
V1
V3
8
V5
10
V4
6
V6
Berdasarkan gambar diatas bahwa vertex yang adjacent terhadap v3 adalah v2, v4, v5,
v6 dan |V| = 7 dan |E| = 12 dan |S| merepresentasikan size himpunan S
Suatu path dalam graph adalah sikuensi dari vertex-vertex : w1, w2, , wn
sedemikian sehingga (wi, wi+1) E untuk 1<= i < n
Length (panjang) dari suatu path adalah sejumlah node pada suatu path yaitu n-1, dan
sering disebut dengan unweigted path length yaitu sejumlah biaya pada edge dalam path.
Misalnya :
Path v0 sampai v5 adalah v0, v3, v5. Panjang path adalah 2 edge dan weighted path
length adalah 9 yang kebetulan path terpendek antara v0 dan v5.
Simple path (path sederhana) adalah path yang mana semua vertex-vertex jelas,
kecuali awal dan akhir boleh sama.
Cycle dalam suatu digraph adalah suatu path dengan panjang paling sedikit 1
sedemikian sehingga w1 = wn; Suatu directed acycle graph (DAG) kadang-kadang
didasarkan pada suatu penggabungan, dengan asumsi bahwa dalam directed graph (digraph
= graph berarah) tidak boleh ada cycle.
SINAR SINURAT, ST
STMIK BUDIDARMA
Hal : 2
C
D
581 307
420 181
162
162
921 161
581
E
353
413
921
161
-
420
307
215
353
B
921
162
413
D
181
161
Maka path terpendek dengan Algoritma Djikstra adalah {C,D.E} = 323 (total jarak}
Contoh 2 :
30
C
200
50
40
A
75
5
G
D
20
80
100
40
60
Cari SPP dari satu vertex ke seluruh vertex lain dengan Algoritma Djikstra,
A
B
E
SINAR SINURAT, ST
path terpendek
adalah AB
STMIK BUDIDARMA
Hal : 3
path terpendek
adalah ABC
SINAR SINURAT, ST
STMIK BUDIDARMA
a. PRIMS :
K kunjungi = true;
Hal : 4
evaluasi
K L = 215
K M = 581
Minimum = 215
K N = 307
K P = 353
L kunjungi = true; evaluasi K M = 581
K N = 307
K P = 353
Minimum = 181
L N = 181
L P = 413
L M = 420
N kunjungi = true; evaluasi
K M = 581
K N = 307
K P = 353
N M = 162
Minimum = 161
N P = 161
L P = 413
L M = 420
P kunjungi = true; evaluasi
K M = 581
K N = 307
K P = 353
L P = 413
Minimum = 162
L M = 420
N M = 162
P M = 921
M kunjungi = true; evaluasi Stop karena semua vertex sudah dikunjungi (true)
maka total MST PRIMS = 215 + 181 + 161 + 162 = 719
dan Himpunan pencarian adalah = {(K,L), (L,N), (N,P), (N,M)}
maka bentuk tree dan graph dari proses MST ini sebagai berikut :
K
420
215
L
581
M
413
921
181
162
353
N
307
M
P
161
b. Graph PRIMS
SINAR SINURAT, ST
STMIK BUDIDARMA
Hal : 5
b. KRUSKAL
Dari gambar 8.4.b. menunjukkan bahwa : K - L L K
(N P) = 161
(N M) = 162
(N L) = 181
(L K) = 215
{ (N,P) }
{ (N,P), (N,M) }
{ (N,P), (N,M), (N,L) }
{ (N,P), (N,M), (N,L), (L,K) }
Iterasi stop, karena setiap penambahan edge akan mengakibatkan proses penelusuran
(trace) membentuk suatu siklus (cycle).
Jadi total MST Kruskal = (N,P) + (N,M) + (N,L) + (L,K)
= 161 + 162 + 181 + 215 = 719
Tree yang terbentuk sebagai berikut :
N
SINAR SINURAT, ST
STMIK BUDIDARMA
Hal : 6
KEPUSTAKAAN
1. Data structures and problem solving using java; Mark Allen Weiss ; Addison Wesley ;
1998
2. An Introduction to Data Structures and Algorithm with Java; Gleen Rowe; Prentice
Hall International Edition ; 1998
3. Data Structures and Program Design ; Robert L. Kruse ; Prentice Hall of India Privated
Limited ; 1991
4. Data Structures, Algorithms and Program Style Using C ; James F. Korst; Leonard J.
Garrett ; PWS-Kent Publishing Company ; 1988
5. Data structures, Theory and Problem ; Seymour Lipschutz ; McGraw Hill Book
Company ; 1986
6. Algorithms + Data Structures = Program ; Niklaus Wirth ; Prentice Hall of India
Private Limited; 1991
7. Computer Algorithms, Introduction to Design and Analysis, Second Edition, Sara
Baase ; Addition Wesley Publishing Company ; 1988
8. Problem Solving and Structured Programming in Pascal, Second Edition, Iliot B.
Koffman ; Addition Wesley Publishing Company ; 1985
9. Turbo Pascal , Reference Manual; Scotts Valley ; Borland International ; 1985
10. Turbo Pascal , Jilid 1; Jogianto H.M. ; Andi Offset Yogyakarta ; 1989
11. Turbo Pascal , Jilid 2; Jogianto H.M. ; Andi Offset Yogyakarta ; 1989
12. Dasar-Dasar Pemrograman Pascal, Teori dan Program Terapan ; Insap P. Santoso, Ir,
M.Sc ; Andi Offset Yogyakarta ; 1987
13. Belajar Sendiri Pemrograman Dengan Turbo Pascal 7.0 ; Ediman Lukito ; Elex Media
Komputindo ; 1993
14. Struktur Data (transparansi) ; Universitas Bina Nusantara ; Jakarta ; 2001
SINAR SINURAT, ST
STMIK BUDIDARMA