• Tidak ada hasil yang ditemukan

Operasi dasar terhadap tumpukan: 1. Membuat stack kosong

Dalam dokumen BAB 1 PENGANTAR KE STRUKTUR DATA (Halaman 62-80)

2. Menyisipkan elemen pada stack 3. Menghapus elemen stack 4. Memeriksa apakah stack kosong Membuat Stack Kosong

procedure CreateStack(output S: Stack) {membuat stack kosong, S.Top = Nil} {K. Awal : - }

{K.Akhir: Stack S terdefinisi, S.Top = Nil} Deklarasi:

Deskripsi: S.Top  Nil

Algoritma 5.2. Membuat Stack Kosong Menyisipkan Elemen Pada Stack

procedure Push(input/output S: Stack, input X: TInfo) {Menyisipkan X sebagai elemen pada puncak stack} {K. Awal: S terdefinisi, X terdefinisi}

{K.Akhir: X menjadi elemen puncak stack} Deklarasi: P: Address Deskripsi: Alokasi(P); Next(P)  Nil; Info(P)  X Next(P)  S.Top S.Top  P

Menghapus Elemen Stack

procedure Pop(input/output S: Stack, output X: TInfo) {Menghapus elemen stack}

{K. Awal: S terdefinisi, tidak kosong} {K.Akhir: X adalah info elemen yang dihapus} Deklarasi:

Deskripsi:

X  Info(S.Top) S.Top  Next(S.Top)

Algoritma 5.4. Menghapus Elemen Stack Memeriksa Apakah Stack Kosong

function EmptyStack(input S: Stack)  boolean {mengembalikan true jika stack S kosong} Deklarasi:

Deskripsi:

return (S.Top = Nil)

Algoritma 5.5 Memeriksa Apakah Stack Kosong 5.3 Representasi Fisik Tumpukan Dengan Larik

Stack dapat drepresentasi secara fisik menggunakan larik dengan NMAX elemen, dimana NMAX merupakan konstanta yang diperkirakan sebagai jumlah maksimum tumpukan. Deklarasi tumpukan yang direpresentasi menggunakan larik seperti pada Algoritma 5.6.

const NMAX = 100

type TInfo = integer {atau tipe terdefinisi lainnya} type Address = integer [0..NMAX]

type Stack = record <Top: Address,

ArrStack: array[1..NMAX] of TInfo> S: Stack

S.Top = 4

75 56 68 48 82 . . .

[1] [2] [3] [4] [5] [99] [100]

(a) Tumpukan Dengan 4 Elemen S.Top = 1

75 . . .

[1] [2] [3] [4] [5] [99] [100]

(b) Tumpukan Dengan 1 Elemen S.Top = 0

. . .

[1] [2] [3] [4] [5] [99] [100]

(c) Tumpukan Kosong

Gambar 5.2. Tumpukan yang Direpresentasi Menggunakan Larik

Menyisipkan Elemen Tumpukan: Representasi Larik Kasus (1) K. Awal S.Top = 4, X = 23 75 56 68 48 . . . [1] [2] [3] [4] [5] [99] [100] K. Akhir S.Top = 5 75 56 68 48 23 . . . [1] [2] [3] [4] [5] [99] [100]

Kasus (2)

K. Awal X = 46, S.Top = 100

75 56 68 48 23 . . . 73 84

[1] [2] [3] [4] [5] [99] [100]

K. Akhir Overflow! S.Top = 100

75 56 68 48 23 . . . 73 84

[1] [2] [3] [4] [5] [99] [100]

Gambar 5.3. Menyisipkan Elemen Tumpukan: Representasi Larik procedure Push(input/output S: Stack, input X: TInfo) {Menyisipkan X sebagai elemen tumpukan X}

{K. Awal: S terdefinisi, mungkin kosong, X terdefinisi} {K.Akhir: Jika masih tersedia tempat maka X menjadi elemen paling baru dari stack S.

Jika tidak tersedia tempat lagi maka tampilkan pesan “overflow”}

Deklarasi: Deskripsi:

if (S.Top < NMAX) then S.Top  S.Top + 1 S.ArrStack[S.Top]  X else

write (“overflow”) endif

Menghapus Elemen Tumpukan: Representasi Larik K. Awal S.Top = 4 75 56 68 48 . . . [1] [2] [3] [4] [5] [99] [100] K. Akhir S.Top = 3, X = 48 75 56 68 . . . [1] [2] [3] [4] [5] [99] [100]

Gambar 5.3. Menghapus Elemen Tumpukan: Representasi Larik procedure Pop(input/output S: Stack, output X: TInfo) {Menyisipkan X sebagai elemen tumpukan X}

{K. Awal: S terdefinisi, tidak koson}

{K.Akhir: X adalah elemen tumpukan yang dihapus S.Top berkurang 1} Deklarasi: Deskripsi: X  S.ArrStack[S.Top] S.Top  S.Top – 1

Algoritma 5.8. Menghapus Elemen Tumpukan: Representasi Larik Bagaimana algoritma untuk membuat stack kosong dan fungsi untuk memeriksa stack kosong dengan representasi larik? Selesaikan!

Soal Latihan

1. Buat fungsi yang mengembalikan true jika stack kosong

2. Buat fungsi yang mengembalikan true jika stack penuh (overflow) 3. Untuk menyelesaikan Soal No. 3, gunakan deklarasi stack berikut:

Deklarasi:

const NMAX = 5 {maksimum elemen larik}

type TInfo = integer {atau tipe terdefinisi lainnya} type Address = integer[0..NMAX]

type Stack =record <Top: Address,

ArrStack: array[1..NMAX] of TInfo> S: Stack

Catatan:

Sebagian nilai di dalam larik mungkin bukan merupakan elemen stack. Arsir yang bukan elemen stack

(a) Keadaan awal Keadaan akhir 45 78 56 64 37

[1] [2] [3] [4] [5] [1] [2] [3] [4] [5] S.Top = 4, X = 82 S.Top =

Push(S,X) Overflow(S)? (b) Keadaan awal Keadaan akhir 45 78 56 64 37

[1] [2] [3] [4] [5] [1] [2] [3] [4] [5] S.Top = 1 S.Top= X =

Pop(S,X) EmptyStack(S)? (c) Keadaan awal Keadaan akhir 45 78 56 64 37

[1] [2] [3] [4] [5] [1] [2] [3] [4] [5] S.Top = 1, X = 28 S.Top =

Push(S,X) Overflow(S)? (d) Keadaan awal Keadaan akhir 45 78 56 64 37

[1] [2] [3] [4] [5] [1] [2] [3] [4] [5] S.Top = 4, S.Top = X =

Pop(S,X) EmptyQ(Q)? (e) Keadaan awal Keadaan akhir 45 78 56 64 37

[1] [2] [3] [4] [5] [1] [2] [3] [4] [5] S.Top = 1, X = 37 S.Top =

Push(S,X) Overflow(S)? (f) Keadaan awal Keadaan akhir 45 78 56 64 37

[1] [2] [3] [4] [5] [1] [2] [3] [4] [5] S.Top = 2 S.Top = X =

4. Buat algoritma untuk menyalin antrian Q1 ke antrian Q2

5. Buat algoritma untuk memecah (split) antrian Q menjadi antrian Q1 yang menyimpan info ganjil dan antrian Q2 yang menyimpan info genap.

6. Buat algoritma untuk menyalin elemen stack ke antrian 7. Buat algoritma untuk menyalin elemen antrian ke stack

BAB 6 GRAF 6.1 Pengertian Dasar

Graf adalah himpunan simpul (vertices) dan garis yang disebut sisi (edge) yang menghubungkan simpul yang berbeda. Himpunan simpul dinyatakan dalam notasi himpunan. Himpunan sisi dinyatakan dengan rangkaian sisi. Sisi ditunjukkan dengan menuliskan nama dua simpul yang dihubungkan oleh sisi tersebut.

Jika graf berarah, maka arah sisi ditunjukkan oleh simpul yang pertama. Jika graf tidak berarah, relasi antar simpul tak terurut. Simpul yang pertama tidak menunjuk ke simpul lainnya.

Definisi formal graf adalah sebagai berikut: G = (V, E)

dimana:

V(G) adalah himpunan simpul terbatas, tidak kosong E(G) adalah himpunan pasangan simpul

Gambar 1 memperlihatkan contoh-contoh graf.

D C B A S C P J M R U 1 7 5 11 9 3 (a) (b) (c)

Gambar 6.1. Contoh Graf (a) G1 adalah graf tidak berarah, (b) G2 adalah graf berarah, (c) G3 adalah graf berarah

V(G1) = {A, B, C, D}

E(G1) = {(A,B), (A,D), (B,C), (B,D)} V(G2) = {P ,J, S, C, M, R, U}

E(G2) = {(P,J), (P,S), (J,C), (J,M), (S,R), (S,U)} V(G3) = {1, 3, 5, 7, 9, 11}

E(G3) = {(1,3), (3,1), (5,7), (5,9), (9,11), (9,9), (11,1)} 6.2 Istilah-istilah Pada Graf

Ketetanggaan (Adjacency) : Dua simpul dikatakan bertetangga jka keduanya terhubung langsung. Pada Gambar 1(a) simpul A bertetangga dengan simpul B dan simpul D, simpul A tidak bertetangga dengan simpul C

Bersisian (Incidency): Untuk sembarang sisi e = (V1, V2) dikatakan e bersisian dengan simpul V1 dan V2. Pada Gambar 1(a) sisi (B,D) bersisian dengan simpul B dan simpul D.

Derajat: derajat sebuah simpul adalah jumlah sisi yang bersisiaan (incident) dengan simpul tersebut, dilambangkan dengan d(v). Pada Gambar 1(a) d(A) = 2, d(B) = 3

Lintasan dari simpul Vi ke simpul Vj adalah rangkaian simpul yang menghubungkan Vi ke Vj. Untuk sebuah lintasan Vi ke Vj, ada sisi (Vi, Vk), (Vk1, Vk2), . . . , (Vkn, Vj). Jadi harus ada rangkaian garis tak terputus dari Vi melalui sejumlah simpul ke Vj. Graf Gambar 2 menunjukkan lintasan dari simpul A ke simpul G, tidak ada lintasan dari simpul A ke simpul C.

M

C

A

B

Y R G

Gambar 6.2. Graf yang menunjukkan lintasan dari simpul A ke simpul G, tidak ada lintasan dari simpul A ke simpul C

Siklus (Cycle) atau Sirkuit: adalah lintasan dengan simpul pertama sama dengan simpul terakhir. Pada Gambar 1(a) B, A, D, B adalah sirkuit. Panjang sirkuit adalah jumlah sisi dalam sirkuit tersebut. Panjang lintasan B, A, D, B adalah 3.

Keterhubungan (Connected).

Dua buah simpul V1 dan V2 dikatakan terhubung jika terdapat lintasan dari V1 ke V2. Graf tidak berarah disebut terhubung jika untuk setiap pasang simpul Vi dan Vj dalam himpunan V terdapat lintasan dari Vi ke Vj (yang juga berarti ada lintasan dari Vj ke Vi). Jika tidak maka G disebut graf tidak terhubung (disconnected). Gambar 3 adalah graf terhubung. Graf G2 dan G3 pada Gambar 1 adalah graf tidak terhubung.

D

C B

A

Gambar 6.3. Graf terhubung

Graf lengkap adalah graf yang setiap simpul terhubung ke setiap simpul lainnya. Gambar 4 menunjukkan dua graf lengkap. Jika ada N simpul maka akan ada N * (N – 1) sisi pada graf lengkap berarah dan N * (N – 1) / 2 sisi pada graf lengkap tak berarah.

D C B A J K N L M (a) (b)

Graf berbobot adalah graf yang sisinya membawa nilai. Graf berbobot dapat digunakan untuk menyatakan pentingnya nilai hubungan antar simpul, bukan hanya keberadaan hubungan tersebut. Pada Gambar 5 simpul menyatakan kota dan sisi menyatakan jalan yang menghubungkan kota-kota tersebut. Bobot yang diletakkan pada sisi menyatakan jarak dari satu kota ke kota lainnya. Mungkin saja ada banyak lintasan yang menghubungkan satu simpul dengan simpul lainnya. A B M C Y 23 16 20 17 38 14 15 16 D G

Gambar 6.5. Graf Berbobot Lintasan dan Sirkuit Euler

Lintasan Euler adalah lintasan yang melalui masing-masing sisi tepat satu kali. Bila lintasan ini membentuk sirkuit maka sirkuitnya disebut sirkuit Euler. Jadi sirkuit Euler adalah sirkuit yang melalui masing-masing sisi tepat satu kali. Graf yang mempunyai sirkuit Euler disebut graf Euler. Graf yang mempunyai lintasan Euler disebut graf semi Euler.

Graf yang memiliki sirkuit Euler pasti memiliki lintasan Euler, tapi tidak sebaliknya

C D B A C D B A E F G F C B E D A E D B A C (a) (b) (c) (d)

Gambar 6.6. (a) dan (b) Graf yang memiliki lintasan Euler, (c) Graf yang memiliki sirkuit Euler, (d) Graf yang tidak memiliki lintasan dan sirkuit Euler Contoh terapan sirkuit Euler adalah persoalan tukang pos. Seorang tukang pos harus melalui semua jalan yang adadan kembali ke tempat awal. Pada Gambar 7, salah satu sirkuit Euler yang harus dilalui tukang pos adalah A, B, C, D, E, F, C, E, B, F, A. E F C B 4 3 8 5 D 1 1 A 2 6 (c) 4 8

Gambar 6.7. Graf Persoalan Tukang Pos Lintasan dan Sirkuit Hamilton

Lintasan Hamilton adalah lintasan yang melalui setiap simpul hanya boleh satu kali. Bila lintasan tersebut membentuk sirkuit maka sirkuit tersebut disebut sirkuit Hamilton. Jadi sirkuit Hamilton adalah sirkuit yang melalui tiap simpul tepat satu kali, kecuali simpul asal (sekaligus sebagai simpul akhir) yang dilalui

dua kali. Graf yang memiliki sirkuit Hamilton disebut graf Hamilton, sedangkan graf yang memiliki lintasan Hamilton disebut graf semi Hamilton.

C D B A (a) C D B A (b) C D B A (c)

Gambar 6.8. (a) Graf yang tidak memilik lintasan Hamilton, (b) Graf yang memiliki lintasan Hamilton, (c) Graf yang memiliki sirkuit Hamilton. Setiap lintasan Hamilton pada graf dengan n simpul terdiri dari n – 1 sisi. Setiap sirkuit Hamilton pada graf dengan n simpul terdiri dari n sisi.

Contoh terapat sirkuit Hamilton adalah persoalan pedagang keliling (travelling salesman problem, TSP). Seorang pedagang harus mengunjungi setiap kota tepat satu kali dan kembali ke kota asal dengan jarak tempuh terpendek.Jika graf yang dilalui seperti pada Gambar 7, maka kemungkinan sirkuit Hamilton-nya adalah:

(a) A, B, E, D, C, F, A dengan panjang lintasan = 22 (b) A, B, C, D, E, F, A dengan panjang lintasan = 23 (c) A, F, C, D, E, B, A dengan panjang lintasan = 22 6.3 Representasi Graf

Graf dapat direpresentasi dengan matriks ketetanggaan atau dengan senarai ketetanggaan. Jika ada N simpul pada graf G maka matriks ketetanggaan adalah larik dengan N baris dan N kolom. Jika matriksnya adalah A, maka berlaku: A[i,j] = 1 jika simpul i bertetangga dengan simpul j

A[i,j] = 0 jika simpul i tidak bertetangga dengan simpul j A B C D A 0 1 0 1 A B D B 1 0 1 1 B A C D C 0 1 0 0 C B D 1 1 0 0 D A B (a) (b)

Gambar 6.9 (a) Representasi graf Gambar 1(a) dengan matriks, (b) dengan senarai ketetanggaan

Deklarasi graf dapat dilihat pada Algoritma 6.1 dan Algoritma 6.2. const N = . . . {jumlah simpul pada graf}

type Graf = array [1..N, 1..N] of boolean {atau integer} G: Graf

Algoritma 6.1. Deklarasi graf representasi matriks const N = . . . {jumlah simpul pada graf}

type Address = pointer to Elemen

type Elemen = record <Info: integer, Next: Address> type Kepala = array[1..N] of Address

type Graf = record <First: Kepala, Simpul: Elemen> G: Graf

Algoritma 6.2. Deklarasi graf representasi senarai 6.4 Penelusuran Graf

Penelusuran graf berarti mengunjungi setiap simpul di dalam graf dan memeriksa setiap sisi. Ada dua skema penelusuran, yaitu:

Pencarian mendalam (depth first search, DFS) Pencarian melebar (breadth first search, BFS) Pencarian Mendalam

Misalkan penelusuran dimulai dari simpul V, simpul berikutnya yang dikunjungi adalah simpul W yang bertetangga dengan V, lalu penelusuran dimulai lagi secara rekursif dari simpul W. Ketika mencapai simpul U sedemikian, sehingga semua simpul yang bertetangga dengannya telah dikunjungi, maka pencarian dirunut balik ke simpul terakhir yang dikunjungi sebelumnya dan mempunyai simpul W yang belum dikunjungi. Penelusuran berakhir jika tidak ada lagi simpul yang belum dikunjungi dan dicapai dari simpul yang telah dikunjungi. Algoritma DFS memerlukan larik tambahan untuk menyimpan simpul-simpul yang telah dikunjungi.

procedure DFS(input V: integer)

{menelusuri semua simpul graf dengan skema DFS}

{K. Awal: V terdefinisi, yaitu simpul awal penelusuran} {K.Akhir: Semua simpul yang dikunjungi dicetak ke layar} Deklarasi: W: integer write (V) dikunjungi[V]  true for W  1 to N do if A[V,W] = 1 then

if not dikunjungi[W] then DFS(W)

endif endif endfor

Algoritma 6.3. Penelusuran Graf Secara DFS

Jika graf tidak berarah, penelusuran dapat dimulai dari simpul manapun. Pemanggilan DFS dari program utama adalah sebagai berikut:

Deklarasi:

dikunjungi: array[1..N] of boolean V, k: integer

for k  1 to N do dikunjungi[k]  false endfor

write (“Simpul awal”); read (V) DFS(V)

Algoritma 6.4. Contoh Pemanggilan DFS dari Program Utama

Contoh, misalkan graf G yang dikunjungi seperti terlihat pada Gambar 6.10 (a). Kunjungan dimulai dari simpul 1, maka urutan simpul yang dikunjungi secara DFS adalah: 1, 2, 4, 8, 5, 6, 3, 7.

Jika graf G diubah sedikit seperti terlihat pada Gambar 6.10 (b), maka urutan simpul yang dikunjungi mulai dari simpul 1 adalah: 1, 2, 3, 6, 8, 4, 5, 7.

1 2 4 3 6 5 8 7 1 2 4 3 6 5 8 7 (a) (b)

Gambar 6.10. (a) Graf G awal, (b) Graf G setelah ditambah dengan sisi (2,3) Pencarian Melebar (BFS)

Jika penelusuran dimulai dari simpul V, maka semua simpul yang bertetangga dengan V dikunjungi terlebih dahulu. Selanjutnya simpul yang belum dikunjungi dan bertetangga dengan simpul-simpul tersebut dikunjungi, demikian seterusnya.

Jika graf G pada Gambar 6.10 (a) dikunjungi secara BFS mulai dari simpul 1, maka urutan penelusurannya adalah: 1, 2, 3, 4, 5, 6, 7, 8.

Jika graf G pada Gambar 6.10 (b) dikunjungi secara BFS mulai dari simpul 1, maka urutan penelusurannya akan tetap sa,a seperti Gambar 10 (a) yaitu: 1, 2, 3, 4, 5, 6, 7, 8.

Algoritma BFS memerlukan antrian untuk menyimpan simpul yang telah dikunjungi. Tiap simpul yang telah dikunjungi masuk ke dalam antrian tepat satu kali.

procedure BFS(input V: integer)

{menelusuri seluruh simpul graf dengan skema BFS} {K. Awal: V terdefinisi, yaitu simpul awal penelusuran} {K.Akhir: Semua simpul yang dikunjungi ditulis ke layar} Deklarasi: W:integer Q: Queue Deskripsi: write(V) dikunjungi[V]  true CreateQ(Q)

EnQueue(Q,V)

while not EmptyQ(Q) do DeQueue(Q,V)

for W  1 to N do if A[V,W] = 1 then

if not dikunjungi[W] then write(W) EnQueue(Q,W) dikunjungi[W]  true endif endif endfor endwhile

Algoritma 6.5. Penelusuran graf secara BFS Pemanggilan DFS dari program utama adalah sebagai berikut: Deklarasi:

dikunjungi: array[1..N] of boolean V, k: integer

for k  1 to N do dikunjungi[k]  false endfor

write (“Simpul awal”); read (V) BFS(V)

Algoritma 6.6. Contoh pemanggilan BFS dari program utama Soal Latihan

1. Diketahui graf G1 berikut:

A B

D E

F

(a) Himpunan simpul graf G1, V(G1) = (b) Himpunan sisi graf G1, E(G1) =

2. Diketahui graf G2 berikut: A 93 B C 14 47 D E 50 30 21

(a) Himpunan simpul graf G2, V(G2) = (b) Himpunan sisi graf G2, E(G2) =

3. Buat matriks ketetanggaan dari graf G1 dan graf G2 4. Buat senarai ketetanggaan dari graf G1 dan graf G2 5. Diketahui himpunan simpul dari graf G3 berikut:

V(G3) = {X, Y, Z, W}

E(G3) = {(X,Y), (X,Z), (Z,Z), (Z,W)} Gambarkan graf G3

6. Tuliskan urutan simpul jika graf G1 dikunjungi secara DFS mulai dari simpul A

7. Tuliskan urutan simpul jika graf G2 dikunjungi secara BFS mulai dari dari simpul A.

BAB 7

POHON PENCARIAN BINER

Dalam dokumen BAB 1 PENGANTAR KE STRUKTUR DATA (Halaman 62-80)

Dokumen terkait