Struktur Data & Introduksi List Linier · Web viewContoh : Ms. Word, Ms. Excel, Lotus, Corel Draw,...

104
BAB I PENGENALAN KOMPUTER 1.1 Pengenalan Sistem Komputer 1. Perangkat Keras (Hardware) Perangkat keras adalah komponen-komponen fisik dari suatu sistem komputer. peragkat keras dapat dikategorikan menjadi 4 bagian yaitu peralatan masukan (input), pemroses (CPU), penyimpan (memory) dan keluaran (output). 2. Perangkat Lunak (Software) Perangkat lunak adalah program yang terdiri dari instruksi- instruksi apa yang harus dilakukan oleh perangkat keras (hardware). Instruksi ini ditulis oleh pembuat program dilakukan dengan menggunakan suatu bahasa pemrograman tertentu. Sebenarnya komputer hanya mengenal sinyal elektronik, yang dalam kode biner diwakili dengan nilai 1 dan 0. demikian juga seharusnya instruksi-instruksi yang ditulis harus dalam bentuk bilangan biner supaya dapat dimengerti oleh komputer. Akan tetapi hal ini sangat sulit dan akan membuat prustasi seorang pemrogram (bahasa assembler). Untuk mengatasi hal ini, maka instruksi-instruksi dapat dibuat dengan suatu bahasa pemrograman. Bahasa inilah yang akan menterjemahkan instruksi pemrogram menjadi bahasa mesin yang dapat dimengerti oleh komputer. Bahasa pemrograman tersebut dikenal dengan nama language software. Program yang ditulis oleh pemrogram komputer bertujuan memecahkan suatu masalah tertentu disebut dengan perangkat lunak aplikasi (application software). Perangkat lunak dapat dikategorikan menjadi tiga bagian, yaitu : Perangkat lunak Sistem Operasi (operating system), yaitu progam yang ditulis untuk mengendalikan dan mengkoordinasikan kegiatan dari sistem komputer. Contoh : DOS, NT, Unix, Novell Netware, Windows. Perangkat lunak bahasa (language software), yaitu program yang digunakan untuk menterjemahkan instruksi-instruksi yang ditulis dalam bahasa pemrograman kedalam bahasa mesin 1

Transcript of Struktur Data & Introduksi List Linier · Web viewContoh : Ms. Word, Ms. Excel, Lotus, Corel Draw,...

BAB I PENGENALAN KOMPUTER

1.1 Pengenalan Sistem Komputer

1. Perangkat Keras (Hardware)

Perangkat keras adalah komponen-komponen fisik dari suatu sistem komputer. peragkat keras dapat dikategorikan menjadi 4 bagian yaitu peralatan masukan (input), pemroses (CPU), penyimpan (memory) dan keluaran (output).

2. Perangkat Lunak (Software)Perangkat lunak adalah program yang terdiri dari instruksi-instruksi apa yang harus dilakukan oleh perangkat keras (hardware). Instruksi ini ditulis oleh pembuat program dilakukan dengan menggunakan suatu bahasa pemrograman tertentu. Sebenarnya komputer hanya mengenal sinyal elektronik, yang dalam kode biner diwakili dengan nilai 1 dan 0. demikian juga seharusnya instruksi-instruksi yang ditulis harus dalam bentuk bilangan biner supaya dapat dimengerti oleh komputer. Akan tetapi hal ini sangat sulit dan akan membuat prustasi seorang pemrogram (bahasa assembler). Untuk mengatasi hal ini, maka instruksi-instruksi dapat dibuat dengan suatu bahasa pemrograman.Bahasa inilah yang akan menterjemahkan instruksi pemrogram menjadi bahasa mesin yang dapat dimengerti oleh komputer. Bahasa pemrograman tersebut dikenal dengan nama language software. Program yang ditulis oleh pemrogram komputer bertujuan memecahkan suatu masalah tertentu disebut dengan perangkat lunak aplikasi (application software).Perangkat lunak dapat dikategorikan menjadi tiga bagian, yaitu :

Perangkat lunak Sistem Operasi (operating system), yaitu progam yang ditulis untuk mengendalikan dan mengkoordinasikan kegiatan dari sistem komputer. Contoh : DOS, NT, Unix, Novell Netware, Windows.

Perangkat lunak bahasa (language software), yaitu program yang digunakan untuk menterjemahkan instruksi-instruksi yang ditulis dalam bahasa pemrograman kedalam bahasa mesin supaya dapat dimengerti oleh komputer. Contoh : Pascal, Visual Basic, Delphi,Foxpro, C++, C#.

Perangkat lunak aplikasi (application software), yaitu program yang ditulis dan diterjemahkan oleh language software untuk menyelesaikan suatu aplikasi tertentu. Contoh : Ms. Word, Ms. Excel, Lotus, Corel Draw, Internet Explorer.

3. Pengguna (Brainware)Pengguna adalah orang-orang yang membuat program atau sekedar menggunakan program. Pengguna dapat dikategorikan antara lain : operator, pemrogram, analis sistem, administrator.

System analis adalah orang yang mempelajari, menganalisa dan mendesain suatu proyek aplikasi dari user serta membuat prosedur yang akan dilaksanakan didalam lingkungan Electronic Data Processing (PDE)

Programmer adalah mereka yang melakukan pekerjaan pembuatan program berdasarkan spesifikasi program dari sistem analis.

1

Operator adalah orang yang mengoperasikan komputer dan bertugas sebagai berikut:- Menghidupkan dan mematikan komputer- Mengaktifkan program yang dibutuhkan- Mempersiapkan media input, output dan peralatan lain yang dibutuhkan.

Hubungan antara perangkat lunak dengan perangkat keras dan pengguna komputer

Pengguna komputer mengoperasikan perangakat lunak untuk memerintahkan perangkat keras bekerja.

1.2 Paradigma Rekayasa Perangkat LunakSebelum kita membuat program sebaiknya megenal beberapa paradigma dalam menghasilkan suatu perangkat lunak atau yang dikenal dengan nama rekayasa perangkat lunak. Beberapa paradigma yang umum digunakan adalah :1. Daur Hidup Klasik (The Classic Life Cycle atau Waterfall), terdiri dari beberapa

tahapa seperti berikut :a. Pengumpulan kebutuhanb. Analisa kebutuhanc. Desaind. Pemrogramane. Pengujianf. Pemeliharaan

2

2. Prototipe (prototyping), terdiri dari beberapa tahap sebagai berikut :a. Pengumpulan kebutuhanb. Desain Cepatc. Bangun Prototiped. Evaluasi prototipee. Perbaikan prototipe, jika prototipe belum selesai ulang langkah bf. Produk perangkat lunak

3. Model Spiral, terdiri dari beberapa tahap seperti berikut :a. Perencanaan dan pengembanganb. Analisa resiko oleh pengembang dan pemesanc. Rekayasa perangkat lunakd. Evaluasi oleh pemesan, bila rekayasa perangkat lunak belum selesai ulangi

langkah a.

3

1.3 Algoritma dan Struktur DataSecara garis besar perangkat lunak atau biasa dikenal dengan nama ‘program’ terdiri dari kumpulan algoritma dan struktur data.PROGRAM = ALGORITMA + STRUKTUR DATAApakah kaitan antara algirtma dengan struktur data ? mengapa perlu mempelajari struktur data dan algoritma? Untuk labih jelasnya akan diperkenalkan istilah-istilah berikut.

1. AlgoritmaAlgoritma adalah deskripsi langkah-langkah penyelesaian masalah yang tersusun secara logis atau urutan logis pengambilan keputusan untuk pemecahan masalah.

Ditulis dengan notasi khusus Notasi mudah dimengerti Notasi dapat diterjemahkan menjadi sintaks suatu bahasa pemrograman.

Algoritma sebenarnya mirip dengan yang kita temui dalam kehidupan kita sehari-hari, misalnya resep makanan, resep kue, cara merawat kendaraan, dsb. Disana akan ditemukan langkah-langkah logis untuk penyelesaian suatu masalah. Bedanya, pada algoritma setiap langkah difokuskan pada sistem komputer atau data.Contoh :

Algoritma untuk mencari nilai maksimum pada sekumpulan data yang tiak terurut.

Algoritma untuk mengurutkan data, sehingga menjadi terurut (sorting) Algoritma untuk mencetak bilangan ganjil dari 1 sampai dengan 19, dll.

Hal-hal yang perlu diperhatikan dalam membuat algoritma adalah mencari langkah-langkah yang paling sesuai untuk pemecahan masalah, karena setiap algoritma mempunyai karakteristik tertentu yang memiliki kelebihan dan kekurangan. Beberapa hal yang perlu dipahami dalam mencari algoritma antara lain :

Masalah seperti apa yang hendak dilakukan ? Gagasan apa yang ada pada algoritma tersebut ? Berapa lama yang diperlukan untuk menyelesaikan masalah ? Berapa jumlah data yang dapat ditangani oleh algoritma tersebut ?

Untuk mengetahui seberapa besar kualitas suatu algoritma, biasanya dinyatakan dengan notasi-O besar (big O-notation). Notasi ini digunakan oleh ahli komputer untuk menyatakan kelas kekompleksian sesuatu algoritma.

2. Struktur DataDefinisiStruktur data adalah model logika / matematika yang secara khusus mengorganisasikan data. Sebuah model harus dapat mencerminkan keterhubungan data dengan dunia nyata dan bentuknya sederhana/efektif (dapat memproses data sesuai kebutuhan).Seiring perkembangan teknologi informasi, masalah-masalah yang harus diselesaikan dengan komputerisasi semakin besar dan konpleks. Dengan demikian analisis sistem maupun programmer dituntut untuk semakin profesional dalam mengimplementasikan masalah dalam sistem program yang dirancangnya.Beberapa masalah yang dihadapi dalam penyelesaian masalah dengan komputer adalah :1. Memahami secara menyeluruh hubungan elemen-elemen data yang relevan

terhadap solusi masalah2. Penentuan operasi-operasi yang dilakukan terhadap elemen-elemen data3. Perancangan metode representasi elemen-elemen data di memeory sehingga

memenuhi kriteria :a. Memenuhi hubungan logika antar elemen-elemen datab. Operasi terhadap elemen-elemen data dapat dilakukan secara mudah dan

efesien

4

4. Menentukan bahasa pemrograman untuk menerjemahkan solusi masalahIstilah-istilah dalam struktur data :Data : Nilai / kumpulan dataTipe data : Jenis data yang ditangani bahasa pemrogramanObjek data : Kumpulan elemen dataEntity : Sesuatu yang mempunyai atribut atau sifat tertentu dan

mempunyai harga (numerik/non numerik)Entity Set : Kumpulan entity dengan atribut yang samaInformasi : Data dengan atribut tertentu, sudah diproses dan mempunyai artiStruktur data : Model logika atau matematik dari organisasi data tertentu

Untuk membuat suatu objek data menjadi struktur data, ada beberapa proses yang harus dilakukan terhadap objek data tersebut antara lain :1. Mendeskripsikan kumpulan operasi yang diterapkan terhadap elemen-elemen

objek data2. Menunjukkan mekanisme kerja operasi-operasi

Struktur data berbeda dengan objek data, karena struktur data mendeskripsikan tiga hal, yaitu :1. Kumpulan objek data2. Operasi-operasi dasar terhadap objek data3. hubungan (relasi) antar objek data

jadi STRUKTUR DATA = Objek data + (Operasi/manipulasi)

Struktur data dapat dinyatakan sebagai triple (D,F,A) disingkat d, yaitu :1. Domain D,d D2. kumpulan fungsi F, yaitu kumpulan-kumpulan operasi terhadap anggota didalam

D3. Kumpulan Aksiom A, yaitu kumpulan relasi atau inverian yang dipenuhi oleh

anggota di domain D

Tujuan Pembentukan Struktur DataTujuan Pembentukan Struktur data adalah sebagai information hiding encapsulation, yaitu :1. Perubahan implementasi struktur data tidak mengubah program yang

menggunakan struktur data bila interface cara panggil terhadap prosedure dan fungsi pada struktur data itu telah dirancang secara bagus sehingga tidak berubah.

2. Pemakaian dan pembuatan struktur data dapat dilakukan secara terpisah yang hanya perlu kesepakatan mengenai interface pemakaian struktur data.

3. Struktur data merupakan sarana pemrograman modular dan menjadi landasan terbentuknya tim pemrograman

Operasi-Operasi dalam Struktur Data :1. Traversing : Mengunjungi record tepat satu kali2. Searching : Menemukan lokasi record dengan kunci tertentu atau

menemukan lokasi semua record yang memenuhi satu kali / lebih

3. Inserting : Menambah record baru ke struktur4. Deleting : Menghapus record baru dari struktur5. Sorting : Menyusun recor dalam urutan tertentu6. Margening : Menggabungkan dua file terurut menjadi dua file terurut7. Updating : Mengganti item di record dengan data baru

5

Terdapat dua jenis struktur data, yaitu : Struktur data statis – yaitu struktur data yang tidak berubah, seperti array / larik,

record, himpunan Struktur data dinamis – yaitu struktur data yang berubah, seperti list / senarai,

queue / antrian / giliran, stack / tumpukan. Beberapa jenis struktur data telah disediakan pada bahasa pemrograman ( bahasa pascal), yaitu struktur data Array, set, record, string, int, dll. Serta struktur data lainnya yang belum ada dapat dibentuk sendiri misalnya struktur data LIST BERKAIT / SENERAI, STACK, QUEUE, TREE, GRAF.

Contoh-contoh struktur data :1. Array

Array adalah struktur data yang diproses melalui indeksnya. Struktur data ini termasuk yang paling mudah digunakan. Ada yang terdiri darti satu dimensi (array linier), dua dimensi (matriks) dan multidimensi.

Contoh array A dengan delapan indeks sebagai berikut :

Array A satu dimensi :8 indeks (1 /sd 8) dan data 1, 7, 18, dsb.

1 7 18 03 69 24 08 70

1 2 3 4 5 6 7 8

2. Link ListLink list adalah struktur data yang diproses melalui alamat kepala (awal). Info adalah tempat untuk datanya, Next adalah untuk menyimpan alamat berikutnya. Struktur ini merupakan struktur data dinamis dimana ukurannya boleh berubah (bertambah) pada saat ekseskusi program.

3. TreeTree adalah struktur data yang diproses melalui alamat akarnya (root) struktur ini merupakan struktur data dinamis dimana ukurannya boleh berubah. Atanya mempunyai hubungan hirarki di antara elemennya.

4. Stack

6

Struktur data ini diproses (penambahan dan penghapusan data) hanya pada satu ujung yaitu pada posisi TOP-nya. Struktur data ini menggunakan sistem LIFO (Last In First Out)

5. QueueStruktur data ini diproses dari dua ujung, penambahan pada posisi belakang sedangkan penghapusan pada posisi depan. Struktur data ini menggunakan sistem FIFO (First In First Out). Contoh : queue pembelian karcis di loket.

6. Graf Struktur data graf mirip dengan struktur data tree, hanya saja hubungan antara data tidak selalu hubungan hirarki. Contoh : jalan yang menghubungkan beberapa kota misalnya S, Y, T S

Soal Latihan :1. Sebutkan bebrapa contoh perangkat keras beserta kategorinya !2. Sebutkan bebeapa contoh perangkat lunak beserta kategorinya !3. Apa yang dikerjakan oleh seorang operator, pemrogram, analis sistem dan

administrator ?4. Apa keuntungan pembuatan perangkat lunak bila menggunakan paradigma

rekayasa perangkat lunak yang benar, dibandingkan tanpa menggunakan paradigma (Sekedar membuat program) ?

5. Apa yang dimasud dengan Algoritma dan Struktur Data ? berikan beberapa contoh !

7

BAB II ARRAY DAN MATRIKS [LARIK]

2.1 Definisi ArrayArray / larik adalah struktur data yang mengacu pada sebuah / sekumpulan elemen yang di akses melalui indeks. Setiap elemen array dapat diakses melauli indeksnya, misalnya mengisi elemen array yang ke 3 dengan nilai 100, maka cara mengisinya adalah A[3] 100. contoh array bernama A dengan 8 buah elemen dapat dilihat pada gambar berikut ini :

A

1 2 3 4 5 6 7 8

Elemen array : A[1], A[2], A[3], A[4], A[5], A[6], A[7], A[8]

Indek array : 1 2 3 4 5 6 7 8 Mengisi elemen array : A[3] 100

Keuntungan struktur data array :- paling mudah pengoperasiannya- ekonomis dalam pemakaian memory, bila semua elemen terisi- akses kesetiap elemen memerlukan waktu yang sama

Kerugiannya :- Memboroskan tempat jika banyak elemen yang tidak digunakan

2.2 Kamus Data ArraySebelum elemen array dapat digunakan, perlu didefinisikan dahulu pada kamus data sebagai berikut :

KAMUSNama: array [1..400] of string {array dengan tipe data string}Panjang : array [a..e] of real {array dengan tipe data real}Type TITIK : record <X:real, Y:real>Kurva: array[0..30] of Titik {array dengan tipe data record}

Yang perlu diingat bahwa :1. elemen array harus memiliki tipe data yang sama atau sejenis (homogen), seperti

integer, real, char, string, boolean, record. Artinya array tersebut didefinisikan sebagai integer maka nilai yang boleh masuk kedalam elemen array harus bertipe integer.

2. indeks array harus memiliki tipe data yang menyatakan keterurutan, seperti integer atau karakter.

2.3 Pemrosesan ArrayAda beberapa pemrosesan yang dapat dilakukan terhadap array. Algoritma yang paling mudah untuk melakukan pemrosesan yaitu dengan menggunakan bentuk perulangan For-To-Do, dengan alasan bahwa elemen array memiliki indeks yang berturut. Berikut adalah satu pola untuk memproses array :

8

KAMUSCons : N=10 {jumlah elemen array}Indeks : integerA : array[1..N] of integer {deklarasi array A dengan tipe integer}

ALGORITMAFor Indeks 1 to N do

PROSES ARRAYEndFor

Proses array bisa diganti dengan proses lainnya, misalnya : Mengisi elemen array dengan 0 (inisialisasi) Mengisi elemen array dengan piranti masukan Mencetak elemen array ke piranti keluaran

Proses array dapat dimodifikasi untuk proses berikut, misal : Mencari bilangan maksimum /minimum pada array Menjumlahkan nilai seluruh elemen array Membuat rata-rata nilai seluruh elemen array Mencari nilai tertentu pada array

Berikut beberapa contoh pemrosesan array :

1. Menginisialisasi array : mengisi semua elemen array dengan harga awal (biasanya dengan harga 0)

Program INISIALISASIKAMUS

Cons : N=10 {jumlah elemen array}Indeks : integerA : array[1..N] of integer {deklarasi array A dengan tipe integer}

ALGORITMAFor Indeks 1 to N do

A[Indeks] 0 {proses inisialisasi}EndFor

Supaya algoritma inisialisasi berlaku umum untuk semua array, dapat disajikan procedure degan parameter input/output seperti berikut :

Procedure INISIALISASI (input / output A : Larik, input N : integer){menginisialisasi setiap elemen array A dengan nol}{IS :A array dengan jumlah N buah}{FS : Seluruh elemen array A berharga nol}

KAMUS LOKAL Indeks : IntegerALGORITMA For Indeks 1 to N do A[Indeks] 0 EndFor

2. Mengisi elemen array dari piranti masukan

9

Program Mengisi_elemenKAMUS

Cons : N=10 {jumlah elemen array}Indeks : integerA : array[1..N] of integer {deklarasi array A dengan tipe integer}

ALGORITMAFor Indeks 1 to N do

Input A[Indeks] {jika ingin mencetak ganti dengan output}EndFor

2.4 Panjang ArrayStruktur array biasanya mudah untuk dikunjungi (travers), dicari (search), diurutkan (sort) dan sering digunakan untuk menyimpan kumpulan data yang permanen. Akat tetapi ukuran data yang didalam struktur selalu berubah, maka struktur data Link List akan lebih berguna.Array Linier yaitu kumpulan terhingga elemen data homogen (jenis sama) yang terdiri atas :

a. Elemen array dinyatakan dengan indeks berupa n buah bilanganb. Elemen array disimpan dalam memory pada lokasi yang berhimpitan

Bilangan n menyatakan ukuran data array.Untuk mengetahui panjang elemen suatu array dapat dihitung dengan rumus sebagai berikut :

Panjang (L) = UB – LB + 1dimanaUB = upper bound (indek terbesar)LB = lower bound (indek terkecil)

Atau

L = BA – BB + 1Ket : L = Banyaknya Elemen array

BB = Batas BawahBA = Batas AtasJika BB = 1 L = BA

1 BB234

n BA

Contoh :

10

indeks Elemen array

1. Jika DATA adalah array dengan 6 elemen, yaitu : DATA[1] = 247, DATA[2] = 56, DATA[3] = 429, DATA[4] = 135, DATA[5] = 87, DATA[6] = 156. Digambarkan sebagai berikut :

2. Seorang pedagang mobil menggunakan array untuk menyimpan data penjualan dari tahun 1994 sampai tahun 2005. berapa panjang (jumlah elemen) array yang harus disediakan ?

LB = 1994UP = 2005Jadi pajang = UB – LB + 1 = 2005 – 1994 + 1 = 12

Artinya jumlah elemen array yang diperlukan adalah sebanyak 13 buah, untuk pendefinisian array tersebut sebagai berikut :

Kamus JUAL : array [1994..2005] of integer

3. Perusahaan mobil menggunakan array AUTO untuk merekam banyaknya penjualan setiap tahun dari 2000 sampai 2005. Array tersebut bisa tidak dimulai dari 1, tatapi dari 2000 sehingga AUTO[K] = banyaknya mobil terjual pada tahun K.Dari perusahaan tersebut dapat disimpulkan :BB = 2000, BA = 2005, sehingga L = BA – BB+1

= 2005 – 2000+1 = 6

Jadi array AUTO terdiri dari 6 elemen dan indeksnya mulai dari 2000 sampai 2005.Jika array tersebut didefinisikan dalam bahasa pemrograman menjadi :Var DATA : ARRAY[1..6] OF REAL; AUTO : ARRAY[2000..2005] OF INTEGER;Selanjutnya kita akan menulis array semacam itu sebagai :

AUTO (2000 : 2005)Beberapa bahasa pemrograman menyediakan tempat dimemory untuk array secara statik, selama kompilasi program. Ukuran dari array adalah tetap selama program dilaksanakan. Beberapa bahasa pemrograman yang lain membolehkan untuk membaca harga n, kemudian menyatakan suatu array dengan n elemen yang dialokasikan secara dinamik.

2.5 Pengalamatan Array dalam Memory

11

DATA

247 56 429 135 87 156

1 2 3 4 5 6

DATA

1 247

2 56

3 429

4 135

5 87

6 156

Penyimpanan elemen array di dalam memeory komputer disusun berurutan sehingga komputer tidak perlu menentukan setiap elemen array tetapi cukup menyimpan alamat awal / pertama. Berikut cara menetukan alamat elemen array dengan indeks tertentu :

LOK(LA[K]) = Awal (LA) + W(K-LB)

Dimana :LOK(LA[K]) = lokasi elemen array dengan indeks K yang dicariK = indeks array yang dicariAwal (LA) = lokasi awal dari arrayW = jumlah byte untuk menyimapn 1 elemen arrayLB = lower bound / batas bawah

Contoh :Misalkan Awal (JUAL) = 100 dan W = 4, makaLOK(JUAL[1994]) = 100LOK(JUAL[1995]) = 104LOK(JUAL[1996]) = 108

Berapa lokasi JUAL[2005] ?Untuk mendapatkan lokasi tersebut sebagai berikut :

LOK(LA[K]) = Awal(LA) + W(K-LB) = 100 +4*(2005-1994) = 140

Dalam contoh 3 diatas, misalkan tampak dimemory sebagai berikut :BASE(AUTO)=200, W=4, AUTO[2000] makaLOC(AUTO[2000]) = 200LOC(AUTO[2001]) = 204LOC(AUTO[2002]) = 208

Dan untuk mencari alamat AUTO[2004] dapat dicari dengan rumus :LOC(AUTO[2004]) = BASE(AUTO) + W (K-BB)

= 200 + 4 (2005 – 2000)= 200 + 4 (5)= 200 + 20= 220

Dan elemen ini bisa didapatkan tanpa harus membaca elemen lain.

Soal :1. Terdapat data penjualan barang X dari tahun 1990 – 2000 yang dinyatakan

dalam array JUAL[1990] .. JUAL[2000]. Tentukan banyaknya elemen data dalam array JUAL tersebut !L = 2000 – 1990 + 1 = 11

2. Terdapat data perhitungan penduduk, berdasarkan sensus dari tahun 1956 sampai 1999,

12

200201202203204205206207208

a. Tentukan banyaknya elemen data dalam array SENSUS !L = 1999 – 1956 + 1 = 44

b. Tentukan lokasi dari data 1977, sehingga dapat diketahui SENSUS[1977] !LOC(LA[K]) = alamat dari elemen LA[K] dalam array LABASE(LA) = alamat Dasar dari LAW = Word per sel memori = 4 (default)BB = Batas BawahBA = Batas AtasMisal BASE(SENSUS) = 10LOC(SENSUS[K]) = BASE[SENSUS] + W (K – BB)

= 10 + 4 (1977 – 1956) = 10 + 4 (21) = 10 + 84 = 94

3. Diketahui array seperti dibawah ini :X[-5:5 , 3:33] Y[3:10, 1:15, 10:20]

a. Tentukan panjanga dimensinya dan banyak elemen masing-masing X dan Y !

X[-5:5 , 3:33] Y[3:10, 1:15, 10:20]Array X L1 = (5 – (-5) + 1

= 11L2 = 33 – 3 + 1

= 31Jadi elemen X = 11 . 31

= 143 elemens

Array Y L1 = 10 – 3 + 1 = 8

L2 = 15 – 1 + 1 = 15

L3 = 20 – 10 + 1 = 11

Jadi elemen Y = 8 . 15 . 11 = 1320 elemens

Jika BASE[Y]=400 dan W=4 word pers lokasi memory.Tentukan indikaso efektive E1, E2, E3 dan alamat dari Y[5, 10, 15], dengan asumsi :(i). Y disimpan dalam row-major order(ii). Y disimpan dalam colom-major order

E1 = K1 – LB E2 = K2 – LB E3 = K3 – LB = 3 – 5 + 1 = 1 – 10 + 1 = 10 – 15 + 1

= -1 = - 8 = - 4

2.6 Traversing (Pengunjungan Array)Operasi traversing array dapat dilakukan untuk memproses data yang ada didalam memori. Misalkan di memori kita mempunyai kumpulan elemen data A dan akan mencetak seluruhnya atau ingin menghitung banyaknya elemen A dengan sifat tertentu setiap elemen tepat satu kali.

Algoritma berikut ini bisa digunakan :

13

K := BB WHILE K BA atau FOR K = BB TO BADO WRITE LA[K]

WRITE LA[K] EXITK := K + 1

EWHILE EXIT

Contoh:Dari Array AUTO : a. Cari tahun NUM (Jumlah) tempat data mobil yang terjual lebih dari

300 disimpan NUM := 0FOR K= 2000 TO 2005 IF AUTO[K] > 300 THEN WRITE AUTO[K] NUM:=NUM + 1EXIT

b. Cetak setiap tahun dan jumlah mobil yang terjualFOR K = 2000 TO 1984

WRITE K, AUTO[K]EXIT

2.7 Menyisipkan Dan Menghapus ArrayMisalkan A adalah kumpulan elemen data di memori komputer;Menyisipkan adalah operasi untuk menambahkan elemen array lain ke A.Menghapus adalah operasi untuk menghilangkan salah satu elemen A.Untuk menyisipkan sebuah elemen pada akhir array mudah dilakukan dengan menyediakan tempat di memori yang cukup besar untuk menenpatkan elemen tambahan tersebut. Penyisipan pada bagian tengah array, separuh elemen harus digeser kebawah pada lokasi baru. Sedangkan bagian yang lain tetap.Dengan cara yang sama, menghapus ujung elemen array yang terakhir tidak ada kesulitan, tetapi setelah menghapus array yang berada ditengah memerlukan operasi pergeseran data dari lokasi bagian bawah ke lokasi bagian atasnya (ke sub-script yang lebih kecil).

Contoh :1. Misalnya TES didefinisikan sebagai array dengan 5 lokasi memori, tetapi hanya

terdapat 3 data yang tersimpan pada TES[1], TES[2], TES[3]. Bila X adalah nilai untuk TES[4] dan TES[5] akan ditambahkan elemen lagi. Sekarang array telah penuh dan tidak dapat menambahkan elemen baru ke memori.

2. Misalkan ada array NAM dengan 8 lokasi memori yang berisi 5 elemen urut menurut abjad.

a. Rita akan disisipb. Tono akan disisipc. Dul akan dihapus

14

NAMA1 Bita2 Dul3 Jono4 Sarip5 Wito678

NAMA1 Bita2 Dul3 Jono4 Rita5 Sarip6 Wito78

NAMA1 Bita2 Dul3 Jono4 Rita5 Sarip6 Tono7 Wito8

NAMA1 Bita2 Jono3 Rita4 Sarip5 Tono6 Wito78

Algoritma yang digunakan untuk menyisipkan elemen data DATA ke posisi ke-K pada array LA dengan N elemen, empat langkah pertama menyediakan ruang di LA dengan menurunkan satu posisi setiap elemen dari posisi ke-15, yang dilakukan mulai dari L[N], L[N-1].

INSERT (LA, N, K, ITEM)J := NWHILE J KDO

LA[J+1] := LA[J] LA[J] := LA[J-1] J := J-1

EWHILE Ket :LA[K] :=ITEM K = Elemen array yang ditentukanN := N+1 J = Jumlah elemen array

Algoritma untuk menghapus elemen ke-K dari array ITEMDELETE (LA, N, K, ITEM)ITEM := LA[K]FOR J := K TO N-1LA[J] := LA[J+1]N := N-1

2.8 Sorting ArrayElemen suatu array A dapat disusun lagi sehingga tersusun menaik (ascending) atau menurun (descending). Algoritma untuk menyusun array menaik (ascending) adalah sebagai berikut :

A[1] < A[2] < A[3] < … < A[N]Algoritma untuk menyusun array menurun (descending) adalah sebagai berikut :

A[1] > A[2] > A[3] > … > A[N]

Contoh :Jika susunan elemen suatu array adalah sebagai berikut : 8, 4, 19, 2, 7, 13, 5, 16setelah diurutkan menjadi : 2, 4, 5, 7, 8, 13, 16, 19

Bubble SortAlgoritma “bubble sort” bekerja sebagai berikut :Langkah ke-1

Bandingkan A[1] dengan A[2] dan susun sehingga A[1] < A[2] Bandingkan A[2] dengan A[3] dan susun sehingga A[2] < A[3] Bandingkan A[n-1] dengan A[n] dan susun sehingga A[n-1] < A[n] setelah

(n-1) kali perbandingan, A[n) akan merupakan elemen terbesar peratama terurut.

Langkah ke-2 Ulangi step 2 sampai kita telah mebandingkan dan kemungkinan

menyusun A[n-2], A[n-1]. Setelah (n-2) perbandingan, (n-1) akan merupakan elemen terbesar kedua.

Dst

Langkah ke(n-1) Bandingkan A[1] dengan A[2] dan susun sehingga A[1] < A[2] sesudah (n-1) langkah, array akan tersususn dalam urutan naik.

Contoh :

15

Sebuah array sebagai berikut :

D[1] D[2] D[3] D[4] D[5]30 60 5 25 50

Step 1 : Step = K – 1 = 5 – 1= 4 D[1] > D[2] T

30 60 5 25

50

D[2] > D[3] Y

30 5 60 25 50

D[3] > D[4] YD[1] D[3] D[4] D[2] D[5]30 5 25 60 50

D[4] > D[5] Y

30 5 25 50 60

Step 2 : D[1] > D[2] Y

5 30 25 50 60

D[2] > D[3] Y

5 25 30 50 60

D[3] > D[4] Y

5 25 30 50 60 D[4] > D[5] Y

5 25 30 50 60

16

ALGORITMANYA :

BUBBLE (DATA,N)FOR K= 1 to N - 1 DO PTR : = 1 WHILE PTR <= N – K DO IF DATA [PTR] > DATA[PTR+1] THEN X:= DATA[PTR] DATA[PTR] := DATA[PTR+1] DATA[PTR+1] := X ENDIFPTR := PTR + 1EWHILE

Step 3 : D[1] > D[2] Y

5 25 30 50 60

D[2] > D[3] Y

5 25 30 50 60

D[3] > D[4] Y

5 25 30 50 60

D[4] > D[5] Y

5 25 30 50 60

Step 4 : D[1] > D[2] Y

5 25 30 50 60

D[2] > D[3] Y

5 25 30 50 60

D[3] > D[4] Y

5 25 30 50 60

D[4] > D[5] Y

5 25 30 50 60

2.9 Pencariana. Linier Search

ALGORITMADATA [N+1] := ITEM (yang ditentukan)LOC = 1WHILE DATA[LOC] <> ITEMDOLOC := LOC+1EWHILEIF LOC:=N+1 THENLOC:=NOL

17

b. Binary Search

ALGORITMABINARY (DATA, BB,BA,ITEM,LOC)BEG:=BBEND:=BAMID:=INT((BEG+END)/2)WHILE (BEG<=END) AND (DATA[MID]<>ITEMP)DOIF ITEM < DATA[MID] THENEND:=MID – 1ELSEBEG:=MID+1EWHILEIF DATA[MID] = ITEM THENLOC:=MIDELSELOC:=NOLENDIF

2.10 Definisi MatriksMatriks adalah array dua dimensi adalah struktur data yang mengacu pada sebuah / sekumpulan elemen yang diakses melalui indeks. Berbeda dengan array linier, pada matriks indeks terdiri dari dua bagian yaitu indeks baris dan indeks kolom. Setiap elemen matriks dapat diakses melalui indeksnya.

A 1 a b c 2 d e f

1 2 3

Elemen matriks : A[1,1], A[1,2], A[,3], A[2,1], A[2,2], A[2,3],Indeks baris dari martiks A : 1, 2Indeks kolom dari matriks A : 1, 2 , 3Mengisi elemen matriks : A[2,1] 100

Keuntungan struktur data matriks : Paling mudah dioperasikan Ekonomis dalam pemakaian memory, bila semua elemen terisi Akses ke setiap elemen memerlukan waktu yang sama

Kerugian : Memboroskan tempat jika elemen banyak yang kosong

2.11 Kamus Data MatriksSebelum elemen matriks dapat dipergunakan perlu didefinisikan dahulu kamus data sebagai berikut :

KAMUSA : aray [1..2, 1..3] of string { ukuran matriks 2x3 bertipe stringNilai : array [1..50, 1..4] og real Type Wakru : Record < JJ : Integer[0..23] MM : integer[0..59]

18

DD : integer[0..59]>Absensi : array[1..100, 1..2] of waktu

2.12 Pemrosesan MatriksAda beberapa pemrosesan yang dilakukan terhadap matriks. Algoritma yang paling mudah untuk melakukan pemrosesan yaitu dengan menggunakan for-to-do, dengan alasan bahwa elemen matriks memiliki indeks yang terurut. Pemrosesan matriks dapat dilakukan dengan dua cara, yaitu :

Matriks diproses baris demi baris (Row Ordering) Matriks diproses kolom demi kolom (Column Ordering)

Pola pemrosesan matriks :

Program prosesKAMUSCons : M = 2Cons : N = 3Baris, Kolom : integerA : array [1..M, 1..N] of integer

ALGORITMA 1For Baris 1 to M do For Kolom 1 to N do PROSES MATRIKS EndforEndfor

ALGORITMA 2For Kolom 1 to N do For Baris 1 to M do PROSES MATRIKS EndforEndfor

Pada kedua algoritma tersebut memiliki pola yang sama, untuk pemrosesan baris demi baris “For Baris” lebih dahulu diikuti “For Kolom”, sedangkan pada kolom demi kolom kebalikannya. Proses matriks bisa diganti dengan proses lainnya misalnya :

Mengisi elemen matriks dengan nol Mengisi elemen matriks dari piranti masukan Mencetak elemen matriks ke piranti keluaran

Proses matriks dapat dimodifikasi sebagai berikut : Menjumlahkan nilai pada setiap baris Membuat rata-rata pada setiap baris atau kolom Mencari nilai tertentu pada matriks Menjumlahkan atau mengurangkan dua buah matriks Mengalikan dua buah matriks

Beberapa contoh pemrosesan matriks :1. Menginisialisasi matriks

Program inisialisasiKAMUSCons : M = 2Cons : N = 3Baris, Kolom : integerA : array [1..M, 1..N] of integer

ALGORITMA For Baris 1 to M do

19

For Kolom 1 to N do A[Baris,Kolom] 0 {baris demi baris} EndforEndfor

2. Mengalikan dua buah matriks

Program proses{matriks A[M,P], B[P,N] dan hasil perkalian disimpan pada matriks C[M,N])KAMUSConst : M = 2Const : N = 3Const : P = 2Baris, Kolom, K : integerA : array [1..M, 1..P] of integerB : array [1..P, 1..N] of integerC : array [1..M, 1..N] of integer

ALGORITMA For Baris 1 to M do For Kolom 1 to N do C[Baris,Kolom] 0 For K 1 to P do C[Baris,Kolom] C[Baris,Kolom] + A[Baris,K] + B[K, Kolom] Endfor EndforEndfor

3. Menjumlahkan dua buah matriks

Program prosesKAMUSConst : M = 2Const : N = 3Baris, Kolom : integerA,B,C : array [1..M, 1..N] of integer

ALGORITMA For Baris 1 to M do For Kolom 1 to N do C[Baris,Kolom] A[Baris,Kolom] + B[Baris, Kolom] EndforEndfor

2.13 Pengalamatan MatriksPenyimpanan elemen matriks dalam memori komputer disusun berurutan, sehingga komputer tidak perlu menentukan setiap elmen matriks tetapi cukup menyimpan alamat awal/pertama. Ada dua cara pengalamatan /penyimpanan elemen matrisks di dalam komputer, yaitu :

Row major order (disimpan baris demi baris) Column major order (disimpan kolom demi kolom)

Contoh matriks segitiga A dengan ukuran 2 x 3 :

1 2 3

20

1 A[1,1] A[1,2] A[1,3]

2 A[2,1] A[2,3] A[2,3]

Urutan lokasi penyimpanan matriks A dalam komputer adalah : A[1,1], A[1,2], A[1,3], A[2,1], A[2,2], A[2,3] jika row major A[1,1], A[2,1], A[2,1], A[2,2], A[3,1], A[3,2] jika column major

Untuk lebih jelasnya perhatikan ilustrasi penyimpanan didalam komputer secara :

ROW MAJOR COLUMN MAJOR

X[1,1] Baris ke-1 Kolom ke-1 A[1,1]

X[1,2] Baris ke-1 Kolom ke-1 A[2,1]

X[1,3] Baris ke-1 Kolom ke-2 A[2,1]

X[2,1] Baris ke-2 Kolom ke-2 A[2,2]

X[2,2] Baris ke-2 Kolom ke-3 A[3,1]

X[2,3] Baris ke-2 Kolom ke-3 A[3,2]

Berikut cara menentukan lokasi / alamat elemen matriks dengan indeks tertentu : Mencari lokasi pada row-major order

LOC(A[B,K]=Base(A) + W[N(B-1) + (K-1)) Mencari lokasi memory pada column-major order

LOC(A[B,K]=Base(A) + W[M(K-1) + (J-1))

Ket :Base (A) : lokasi awal di memori (alamat A[1,1])W : jumlah word/byte untuk menyimpan 1 elemenM : jumlah baris pada matriks AN : jumlah kolom pada matriks A

Ada cara lain untuk menentukan lokasi sebuah elemen matriks, bila rumus tersebut sukar untuk diingat. Perhatikan contoh berikut :X[1,1] = 400Lebar (W=width) : 1 elemen = 4 byteMaka alamat setiap elemen jika pengalamatannya dengan ROW MAJOR adalah :

1 2 3 4 5 6

1400

404 408 412 416 420

2 424 428 …

3 4484 …5

21

Alamat elemen pertama

678

Berapa alamat X[3,5] ? jawabnya adalah 400 + (16 * 4) = 400 + 64 = 464Angka 16 didapat dari jumlah locatan dari X[1,1] ke X[3,5]

Berapa alamat X[8,6] ? jawabnya adalah 400 + (47 * 4) = 400 + 188 = 588Angka 47 didapat dari jumlah locatan dari X[1,1] ke X[8,6]

X[1,1] = 400Lebar (W=width) : 1 elemen = 4 byte

Maka alamat setiap elemen jika pengalamatannya dengan COLUMN MAJOR adalah :

1 2 3 4 5 61 400 432 464 …2 404 436 …3 408 …4 4125 4166 4207 4248 428

Berapa alamat X[3,5] ? jawabnya adalah 400 + (34 * 4) = 400 + 136 = 536Angka 34 didapat dari jumlah locatan dari X[1,1] ke X[3,5]

Berapa alamat X[8,6] ? jawabnya adalah 400 + (47 * 4) = 400 + 188 = 588Angka 47 didapat dari jumlah locatan dari X[1,1] ke X[8,6]

22

BAB III STACK [TUMPUKAN]

3.1. Definisi StackStack (tumpukan) adalah list linier yang dikenali elemen puncaknya (TOP). Aturan penyisipan dan penghapusan elemennya tertentu, yaitu : penyisipan selalu dilakukan “di atas” TOP penghapusan selalu dilakukan pada TOP

TOP adalah satu-satunya alamat tempat terjadi operasi. Dengan kata lain, elemen yang ditambahkan paling akhir akan menjadi elemen yang pertama dihapus (LIFO / Last In First Out). Perhatikan gambar berikut ini :

Stack digunakan untuk merepresentasikan : pemanggilan prosedur perhitungan ekspresi aritmatika rekursivitas backtracking dan algoritma lanjut lainnya

3.2. Representasi LojikStack direpresentasikan secara lojik sebagai list linier dengan setiap elemennya adalah :

typedef struct TElmtStack{ InfoType Info; address Next;} ElmtStack;

InfoType adalah sebuah tipe terdefinisi yang menentukan informasi yang disimpan pada setiap elemen stack. Address adalah “alamat” dari elemen.

Jika P adalah sebuah address, maka terdapat selektor sebagai berikut : Info(P) adalah informasi yang disimpan pada alamat P Next(P) adalah alamat suksesor P

Stack kosong adalah stack dengan Top = NIL

23

3.3. Traversal dan SearchTraversal pada stack jarang dilakukan, karena keunikan stack yaitu operasi hanya dilakukan terhadap elemen TOP. Namun jika diperlukan traversal untuk mencetak isi stack, maka dapat dilakukan traversal seperti pada list linier biasa dengan mengganti First dengan Top.

Search hampir tidak pernah dilakukan pada stack, karena elemen yang diproses hanyalah elemen pada TOP.

3.4. Operasi dan Fungsi DasarDefinisi fungsional stack :

1. IsStackEmpty

int IsStackEmpty(address Top){ /* Test stack kosong : mengirim 1 jika stack kosong, dan 0 jika stack tidak kosong */

return(Top == NIL);}

2. CreateEmptyStack

void CreateEmptyStack(address *Top){ /* I.S. sembarang F.S. sebuah stack yang kosong siap dipakai, terdefinisi

Membuat stack kosong */

*Top = NIL;}

3. Push

void Push(address *Top, InfoType X){ /* I.S. Stack mungkin kosong, X terdefinisi (terdefinisi informasinya) F.S. Info(Top) = X

Menambahkan sebuah elemen X pada TOP sebuah stack */ address P;

// Alokasi P; dimana Info(P) = X

Next(P) = *Top; // insert sebagai elemen pertama *Top = P;}

4. Pop

void Pop(address *Top, InfoType *X){ /* I.S. Stack tidak kosong F.S. X adalah info dari elemen TOP

Menghapus elemen stack yang tidak kosong, stack mungkin menjadi Kosong */

24

address P;

P = *Top; *Top = Next(P); Next(P) = NIL;

*X = Info(P); // Dealokasi P}

3.5. Representasi Fisik KontiguStack direpresentasikan dengan sebuah tabel [0..NMax]. Perhatikan gambar berikut ini :

Perhatikan struktur stack berikut ini :

// Definisi sebuah stack dengan representasi kontigu

#define NMax 99#define NIL -1 // alamat tak terdefinisi

typedef int address; // -1 untuk stack yang kosong : TOP = NIL

typedef ... InfoType; // tipe info terdefinisi

// di dalam main address Top;InfoType TabElmt[NMax + 1];

Sedangkan penulisan untuk : Info(P) menjadi TabElmt[P] Next(P) menjadi P - 1

Stack adalah kumpulan elemen-elemen data yang disimpan dalam satu lajur linier. Kumpulan elemen data hanya boleh diakses pada satu lokasi saja yaitu pada posisi ATAS (TOP) stack. Stack digunakan dalam algoritma pengimbas (parsing), algoritma penilaian (evaluation) dan algoritma penjelajahan balik (backtrack). Elemen-elemen didalam stack dapat bertipe data integer, real, record dalam bentuk sederhan atau terstruktur.Stack tersebut juga “PUSH DOWN STACK” yaitu penambahan elemen baru (PUSH) dan penghapusan elemen dari stack (POP). Contoh pada PDA (Push

25

Down Automaton). Sistem pada pengaksesan pada stack menggunakan sistem LIFO (Last In First Out), artinya elemen yang terakhir masuk itu yang akan pertama dikeluarkan dari stack. Ilustrai stack dapat digambarkan seperti stack CD atau stack sate.Contoh stack kosong, stack dengan satu elemen dan stack dengan n elemen.

Atau Stack yaitu suatu list elemen dimana untuk menyisipkan dan menghapus satu elemen hanya bisa dilakukan pada satu ujung yang disebut “TOP” dari stack.Operasi pada stack : “PUSH” dan “POP”

Contoh :Misalnya 6 elemen kita tambahkan secara berurutan pada stack kosong. Yaitu A, B, C, D, E, F, maka stacknya adalah A, B, C, D, E, F dan dapat digambarkan sbb:

TOP

Ket : elemen yang paling kanan adalah elemen puncak (TOP), penyisipan dan penghapusan hanya terjadi pada TOP, artinya E tidak bisa dihapus sebelum F dihapus, D tidak bisa dihapus sebelum E dihapus, dst.Akibatnya elemen bisa dihapus dari stack hanya pada urutan terbalik dengan urutan waktu ditambahkan.Stack sering digunakan untuk menunjukkan urutan pemrosesan data ketika langkah-langkah tertentu dari pemrosesan harus ditunda sampai kondisi lain terpenuhi.Contoh :Suatu program utama A memanggil sub program B yang memanggil sub program C, dst.

Jika program / procedur tersebut dimasukkan kedalam stack, akan menjadi :

Ketika program A dilaksanakan, kontrol program akan berpindah ke procedure B yang diperlukan untuk bisa menyelesaikan pelaksanaan A, maka A disimpan di stack, B mulai dilaksanakan dan memerlukan procedure C, maka B disimpan B ke

26

Tumpukan kosong

TOP=0

Tumpukan 1 elemen

ATOP=1

Tumpukan n elemen

DCBA

TOP=N

A B C D E F1 2 3 4 5 6

Program A----------------B--------End.

Program B----------------C--------End.

Program C----------------D--------End.

Program D--------------------------------End.

ABA

CBA

BA A

stack diatas A, dan mulai memproses C yang juga perlu D dan C disimpan kestack. Jika D sudah selesai dilaksanakan maka diteruskan pelaksanaan C, bila C sudah selesai dilanjutkan pelaksaan B dan akhirnya pelaksanaan program A.

3.6. Kamus Data Sebelum struktur data ini bisa digunakan, harus dideklarsikan dahulu dalam bentuk kamus data. Ada beberapa cara mendeklarasikan struktur data ini, salah satunya adalah dengan menggunakan tata susunan linier (larik) dan sebuah variabel yang dikemas dalam tipe data record. Berikut ini pendeklarasian struktur data stack dalam kamus data :

Kamus DataConstMAKSTUM = 80; {kapasitas maksimal stack)TypeJenisElemen =char;Stack = record Elemen : array[1..MAKSTUM] of JenisELemen; Atas: 0..MAKSTUM;End;

Stack adalah struktur data bertipe rocord yang terdiri dari field elemen bertpie array dengan indeks dari 1 sampai dengan MaksTum, atas, bertipe integer berkisar dari 0 (kosong) sampai dengan MksTum.

3.7. Operasi Dasar pada StackOperasi yang sering diterapkan pada struktur data stack adalah Push dan Pop. Operasi dasar yang dapat diterapkan adalah sebagai berikut :a. CREATESTACK(S) : Membuat stack S, dengan jumlah elemenkosongb. MAKENULL (S) : Mengosongkan stack S, jika ada elemen maka semua

elemen dihapusc. EMPTY : Stack kosong ? menguji apakah stack kosong.d. PUS (x,S) : memasukkan elemen baru x kedalam stack Se. POP (S) : mengeluarkan elemen posisi atas pada stack S

Ilustrasi operasi POP dan PUSH terhadap stack.OPERASI ISI STACK NILAI TOP

1 CREATESTACK(S) :<kosong> 02 PUSH(’a’,S) :a 13 PUSH(’b’,S) :a b 24 PUSH(’c’,S) :a b c 35 POP (S) :a b 26 PUSH(’d’,S) :a b d 37 PUSH(’e’,S) :a b d e 48 POP (S) :a b d 39 POP (S) :a b 210 POP (S) :a 1

Apa yang terjadi bila dilakukan POP (Sebanyak dua kali lagi ? Underflow. Artinya stack kosong tidak ada elemen yang dapat diambil. Apa yang terjadi jika dilakukan PUSH (’x’S) sebanyak sepuluh kali, jika kapasitas stack 5 lagi ? Overflow, artinya stack penuh tidak ada elemen yang dapat dimasukkan kedalam stack.Pada proses PUSH, stack harus diperiksa apakah jumlah elemen sudah mencapai maksimum atau tidak. Jika sudah mencapai maksimum maka OVERFLOW.

27

Sedangkan pada proses POP, stack harus diperiksa apakah ada elemen yang hendak dikeluarkan atau tidak. Jika tidak ada maka UNDERFLOW.

Algoritma PUSH: PUSH(S,TOP,MAKSTUM,ELEMEN)1. [periksa kandungan stack, apakah penuh ?]

jika TOP = MAKSTUM, cetak ‘OVERFLOW’2. [tambahkan TOP dengan 1]

TOP:=TOP + 13. [Masukkan ELEMEN kedalam lokasi TOP yang baru]

S[TOP]:=ELEMEN4. RETURN

Algoritma POP: POP(S,TOP,MAKSTUM,ELEMEN)1. [periksa kandungan stack, apakah kosong ?]

jika TOP = 0, cetak ‘UNDERFLOW’2. [simpan nilai teratas pada ELEMEN]

ELEMEN :=S[TOP]3. [keluarkan TOP dengan 1]

TOP:=TOP - 14. RETURN

3.8. Representasi Stack (Penerapan Stack)Stack bisa dinyatakan dalam bentuk list atau array, biasanya dalam bentuk array stack. Pointer TOP yang menyatakan lokasi elemen TOP dari stack dan variabel.MAXSTX yang menyatakan banyaknya elemen maximum yang bisa ditampung stack. Keadaan TOP=0 (null) menyatakan stack kosong.

6 = MAXSTK

3 = TOPTOP = 3 Stack mempunyai 3 elemenMaxstk = 8Untuk menambah satu elemen ke stack, harus dicek apakah masih ada ruang kosong atau tidak, jika tidak ada maka akan oferflow, untuk mengambil satu elemen dari stack harus dicek apakah stack mempunyai elemen atau tidak, jika stack kosong maka stack Underflow.

Contoh :a). Tinjauan Stack diatas, lakukan operasi PUSH (stack, n)

1). Karena TOP=3, lanjut ke step 22). TOP = 3 + 1 = 43). Stack [TOP] = Stack[4]=W4). ReturnSekarang W elemen puncak stack.

b). Lakukan Operasi POP(stack, item)1). Karena TOP = 3 ke step 22). ITEM = 23). TOP = 3-1 = 24). Returnsekarang stack[TOP] = stack [2] = Y dan menjadi elemen puncak dari Stack.

3.9. Ekspresi AritmetikMisalnya list A mempunyai 12 elemen bilangan :

28

X Y Z1 2 3 4 5 6

(44), 33, 11, 55, 77, 90, 40, 60, 99, 22, 88, (66) dimulai dari bilangan terakhir menuju kekiri kita bandingkan setiap bilangan dengan bilangan pertama, jika ketemu yang lebih kecil kita berhenti dan kita tukar.Sehingga list menjadi : (22), 33, 11, 55, 77, 90, 40, 60, 99, (44), 88, 66kemudian mulai dari 22 kekanan kita cari elemen yang lebih besar dari 44 dan kita tukar, sehingga list menjadi : 22, 33, 11, (44), 77, 90, 40, 60, 99, (55), 88, 66mulai dari 55 kekiri, kita cari elemen yang lebih kecil dan kita tukar, sehingga list menjadi : 22, 33, 11, (40), 77, 90, (44), 60, 99, (55), 88, 66dan seterusnya sehingga menghasilkan urutan yang berturut-turut : 22, 33, 11, 40, (44), 90, (77), 60, 99, (55), 88, 66Ket :Sampai disini semua elemen telah kita bandingkan dengan (44) dan semua bilangan yang lebih kecil dari 44 telah berada disebelah kiri (44) dan semua bilangan yang lebih dari (44) berada disebelah kanan (44). Berarti (44) berada pada posisi yang benar. Pengurutan berikutnya dilakukan terhadap masing-masing dengan 2 sub list diatas dan diulang dengan setiap sub list mengandung dua atau lebih elemen.Karena dalam satu waktu kita hanya memproses satu sub list, kita harus bisa menjejaki sub list yang lain untuk proses berikutnya yang bisa dilakukan dengan menggunakan 2 satck, yaitu :LOWER dan UPPER, untuk menyimpan sementara sub list tersebut. Jadi alamat dari elemen pertama dan terakhir dari setiap sub list dimasukkan berturut-turut kelower dan upper dan pengurutan dilakukan hanya sesudah nilai batas suatu sub list diambil dari stack.Contoh :Dari List A diatas dengan n=12, nilai batas adalah Lower = 1 dan Upper = 12. kita ambil nilai I dan 2 stac dari sehingga lower=0 dan upper =0.Dan kemudian kita lakukan langkah reduksi terhadap A[1],A[2],…,A[12] yang akhirnya menempatkan elemen pertama 44 pada A[5]. Kemudian nilai batas 1 dan 4 dari sub list pertama dan nilai batas 6 dan 12 dari sub list kedua kita masukkan ke stack.Lower = 1,6 Upper = 4,12Untuk melakukan langkah reduksi lagi kita ambil nilai TOP 6 dan 12 dari stack sehingga :Lower = 1Upper =4Dan kita lakukan step reduksi terhadap sublist A[6],A[7],…,A[12], sehingga menjadi :

A[6] A[7] A[8] A[9] A[10] A[11] A[11](90) 77 66 99 55 88 (66)66 77 60 99 55 88 (90)66 77 60 (99) 55 88 9966 77 60 (90) 55 88 9966 77 60 88 55 88 99

Sublist Pertama Sublist kedua

Sublist kedua hanya mengadung satu elemen, maka hanya nilai 6 dan 10 yang dimasukkan kestack sehingga :

29

Lower=1, 6 Upper=4,10Proses berhenti jika stack sudah tidak ada sublist uantuk diproses.

3.10. Notasi Aritmatik (Infix, Prefix dan Postfix)Infix, Notasi aritmatik biasa ditulis dalam notasi infix, misalnya A + B – C. notasi infix mudah dimengerti oleh manusia, hanya saja dalam notasi infix perlu diperhatikan prioritas pengerjaannya karena berhubungan dengan hirarki operator pada komputer. Prioritas pengerjaannya adalah :1. Tanda kurung ( …..)2. Eksponensial atau pangkat : 3. perkalian, pembagian : *, /4. Penjumlahan, pengurangan : +, -Contoh :(A – B) * (C + D)Priorotas pengerjaan soal diatas adalah 1. dalam kurung yang paling kiri2. dalam kurung yang kedua3. perkalian hasil pengurangan dengan hasil penjumlahan

notasi infix untuk penulisan aritmatik biasa diubah kedalan motasi Prefix atau posfix saat kompilasi. Notasi prefix maupun postfix akan lebih mudah dikerjakan oleh komputer, karena tidak perlu mencari urutan pengerjaan seperti pada notasi infix.

Prefix Adalah keadaan dimana simbol operator diletakkan sebelu dua operand. Postfix adalah keadaan dimana simbol operator diletakkan sesudah dua operand.

Aturan notasi infix, prefix dan postfix : Notasi Infix : operand operator operand A + B Notasi Prefix : operato operand operand + AB (disebut Polish Notation –

NP) Notasi Postfix : operand operand operator AB + (disebut Reverse

Polish Notation – RNP)

Untuk lebih jelasnya, berikut contoh konversi dari suatu notasi ke notasi lainnya :1. INFIX ke PREFIX : (A + B) – (C*D)

a. pengerjaan dalam kurung ke-1 : (A+B), prefixnya adalah +ABb. pengerjaan dalam kurung ke-2 : (C*D), prefixnya adalah *CDc. terakhir adalah operator - , +AB - *CD

2. INFIX ke POSTFIX :a. pengerjaan dalam kurung ke-1 : (A+B), prefixnya adalah AB+b. pengerjaan dalam kurung ke-2 : (C*D), prefixnya adalah CD*c. terakhir adalah operator - , AB+ – CD*

3. PREFIX ke INFIX : +/*A B C DUntuk pengerjaan prefix, mencari operator dimulai dari operand terkanan sebagai berikut :a. cari operator ke-1: *, ambil dua operand sebelumnya, A dan B, sehingga

postfixnya adalah (A*B)b. cari operator ke-2: / , ambil dua operand sebelumnya, (A*B) dan C,

sehingga infixnya adalah ((A*B)/C) c. cari operator k-3: +, ambila dua operan sebelumnya, ((A*B)/C) dan D,

sehingga infixnya menjadi ((A*B)/C) + D4. PREFIX ke POSTFIX : +/*A B C D

30

a. cari operator ke-1: *, ambil dua operand sebelumnya, A dan B, sehingga postfixnya adalah AB*

b. cari operator ke-2: / , ambil dua operand sebelumnya, AB* dan C, sehingga infixnya adalah AB* C/

c. cari operator k-3: +, ambila dua operan sebelumnya, AB* C/ dan D, sehingga infixnya menjadi AB* C/ D+

5. POSTFIX ke INFIX : A B C D * / -Untuk pengerjaan postfix, mencari operator dimulai dari operand terkiri sebagai berikut :a. cari operator ke-1: * , ambil dua operand sebelumnya C dan D sehingga

infixnya menjadi (C*D)b. cari operator ke-1: / , ambil dua operand sebelumnya B dan (C*D),

sehingga infixnya menjadi (B/ (C*D))c. cari operator ke-3 : -, ambil dua operand seblumnya A dan (B/ (C*D)),

sehingga infixnya menjadi A-(B/ (C*D))

6. POSTFIX ke PREFIXa. cari operator ke-1: * , ambil dua operand sebelumnya C dan D sehingga

infixnya menjadi *CDb. cari operator ke-1: / , ambil dua operand sebelumnya B dan *CD, sehingga

infixnya menjadi /B *CDc. cari operator ke-3 : -, ambil dua operand seblumnya A dan /B *CD,

sehingga infixnya menjadi -A /B *CD

7. Evaluasi nilai postfix menggunakan stackMisal perhitungan aritmatik dalam notasi INFIX : 2 – 4 * 3 + 1Ubah ke POSTFIX : 243*-1+, evaluasinya sebagai berikut :

2 4 3 * - 1 +

3 Op24 4 Op1 12 Op2 1 Op2

2 2 2 2 Op1 -10 -10 Op1 -9

Ket : op1=operand ke-1 (kiri); op2=operand ke-2 (kanan)

Algoritma : evaluasi nilai notasi POSTFIX1. Buat stack kosong2. Ulangi langkah berikut sampai elemen habis

a. ambil elemen satu persatu dari aritmatikb. jika elemen itu adalah operan, masukkan kedalam stack; jika

operator maka keluarkan dua nilai terbatas dari stack (op2 dan op1), lalu hitung dengan operator yang bersangkutan.hasilnya dimasukkan kedalam stack (jika tidak ada 2 operan dalam stack maka ada kesalahan pada notasi tersebut.

3. Bila elemen dari notasi tersebut habis, maka nilai yang tertinggal (teratas dalam stack) adalah hasilnya.

8. Evaluasi nilai prefix menggunakan stackMisal perhitungan aritmatik dalam notasi INFIX : 2 – 4 * 3 + 1Ubah ke PREFIX : + -2*431, evaluasinya sebagai berikut :

1 3 4 * 2 - +

31

4 Op1 2 Op13 3 Op2 12 Op1 12 Op2 -10 Op1

1 1 1 1 Op2 1 1 Op2 -9

Ket : op1=operand ke-1 (kiri); op2=operand ke-2 (kanan)

Algoritma : evaluasi nilai notasi PREFIX1. Buat stack kosong2. Ulangi langkah berikut sampai elemen habis

a. ambil elemen satu persatu dari aritmatikb. jika elemen itu adalah operan, masukkan kedalam stack dan jika

operator maka keluarkan dua nilai teratas dari stack (op1 dan op2, kebalikan dari postfix) lalu hitung dengan operator yang bersangkutan. Hasilnya dimasukkan ke stack (jika tidak ada 2 operan dalam stack maka ada kesalahan pada notasi tersebut)

3. Bila elemen dari notasi tersebut habis, maka nilai yang tertinggi (teratas dalam stack) adalah hasilnya.

3.11. RekursifFungsi/prosedur rekursif adalah fungsi atau prosedur yang memanggil dirinya sendiri, sebagai contoh adalah faktorial/ pemanggilan terhadap dirinya sendiri, menyebabkan fungsi melakukan proses pengulangan (looping). Agar pengulangan tidak terjadi terus menerus, maka harus ada kondisi yang menyebabkan proses pengulangan berhenti. Kondisi ini disebut sebagai base. Dengan demikian badan fungsi akan dibagi menjadi dua bagian, yaitu :

Base : kondisi berhenti Recuuence : proses pengulangan (pemanggilan dirinya sendiri)

Dalam perhitungan matematis diperlihatkan contoh berikut :Fungsi ekusif untuk mencari nilai faktorial, dimana fungsi matematis untuk mencari nilai faktorial adalah sebagai berikut :

n! = n * (n-1)*(n-2)*…*3*2*1n!=n*(n-1) ! Dengan (n-1) ! = (n-1) * (n-2) ! dan (n-2) ! = (n-2) * (n=3) !

Terlihat bahwa fungsi ini akan melakukan proses pengulangan (n-x) !, dengan nilai x selalu berkurang 1 dan baru akan berhenti bila (n-x)=1.

Tanpa RekursifFact :=1;For i := 1 to n do Fact :=Fact* i ;EndDengan RekursifFunction fact(n:integer):integerBegin If(n=0) or(n=1) then Fact:=1 Else Fact:= n*fac(n-1);End

Prinsipnya rekursip adalah proses yang memanggil dirinya sendiri dengan parameter yang berbeda sampai pengulangan berhenti.

32

Soal Latihan1. Ubah notasi infix berikut menjadi bentuk prefix dan postfix

a. A/B – C/Db. (A+B) 3 – C*D c. A (B+C)2. Ubah notasi Prefix berikut kedalam bentuk infix dan postfix

a. +-/ABC DE b. -+DE / XY c. +23 – CD3. Ubah noasi postfix berikut kedalam bentuk infix dan prefix

a. ABC+ - b. GH+ I J/* c. AB CD+ -4. Hitung hasil evaluasi ini menggunakan stack :

a. Prefix : - + 2 3 / 62b. Postfix : 6 7 – 123 + - *

5. Buat fungsi rekursif F(m,n) = m+(m+1)+(m+2)+ …+n6. Tentukan base dan recurrence untuk fungsi F(x) = 21 + 22 +…+2x

7. Buat program rekursif untuk menghitung faktorial nilai yang diinputkan !

33

BAB IV QUEUE [ANTRIAN]

4.1 Definisi Queue (Antrian)Queue merupakan suatu struktur data linier. Konsepnya hampir sama dengan stack, perbedaannya adalah operasi penambahan dan penghapusan pada ujung yang berbeda. Penghapusan dilakukan pada bagian DEPAN (FRONT) dan penambahan dilakukan pada bagian BELAKANG (REAR). Elemen-elemen didalam queue dapat bertipe data integer, real, record dalam bentuk sederhana atau terstruktur.Queue disebut juga “waiting line” yaitu penambahan elemen baru dilakukan pada BELAKANG dan penghapusan elemen dilakukan pada bagian DEPAN. Sistem pengaksesan pada data queue menggunakan sistem FIFO, artinya elemen yang pertama masuk itu akan keluar pertama dari queue. Implementasi queue dapat ditemukan antara lain :

a. Penjualan karcis kereta api, bioskopb. Penjadualan pencetakan (spooling system)c. Penjadualan pemakaian CPU, pada clien server.d. Pemakaian jalur I/O (input/output) pada sistem komputere. Penyimpanan barang di Apotik, dll.

Contoh queue kosong, queue dengan 1 elemen dan queue dengan n elemen.

Contoh :

A B C D : Queue 4 elemen A didepan dan D dibelakang B C D : 1 Elemen dihapus B C D E F : 2 elemen ditambahkan

C D E F : 1 elemen dihapus

34

Tumpukan kosong

Belakang=0Depan = 0

Tumpukan 1 elemen

A

Tumpukan n elemen

DCBA

Belakang=1Depan = 1

Belakang=nDepan = 1

4.2 Kamus Data QueueSebelum struktur data ini bisa digunakan, harus dideklarsikan dahulu dalam bentuk kamus data. Ada beberapa cara mendeklarasikan struktur data ini, salah satunya adalah dengan menggunakan tata susunan linier (larik) dan dua buah variabel yang dikemas dalam tipe data record. Berikut ini pendeklarasian struktur data queue dalam kamus data :

Kamus DataConstMAKSQ = 80; {kapasitas maksimal queue)TypeJenisElemen =char;Queue = record Utem : array[1..MAKSQ] of JenisELemen; Depan: 0..MAKSQ; Belakang : 0..MAKSQ;End;Q:Queue

Queue adalah struktur data bertipe rocord yang terdiri dari field 1.Elemen bertipe array dengan indeks dari 1 sampai dengan MaksQ2.Depan, bertipe integer berkisar dari 0 (saat kosong) sampai dengan MAXQ.3.Belakang, bertipe integer berkisar dari 0 sampai dengan MAXQ.

4.3 Operasi Dasar QueueOperasi-operasi dasar yang dapat diterapkan adalah sebagai berikut :a. CreateQueue(Q) : Membuat queue baru Q, dengan jumlah elemen kosongb. MakeNullQ(Q) : Mengosongkan queue Q, jika ada elemen maka semua

elemen dihapus.c. EmptyQ : Queue kosong ?, menguji apakah queue Q kosongd. FullQ : Antian penuh?, menguji apakah queue Q penuhe. TambahQ(a,Q) : Memasukkan elemen baru x kedalam queuef. Ambil (Q,x) : Mengeluarkan elemen depan pada queue Q

Ilustrasi operasi tambahQ dan ambilQ terhadap queue :OPERASI ISI STACK DEPAN BELAKANG

1 CREATEQ(Q) :<kosong> 0 02 Tambah(’a’,Q) :a 1 13 Tambah (’b’,Q) :a b 1 2

35

4 Tambah (’c’,Q) :a b c 1 35 Ambil ( Q,x) :b c 2 36 Tambah (’d’,Q) :b c d 2 47 Tambah (’e’,Q) :b c d e 2 58 Ambil ( Q,x) :c d e 3 59 Ambil ( Q,x) :d e 4 510 Ambil ( Q,x) :e 5 5

Apa yang terjadi bila dilakukan AmbilQ (Q,x) Sebanyak dua kali lagi ? Underflow. Artinya queue kosong tidak ada elemen yang dapat diambil. Apa yang terjadi jika dilakukan Tambah (x,Q) sebanyak sepuluh kali, jika kapasitas queue 5 lagi ? Overflow, artinya queue penuh tidak ada elemen yang dapat dimasukkan kedalam queue.Pada proses TambahQ, queue harus diperiksa apakah jumlah elemen sudah mencapai maksimum atau tidak. Jika sudah mencapai maksimum maka OVERFLOW. Sedangkan pada proses AmbilQ, Queue harus diperiksa apakah ada elemen yang hendak dikeluarkan atau tidak. Jika tidak ada maka UNDERFLOW. Queue dinyatakan kosong bila depan = 0 dan depan = belakang Queue dinyatakan penuh bila depan = 1 dan belakang = maxQ

Algoritma Tambah Queue1. [periksa queue, apakah penuh ?]

jika FullQ(Q) maka cetak overflowreturn

2. [Naikkan nilai belakang]Jika EmptyQ(Q) maka {queue kosong} DEPAN = 1 dan BELAKANG = 1Jika BELAKANG = N maka {Queue dapat ditulis} BELAKANG = BELAKANG + 1

3. [Masukkan elemen baru]Queue[BELAKANG] = ELEMEN

4. [Jika Belakang = MaksQ dan Depan <> 1, lakukan penggeseran]Jika BELAKANG = MaksQ AND DEPAN <> 1 Maka GESERQueue(Q)

Algoritma Ambil Queue1. [Periksa Queue, apakah kosong ?]

jika EmptyQ(Q) maka cetak UnderFlowReturn

2. [Ambil elemen dari posisi depan]ELEMEN =Queue[DEPAN]

3. [Naikkan nilai depan]Jika DEPAN = BELAKANG maka {Queue ada 1 elemen}DEPAN = 0 dan BELAKANG = 0Jika tidak DEPAN = DEPAN + 1

4. RETURN

4.4 Queue SirkulerPada queue diatas perlu dilakukan penggeseran untuk menghindari sela kosong didepan queue, agar queue bisa diisi kembali. Dengan queue sirkuler penggeseran tidak perlu dilakukan. Berikut ilustrasi mengenai queue sirkuler.

1 2 3 4 5 6 7 8

36

Atrian sirkuler, prinsipnya sama dengan queue biasa, untuk mempermudah penggambaran lajur linier digambarkan dalam bentuk lingkaran. Untuk penambahan elemen baru pada queue sirkulasi ini, jika BELAKANG = MaksQ = 8, maka BELAKANG diset menjadi 1 (bila queue belum penuh)Berikut persamaan dan beberapa perbedaan sirkulasi sirkuler : Kamus data queue sirkuler sama dengan queue biasa Kondisi kosong, 1 elemen dan penuh

No KONDISI1 Kosong DEPAN = 0 dan BELAKANG = 02 1 elemen DEPAN = NELAKANG dan DEPAN <>03 Penuh DEPAN = 1 dan BELAKANG = MaksQ atau

DEPAN – BELAKANG = 1

Tambah queue dan ambil queue sirkulasi

Algoritma Tambah Queue1. [Periksa queue, apakah penuh ?]

jika FullQS(QS) maka cetak overflowreturn

2. [Naikkan nilai belakang]Jika EmptyQS(QS) maka {queue kosong} DEPAN = 1 dan BELAKANG = 1Jika BELAKANG = MaksQ maka BELAKANG = 1Jika tidak, BELAKANG = BELAKANG + 1

3. [Masukkan elemen baru]QueueS[BELAKANG] = ELEMEN

4. Return

Algoritma Ambil Queue1. [Periksa Queue, apakah kosong ?]

jika EmptyQS(QS) maka cetak UnderFlowReturn

2. [Ambil elemen dari posisi depan]ELEMEN =Queue[DEPAN]

3. [Naikkan nilai depan]Jika DEPAN = BELAKANG maka {Queue ada 1 elemen}DEPAN = 0 dan BELAKANG = 0Jika DEPAN = MaksQ maka DEPAN = 1Jika tidak, DEPAN = DEPAN + 1

4. RETURN

4.5 Representasi QueueDidalam komputer suatu queue biasanya direpresentasikan dalam bentuk array queue dari dua variabel pointer FRONT (lokasi elemen depan) dan REAR (lokasi elemen belakang).Keadaan FRONT = Null menunjukkan queue kosong. Jika suatu elemen dihapsu dari queue, harga REAR bertambah satu.Contoh :Misalnya queue ini dinyatakan dengan array sirkuler dengan n=5 lokasi memory. Procedure berikut Q Insert unutk menyisipkan item ke queue yang pertama kita lakukan adalah mengetes apakah queue terisi atau tidak (overflow).Mula-mula kosong.

37

FRONT = 0, REAR = 0

A, B dan C disisipkan FRONT = 1, REAR = 3

A dihapus FRONT = 2, REAR = 3

D dan E disisipkan FRONT = 2, REAR = 5

B dan C dihapus FRONT= 4, REAR = 5

F disisipkan FRONT = 4, REAR = 1

D dihapus FRONT = 5, REAR = 1

Gdan H disisipkan FRONT = 5, REAR = 3

38

FGHE12345

ABC12345

BC12345

BCDE12345

DE12345

FDE12345

FE12345

12345

BAB V LIST [SENARAI]

5.1 Definisi dan Representasi List List (List) adalah struktur data yang terdiri dari rangkaian elemen sejenis yang saling berhubungan atau bersifat runtutan (squence). Setiap elemen dari list memiliki pendahulu / predesesor dan penerusnya/suksesor (kecuali elemen terakhir dari list atau list masih kosong).Contoh operasi-operasi dasar pada list :

Membuat list kosong Menelusuri list Menyiapkan elemen dalam list Menghapus elemen dari list

Jenis-jenis representasi list adalah sebagai berikut :1. Representasi List Berurutan (dengan array dan indeks)Untuk menetukan ukuran list, maka perlu disimpan indeks dari elemen data terakhir (misalnya dengan variabel akhir). Senarari ini mempunyai ciri-ciri dari array.

2. Representasi List Berkait (dengan penunjuk/pointer)Perbandingan antara repsentasi berurutan dengan representasi berkait adalah : dari segi waktu komputasi menunjukkan kompleksitas pemrograman, selain itu faktor ruang penyimpanan perlu diperhitungkan juga. Contohnya dalam representasi berkait diperlukan ruang tambahan untuk mengkaitkan setiap node (elemen list). Sedangkan dalam representasi berurutan (dengan array) terjadi pemborosan ruang yang terlebih dahulu disediakan tetapi kemungkinan tidak digunakan seluruhnya.

Skema list berkait :

39

Contoh :Dari 12 ranjang di RS, diantaranya terisi, misalnya diinginkan daftar urut nama pasien. Nama ini diberikan oleh pointer field next. Kita menggunakan variabel start untuk menunjuk pasien pertama. Pasien terakhir berisi pointer null (0).Diumpamakan start = 5 dan avail = 10.

5.2 Kamus DataSuatu list dengan satu penunjuk merupakan kumpulan data linier yang disebit node (elemen list). Elemen list ini dikaitkan antara satu dengan yang lainnya dalam bentuk linier menggunakan penunjuk (pointer). Setiap elemen list dibagi menjadi 2 bagian yaitu : item data dan penunjuk kepada elemen berikutnya. Untuk

40

pembahasan selanjutnya item data disebut sebagai info dan penunjuk disebut sebagai next.

5.3 Variasi Representasi Lojik List

List Linier : First – LastList linier yang mencatat alamat elemen pertama dan elemen terakhir.

Jika P adalah alamat sebuah elemen list, maka :Elemen pertama : FirstElemen terakhir : LastList kosong : First = NIL dan Last = NIL

List Linier : Self PointingList linier dengan elemen terakhir menunjuk pada diri sendiri.

Jika P adalah alamat sebuah elemen list, maka :Elemen pertama : FirstElemen terakhir : Last = P, dengan Next(P) = PList kosong : First = NIL

List Linier : CircularList linier sirkuler.

41

Jika P adalah alamat sebuah elemen list, maka :Elemen pertama : FirstElemen terakhir : Last = P, dengan Next(P) = FirstList kosong : First = NIL

List Linier : Double PointerList linier dengan pointer ganda.

Jika P, Q adalah alamat sebuah elemen list, maka :Elemen pertama : First = P, dengan Prev(P) = NILElemen terakhir : Last = Q, dengan Next(Q) = NILList kosong : First = NIL

5.4 Representasi List BerkaitL adalah list berkait dalam memory, maka L akan memerlukan 2 array, misal Info dan Link yang berisi informasi dan nextpointer field.Start = lokasi awal dari list, Nextpointer = menyatakan akhir dari list berkait.Contoh :Dua nilai test ALG dan PSC disimpan di memory, dimana simpul-simpulnya disimpan pada array yang samam.Nilai ALG = 88, 74, 93, 82Nilai PSC = 84, 62, 74, 100, 74, 84

42

Latihan :1. Sebuah perusahaan mempunyai 4 orang salesmen mempunyai beberapa langganan.

Semua langganan berada dalam array yang sama dan array link mengandung nextpointer field dari simpul list.Gambarkan bentuk representasi logiknya !

5.5 Traversing List BerkaitTerjadi bila memproses setiap simpul suatu list tepat sekali.

ALGORITMA :PTR : = STRATWHILW PTR <> NULLDO PTR := LINK (PTR)ENDWHILE

CONTOH :MENGHITUNG BANYAKNYA SIMPUL DAN MENCETAK SETIAP SIMPUL SUATU LIST.N:=0PTR:=STARTWHILE PTR <> NULLDO N=N+1 WRITE INFO [PTR] PTR:=LINK[PTR]ENDWHILE

5.6 Searching Suatu List Berkait

43

Pencarian terjadi jika akan menemukan lokasi LOC dari simpul dimana item (dat) muncul pertama kali didalam list. List tidak terurut

Caranya : Dengan melakukan traversing terhadap list dan membandingkan item dengan isi info{PTR] dari setiap simpul.

ALGORITMASEARCH (INFO, LINK, START, ITEM, LOC)PTR:=STARTWHILE PTR<>NULLDOIF ITEM = INFO[PTR] THEN LOC:=PTR EXITELSE PTR:=LIKN[PTR]ENDIFENDWHILELOC:=NULL (PEMCARIAN GAGAL)EXIT

NAMA

NIP GAJI LINE

12 A 11 10 3

3 B 22 20 74 C 33 10 056 D 44 20 27 E 55 10 989 F 66 20 410

Mencari yang mempunyai NIP 77 jika ketemu gaji ditambah 10%

List yang berurutan / terurutJika kita mencari item dalam list dengan mengunjung list dengan menggunakan variabel pointer dan membandingkan item dengan isi info [PTR] dari setiap simpul, bisa berhenti jika item melebihi info[PTR].

ALGORITMASEARCH (INFO, LINK, START, ITEM, LOC)PTR:=STARTWHILE PTR<>NULLDO IF ITEM > INFO[PTR] THEN PTR:=LINK[PTR] ELSE IF ITEM = INFO[PTR] THEN LOC:=PTR (PENCARIAN BERHASIL) EXIT ENDIF ENDIFENDWHILELOC:=NULL (PEMCARIAN GAGAL)

44

Star

EXIT

45

BAB VI TREE [POHON]

6.1 Definisi Tree (Pohon)Sebuah tree adalah struktur data yang terdiri dari akar (root) dan subtree-subtree dalam susunan hirarki. Suatu tree dapat bersifat statik dan dinamik. Tree statik adalah keadaan dimana bentuk tree sudah dintentukan sedangkan tree bentuk dinamik adalah keadaan dimana bentuk tree berubah selama program dijalankan. Bentuk tree dapat berubah karena operasi penambahan dan penghapusan simpul (node). Representasi tree dapat menggunakan representasi array atau representasi pointer.Struktur pohon merupakan struktur yang penting dalam bidang informatika, yang memungkinkan untuk : mengorganisasi informasi berdasarkan suatu struktur lojik memungkinkan cara akses yang khusus terhadap suatu elemen

Contoh penerapannya adalah pada permasalahan : pohon keputusan pohon keluarga dan klasifikasi dalam botani pohon sintaks dan pohon ekspresi aritmatika

Pohon Biner adalah himpunan terbatas simpul (node) yang mungkin kosong, atau terdiri dari sebuah simpul yang disebut akar, dan dua buah himpunan lain yang disjoint yang merupakan pohon biner, yang disebut sebagai subpohon kiri dan subpohon kanan dari pohon biner tersebut. Contoh :

Istilah-istilah dasar dalam tree : Simpul/Node/Vertex : merupakan elemen tree yang mengandung informasi atau data

dan penunjuk percabangan. Gambar tree dibawah ini mempunyai 10 simpul yang berisi informasi A,B,C,D,E,F,G,H,I.J serta percabagannya.

Tingkat / Level dari simpulTingkat dari akar (root0 didefinisikan sebagai 0, sedangkan tingkat dari simpul lainnya didefinisikan sebagai 0 + tingkat dari orang tua simpul tersebut.

46

Kedalaman (depth)Dinyatakan oleh tingkat yang tertinggi dari simpul yang terdapat pada tree tersebut.Tree diatas merupakan tree 3 tingkat, simpul dari akar A adalah tingkat 0; simpul B dan C adalah tingkat 1; simpul DEFG dan H adalah tingkat 2; dan simpul I dan J adalah tingkat 3.

Derajat dari simpulJumlah anak yang dimiliki oleh sebuahy simpul. Berdasarkan gambar diatas maka :

- Simpul B dan E berderajat 2- Simpul C berderajat 3- Simpul D,I,J,F,G berderajat 0

DaunAdalah simpul paling luar (node eksternal) atau simpul yang tidak memiliki anak (berderajat 0)

Simpul nonterminal (node internal) adalah simpul yang memiliki anak (berderajat tidak 0)

Suatu struktur tree dapat dituliskan dalam 3 bentuk, yaitu hirarki, diagram venn, notasi kurung dan notasi tingkat.

Bentuk Diagaram Venn

Notasi Kurung(A(B(D,E(I,J)),C(F,G,H))) atau (A(B(D)(E(I)(J)))(C(F)(G)(H)))

Notasi Tingkat

6.2 Terminologi Ayah (parent / father)

Akar dari sebuah pohon adalah ayah dari subpohon Anak (child / children / son) : left, right

Anak dari sebuah akar adalah subpohon Saudara (brother)

Saudara adalah simpul lain yang mempunyai ayah yang sama Ancestor – Descendant

Sebuah simpul n1 disebut ancestor simpul n2 (dan n2 disebut descendant n1) jika :o n1 adalah ayah dari n2o n1 adalah ayah dari ancestor n2.

47

Left descendantSebuah simpul n2 disebut left descendant simpul n1 jika :o n2 adalah anak kiri n1o n2 adalah descendant dari anak kiri n1

Right descendantSebuah simpul n2 disebut right descendant simpul n1 jika :o n2 adalah anak kanan n1o n2 adalah descendant dari anak kanan n1

Daun (leaf)Simpul terminal dari pohon atau simpul yang tidak mempunyai anak / subpohon.

Derajat (degree)Banyaknya anak dari sebuah pohon

Tingkat (level)Panjang lintasan dari akar hingga simpul yang bersangkutan. Tingkat simpul akar adalah 1 (dijadikan acuan pada saat kuliah) atau 0

Kedalaman (depth) / tinggi (height)Nilai maksimum dari tingkat suatu pohon

6.3 Tipe Pohon condong (skewed tree).

Contoh gambar left skewed tree dan right skewed tree :

Strictly Binary Tree Setiap simpul yang bukan daun mempunyai subpohon kiri dan subpohon kanan yang tidak kosong. Contoh gambar strictly binary tree dengan n daun akan mempunyai 2n-1 simpul :

48

Pohon Biner Lengkap (Complete Binary Tree)Contoh pohon biner lengkap :

6.4 KomputasiJika sebuah pohon biner mempunyai m simpul pada level l, maka ia akan mempunyai maksimal 2m simpul pada level l + 1. Karena pada level 1, sebuah pohon biner hanya terdiri dari 1 simpul (akar), maka pada level l akan mempunyai maksimal 2 l – 1 simpul.

Pohon biner lengkap dengan kedalaman d akan tepat mempunyai 2 d – 1 simpul, dan 2 d

– 1 – 1 simpul bukan daun.

6.5 Representasi LojikPohon biner dapat direpresentasikan secara lojik berupa double linked list, yang dideklarasikan sebagai berikut :

typedef ... InfoType; // tipe info terdefinisi

typedef ... address; // bergantung representasi fisik, mengacu ke Node

typedef address BinTree;

typedef struct TNode{ InfoType Info; BinTree Left; BinTree Right;} Node;

Jika P adalah sebuah pohon biner, maka terdapat selektor sebagai berikut : Info(P) untuk mengakses info dari simpul / akar pohon P Left(P) untuk mengakses subpohon kiri dari P Right(P) untuk mengakses subpohon kanan dari P

49

6.6 Operasi dan Fungsi Dasar

1. CreateBinTree

void CreateBinTree(BinTree *P){ /* I.S. sembarang F.S. terbentuk pohon biner P yang kosong */

*P = NIL;}

2. IsBinTreeEmpty

int IsBinTreeEmpty(BinTree P){ /* Mengembalikan nilai 1 jika pohon biner P kosong, dan nilai 0 jika tidak */

return(P == NIL);}

3. IsLeaf

int IsLeaf(BinTree P){ /* P tidak kosong. Mengembalikan nilai 1 jika pohon biner P merupakan daun, dan nilai 0 jika tidak */ return ((Left(P) == NIL) && (Right(P) == NIL));}

6.7 TraversalAda tiga macam traversal pada pohon biner : Preorder (depth-first order), dengan urutan pemrosesan : akar, subpohon kiri,

subpohon kanan Inorder (symmetric order), dengan urutan pemrosesan : subpohon kiri, akar,

subpohon kanan Postorder, dengan urutan pemrosesan : subpohon kiri, subpohon kanan, akar

Perhatikan hasil traversal pada pohon biner berikut ini :

Preorder : A B D G C E H I F Inorder : D G B A H E I C F Postorder : G D B H I E F C A

Implementasi :

50

1. Preorder

void Preorder(BinTree P){ /* I.S. P mungkin kosong F.S. Jika P tidak kosong, semua simpul P sudah dikunjungi dengan cara preorder

Urutan kunjungan : Akar – Subpohon Kiri – Subpohon Kanan */

if (P != NIL) { printf("%...",Info(P)); Preorder(Left(P)); Preorder(Right(P)); }}

2. Inorder

void Inorder(BinTree P){ /* I.S. P mungkin kosong F.S. Jika P tidak kosong, semua simpul P sudah dikunjungi dengan cara inorder

Urutan kunjungan : Subpohon Kiri – Akar – Subpohon Kanan */

if (P != NIL) { Inorder(Left(P)); printf("%...",Info(P)); Inorder(Right(P)); }}

3. Postorder

void Postorder(BinTree P){ /* I.S. P mungkin kosong F.S. Jika P tidak kosong, semua simpul P sudah dikunjungi dengan cara postorder

Urutan kunjungan : Subpohon Kiri – Subpohon Kanan – Akar */

if (P != NIL) { Postorder(Left(P)); Postorder(Right(P)); printf("%...",Info(P)); }}

6.8 Tree BinerTree biner adalah tree yang mempunyai komponen simpul terbatas yaitu :

Kosong atau hanya mempunyai akar Kosongdan subtree kanan Subtree kiri dan kosong Subtree kiri dan subtree kanan Pohon biner lengkap

51

6.9 Kamus Data Tree

Kamu DataType BTree = record< Kiri : BTree Info : char Kanan : BTree>P:Btree

Kiri Info

Contoh :

Penggambaran secara fisik pada memory komputer :

6.10 Operator Dasar pada Tree

52

Tree Biner TerurutContoh pembuatan tree biner terurut.Misalkan deklarasi simpul sebagai berikut :

12 22 8 19 10 9 20 4 2 61 2 3 4 5 6 7 8 9 10

Langkah :

53

Pejelasan :Pada saat penyisipan, akan diuji dahulu apakah data yang akan dimasukkan bernilai lebih besar atau lebih kecil dari pada nilai data pada simpul yang ditunjuk.Jika nilai yang akan disisipkan lebih kecil dari pada nilai data pada simpul yang akan ditunjuk maka akan diletakkan pada posisi anak sebelah kiri.Jika nilai yang akan disisipkan lebih besar dari pada nilai data pada simpul yang akan ditunjuk maka akan diletakkan pada posisi anak sebelah kanan.

BAB VII GRAPH [GRAF]

7.1 Definisi Graph (Graf)Graph adalah kumpulan simpul (verteces atau nodes) yang dihubungkan satu sama lain melalui busur / sisi (edges).Perbedaan graph dengan tree adalah pada graph mungkin terjadi siklus (sycle) dan dapat terdiri lebih dari satu sambungan.Aplikasi graph : hubungan antara kota-kota dalam satu negara, dimana simpul mewakili kota dan busur mewakili jalan yang menghubungkan antar 2 kota. Jadi dapat digunakan untuk mencari lintasan terpendek (shortest path).Graph terdiri dari dua himpunan yaitu V dan himpunan E. Vertecs (simpul)/V : himpunan simpul yang terbatas dan tidak kosongEdge (sisi / busur)/E : himpuanan busur yang menghubungkan sepasang simpul.Simpul-simpul pada graph dapat merupakan objek sembarang sperti kota, atom-atom suatu zat, anam anak, jenis buah, komponen alat elektronik, dll. Busur dapat menunjukkan hubungan (relasi) sembarang seperti rute penerbangan, jalan raya, sambungan telepon, ikatan kimia, dll.

Berdasarkan arah pada sisi, graph dapat dibedakan atas : graph berarah (directed graph / digraph)

graph tidak berarah (undirected graph)

Jika e adalah sisi yang menghubungkan simpul vi dengan simpul vj : pada graph tidak berarah

e = (vi, vj) atau (v1,v2) = (v2,v1) pada graph berarah

e = <vi, vj>. atau (v1,v2) (v2,v1)

54

Contoh :G = (V,E)V = {v1, v2, v3}E = {e1, e2, e3, e4, e5}

Perhatikan gambar berikut ini :

Jenis sisi : sisi ganda (multiple edges / parallel edges) gelang (loop)

Berdasarkan sisinya, graph dapat dibedakan menjadi : Graph sederhana (simple graph) adalah graph yang tidak mempunyai sisi ganda dan

gelang Multigraph dan graph yang mempunyai sisi ganda dan/atau gelang

Berdasarkan bobot pada sisi, graph dapat dibedakan atas : graph berbobot (weighted graph / network) graph tidak berbobot (unweighted graph)

Adjacency Simpul n disebut berdekatan / bertetangga (adjacent) dengan simpul m jika terdapat

sebuah sisi yang menghubungkan keduanyao n disebut suksesor (successor) mo m disebut predesesor (predecessor) n

Simpul terpencil (isolated vertex) adalah simpul yang tidak berdekatan dengan simpul-simpul lainnya

Incidency

55

jika diketahui suatu sisi e = (vj,vk) maka : e hadir (incident) pada vj

e hadir pada vk

vj hadir pada e vk hadir pada e

Derajat dari suatu simpul – d(v) adalah banyaknya sisi yang hadir pada simpul tersebut. Pada graph berarah : din(vi) = derajat-masuk = banyaknya sisi yang masuk ke simpul vi

dout(vi) = derajat-keluar = banyaknya sisi yang keluar dari simpul vi

d(vi) = din(vi) + dout(vi)

Sebuah graph dapat dibentuk dari suatu relasi, misalnya :A = {3,5,6,8,10,17}Relasi R = {<x,y> | x, y A, x < y, y mod x = 2k + 1, k = 0,1,2,.. }

= {<3,10>,<5,6>,<5,8>,<6,17>,<8,17>,<10,17>}

Perhatikan gambar berikut ini :

LintasanLintasan (path) dari simpul vp ke vq pada graph G adalah rangkaian simpul vp, vi1, vi2, ..., vim, vq (vp, vi1), (vi1, vi2), ..., (vim, vq) berupa sisi-sisi pada graph G.

Lintasan sederhana (simple path) adalah lintasan dengan semua simpul berbeda, kecuali, simpul pertama dan simpul terakhir.

Panjang lintasan adalah banyaknya sisi dalam lintasan tersebut.

Dari gambar di atas, dapat ditarik kesimpulan bahwa : lintasan v1, v4, v3, v2 adalah lintasan dengan rangkaian sisi (v1,v4), (v4,v3), (v3,v2)

dan panjang lintasan = 3 lintasan v1, v4, v3, v2, v1 adalah lintasan sederhana lintasan v1, v4, v3, v2, v4 bukan lintasan sederhana

Connected

56

Simpul v dan simpul w disebut terhubung (connected) jika terdapat lintasan dari v ke w. Graph tidak berarah G disebut terhubung jika pasang simpul v dan w V, terdapat lintasan dari v ke w.

Graph berarah G disebut strongly connected, jika pasang simpul u dan v V, terdapat lintasan dari u ke v dan dari v ke u.

Graph berarah G disebut weakly connected, jika graph tidak berarahnya terhubung (graph tidak berarahnya diperoleh dengan menghilangkan arah).

Siklus (cycle) / sirkuit (circuit) adalah lintasan sederhana dengan simpul pertama sama dengan simpul terakhir.

Pohon (tree) merupakan salah satu graph terhubung yang tidak mempunyai siklus.

7.2 Traversal Simpul-simpul pada suatu graph tidak berarah G dapat dikunjungi dengan dua macam algoritma : Depth First Traversal / Depth First Search (DFS)

Depth First Search merupakan algoritma penelusuran simpul-simpul pada suatu graph G, dengan melihat hubungan antara simpul satu dengan simpul yang lain (berorientasi simpul).Contoh :

57

Urutan penelusuran simpul secara DFS dimulai dari : simpul 1 : 1, 2, 4, 8, 5, 6, 3, 7simpul 2 : 2, 1, 3, 6, 8, 4, 5, 7simpul 3 : 3, 1, 2, 4, 8, 5, 6, 7simpul 4 : 4, 2, 1, 3, 6, 8, 5, 7simpul 5 : 5, 2, 1, 3, 6, 8, 4, 7simpul 6 : 6, 3, 1, 2, 4, 8, 5, 7simpul 7 : 7, 3, 1, 2, 4, 8, 5, 6simpul 8 : 8, 4, 2, 1, 3, 6, 7, 5

DFS dapat dipakai untuk menangani masalah :o cycle detectiono connectivityo topological sort

Breadth First Traversal / Breadth First Search (BFS)Breadth First Search merupakan algoritma penelusuran simpul-simpul pada suatu graph G, dengan mengikuti semua busur yang terhubung pada suatu simpul (berorientasi busur).Contoh :

Urutan penelusuran simpul secara BFS dimulai dari : simpul 1 : 1, 2, 3, 4, 5, 6, 7, 8simpul 2 : 2, 1, 4, 5, 3, 8, 6, 7simpul 3 : 3, 1, 6, 7, 2, 8, 4, 5simpul 4 : 4, 2, 8, 1, 5, 6, 7, 3simpul 5 : 5, 2, 8, 1, 4, 6, 7, 3simpul 6 : 6, 3, 8, 1, 7, 4, 5, 2simpul 7 : 7, 3, 8, 1, 6, 4, 5, 2simpul 8 : 8, 4, 5, 6, 7, 2, 3, 1

58

Algoritma-algoritma tersebut dapat pula digunakan untuk menentukan apakah graph G terhubung atau tidak, dengan memeriksa apakah ada simpul yang belum dikunjungi. Proses traversal pada suatu graph G dengan menggunakan algoritma-algoritma tersebut. akan menghasilkan suatu pohon perentang (spanning tree).

7.3 Representasi Graf7.3.1 Representasi Fisik : Adjacency MatrixBerorientasi pada hubungan ketetanggaan (adjacency) antar simpul. Representasi fisik dengan adjacency matrix hanya dapat digunakan untuk merepresentasikan graph sederhana.

Suatu graph G dengan n simpul dapat direpresentasikan sebagai berikut :

aij bernilai : 0 (false), jika simpul vi tidak bertetangga dengan simpul vj

1 (true), jika simpul vi bertetangga dengan simpul vj

Contoh :

Pada graph tidak berarah, adjacency matrix akan bersifat simetris.

Pada graph berarah, nilai aij bernilai 1 jika ada sisi diantara simpul vi dan sisi vj, dan simpul vj berada pada awal sisi vj.

59

Pada graph berbobot, nilai aij dapat merepresentasikan bobot sisi (i,j).

7.3.2 Representasi Fisik : Incidency Matrix Berorientasi pada hubungan kehadiran (incidency) antara simpul dengan sisi.Suatu graph G dengan n simpul & m sisi dapat direpresentasikan sebagai berikut :

ilk bernilai : 0 (false), jika simpul vl tidak hadir pada sisi ek

1 (true), jika simpul vl hadir pada sisi ek

60

Contoh :

Pada graph berarah, nilai ilk dapat dibedakan berdasarkan arah sebagai berikut. : +1, jika simpul vl ada pada sisi ek dan simpul vl berada pada awal sisi ek

-1, jika simpul vl ada pada sisi ek dan simpul vl berada pada akhir sisi ek

7.3.3 Representasi Fisik : Adjacency ListAdjacency list digunakan untuk menghindari banyaknya tempat bernilai 0 pada adjacency matrix.

7.3.4 Adjacency List dengan Contiguous List Sebuah graph G dengan n simpul dan m sisi direpresentasikan sebagai sebuah array [1..n], dengan G[i] berisi list alamat-alamat simpul yang bertetangga dengan v i.

Elemen list direpresentasikan sebagai berikut :

Contoh :

61

7.3.5 Adjacency list dengan Linked ListSebuah graph G dengan n simpul dan m sisi direpresentasikan sebagai sebuah linked list yang memiliki n elemen graph, dengan G->First dari G->NodeG = i berisi list alamat-alamat simpul yang bertetangga dengan vi.

Elemen graph direpresentasikan sebagai berikut :

Elemen list direpresentasikan sebagai berikut :

7.4 Aplikasi GraphDikenal tiga contoh aplikasi yang berkaitan dengan masalah lintasan pada suatu graph yaitu lintasan terpendek (shortest path), pedagang keliling (travelling salesman) dan pos cina (Chines postman).

1. Lintas terpendek : yang dicari adalah suatu lintasan terpendek pada graph yang menghubungkan simpul A dan D. lintasan terpendek untuk graph diatas adalah :A B F C D yang panjangnya adalah 10.

2. Pedagang keliling : yang dicari adalah suatu siklus terpendek yang melalui semua simpul pada graph masing-masing tepat satu kali. Jadi harus mengunjungi semua simpul dan kembali kesimpul awal dan berusaha agar jarak tempunya terpendek.Untuk graph diatas adalah : A B E D C F A

3. Pengantar pos cina : pekerjaan pengantar pos adalah mengantar surat dengan keharusan melalui semua jalan yang ada pada daerah tersebut dan kembali ketempat awal. Untuk graph diatas : ABCDEFCEBFA.

Soal Latihan :1. Tentukan lintasan terpendek dari T

ke X !

62

2. Pada graph diatas, berapa nilai matriks kedekatan (adjecency) yang meyatakan jarak pada baris T dan kolom S ?

3. berapa jumlah elemen kepala (head) Y bila direpresentasikan dengan List Adjency ?

63

BAB VIII SEARCHING [PENCARIAN]

8.1 Definisi Searching

Pada bab ini akan dijelaskan mengenai metode-metode search (pencarian) baik internal search maupun external search, berikut metode untuk insert dan delete.

Perhatikan gambar internal search berikut ini :

Perhatikan gambar external search berikut ini :

Struktur tabel yang digunakan adalah sebagai berikut :#define NMax 100

typedef int TabInt[NMax];

8.2 Sequential Search

64

Sequential Search dapat diterapkan pada list kontigu (array) maupun list berkait.Insertion : dapat dengan menggunakan sentinelDeletion : pergeseran isi tabel (jika kontigu)

Pada pencarian yang dilakukan berulang-ulang, dapat diterapkan 2 macam metode optimasi : move-to-front

Isi tabel yang sering dicari, ditaruh di awal dari tabel.Contoh :Isi tabel : a b c d e f g hCari e : e a b c d f g hCari d : d e a b c f g h

transposition Perkembangan dari move to front. Memperkecil effort untuk memindahkan data ke paling depan.Isi tabel : a b c d e f g hCari e : a b c e d f g hCari e : a b e c d f g hCari e : a e b c d f g h

Implementasi :

int SeqSearch(TabInt T, int N, int X){ /* Mengembalikan posisi X pertama kali dalam tabel T[0..N-1], jika ditemukan; mengembalikan nilai -1, jika tidak ditemukan */

int i = 0; // indeks untuk pencarian

while (i < N) { if (T[i] == X) return (i);

i++; } // tidak ditemukan return (-1);}

Langkah-langkah pencarian :

Kasus 1 : Pencarian data yang dapat ditemukanKondisi awal

T = x = 14

i = 0

x tidak sama dengan T[0]

65

i = 1

x tidak sama dengan T[1]

i = 2

x sama dengan T[2]Data ditemukan

Kasus 2 : Pencarian data yang tidak dapat ditemukanKondisi awal

T = x = 15

i = 0

x tidak sama dengan T[0]

i = 1

x tidak sama dengan T[1]

i = 2

x tidak sama dengan T[2]

i = 3

66

x tidak sama dengan T[3]

i = 4

x tidak sama dengan T[4]Data tidak ditemukan

8.3 Indexed Sequential Search Optimasi sequential search pada tabel yang terurut dengan menggunakan sebuah tabel, yang disebut tabel index. Tabel index terdiri dari key (misalnya disebut kindex), dan pointer menuju record yang berelasi dengan kindex (misalnya disebut pindex). Perhatikan gambar berikut ini :

Insertion : pergeseran isi tabel (jika kontigu)

Deletion (jika kontigu) : dengan menggunakan flag untuk entry yang dihapus pergeseran isi tabel

Jika tabel index terlalu besar, dapat digunakan tabel index kedua. Perhatikan gambar berikut ini :

Binary SearchHanya dapat diterapkan pada list kontigu (array).

Insertion dan deletion : pergeseran isi tabel.

Implementasi :

67

int BinSearch(TabInt T, int N, int X){ /* Mengembalikan posisi X yang pertama kali ditemui dalam tabel T[0..N-1] secara dikhotomik. Nilai elemen tabel terurut membesar : T0 T1 T2 ... TN-1 */

int Atas, Bawah, Tengah; // indeks pencarian

Atas = 0; Bawah = N – 1; // batas atas dan bawah seluruh tabel while (Atas <= Bawah) { Tengah = (Atas + Bawah) / 2; if (X == T[Tengah]) return (Tengah);

else if (X < T[Tengah]) Bawah = Tengah – 1; else Atas = Tengah + 1; }

// tidak ditemukan return (-1);}

Langkah-langkah pencarian :

Kasus 1 : Pencarian data yang dapat ditemukanKondisi awal

T = x = 14atas = 0bawah = 4tengah = 2

x tidak sama dengan T[tengah]

atas = 0bawah = 1tengah = 0

x tidak sama dengan T[tengah]

atas = 1bawah = 1

68

tengah = 1

x sama dengan T[tengah]

Kasus 2 : Pencarian data yang tidak dapat ditemukanKondisi awal

T = x = 15

atas = 0bawah = 4tengah = 2

x tidak sama dengan T[tengah]

atas = 0bawah = 1tengah = 0

x tidak sama dengan T[tengah]

atas = 1bawah = 1tengah = 1

x tidak sama dengan T[tengah]atas = 2bawah = 1tengah = 1Tidak memenuhi atas ≤ bawah, maka pencarian dihentikanData tidak ditemukanOperasi dan Fungsi Dasar1. Pencarian key

69

adrNodeTag TrieSearch(adrNodeTag root, Key K){ int i = 0; while ((i < Len) && root) { if (K[i] == '\0 ') i = Len; // pencarian selesai else { // pencarian dilakukan pada cabang root = branch(root,K[i]); // pencarian dilakukan pada karakter selanjutnya i++; } } if (root && (! Info(root))) return (NIL); else return (root);}

2. Insertion

adrNodeTag Insert(adrNodeTag root, Key K, adrKeyInfo Info){ int i = 0; int ch;

if (! root) // buat trie baru { // Alokasi root

for (ch = 0; ch < Letters; ch++) branch(root,ch) = NIL;

Info(root) = NIL; }

while (i < Len) { if (K[i] == '\0 ') i = Len; // pencarian selesai else { if (branch(root,K[i])) // pencarian dilakukan pada cabang root = branch(root,K[i]); else { // Alokasi branch(root,K[i]) root = branch(root,K[i]); for (ch = 0; ch < Letters; ch++) branch(root,ch) = NIL;

Info(root) = NIL; } i++; // pencarian dilanjutkan untuk karakter selanjutnya } } if (Info(root) != NIL) printf("Key yang dimasukkan sama\n "); else Info(root) = Info;

return (root);}

3. DeletionMenggunakan ide yang sama dengan search dan insert, yaitu dengan menelusuri path yang berhubungan dengan key yang akan dihapus, dan setelah menemukan node yang tepat, kemudian mengubah field info menjadi NIL. Jika semua field pada

70

sebuah node sama dengan NIL (cabang dan info sama dengan NIL), maka hapus node tersebut.

71

BAB X SORTING [PENGURUTAN]

9.1 Struktur TabelStruktur tabel yang digunakan adalah sebagai berikut :

#define NMax 100

typedef int TabInt[NMax];

Jika diberikan sebuah tabel integer T[0..N-1] yang isinya sudah terdefinisi, maka akan dilakukan pengurutan elemen tabel sehingga tersusun membesar :T1 T2 T3 ... TN

9.2 Review Selection Sort

void SelectionSort(TabInt Arr, int count) { /* mengurutkan tabel integer [0..N-1] terurut membesar dengan selection sort */

int i, j; // i dan j adalah variabel untuk membantu menelusuri array Arr int min; // min adalah indeks tempat nilai minimum berada dalam array Arr int temp; // temp adalah variabel bantu untuk menukar dua bilangan

for (i=0; i<count-1; i++) { // cari indeks berisi elemen terkecil min = i; for (j=i; j<count; j++) if (Arr[j] < Arr[min]) min = j;

// tukar Array[min] dengan Array[i] temp = Arr[min]; Arr[min] = Arr[i]; Arr[i] = temp; }}

Langkah-langkah pengurutan :

Kondisi awalmin = 10i = 0

min = 14i = 1

72

min = 27i = 2

min = 35i = 3

Kondisi akhir

9.3 Review Insertion Sort

void InsertionSort(TabInt Arr, int count) { // mengurutkan tabel integer [0..N-1] dengan insertion sort

int i, j; // i dan j adalah variabel untuk membantu menelusuri array Arr int elmt; // elmt adalah elemen yang akan disisipkan pada array Arr int temp; // temp adalah variabel bantu untuk menukar dua bilangan

for (i=1; i<count; i++) { elmt = Arr[i]; // simpan dulu elemen yang akan dimasukkan

// cari mundur indeks elemen yang cocok untuk disisipkan for (j=i-1; ((j>0) && (elmt < Arr[j])); j--) // sambil menggeser elemen-elemen sesudahnya ke bawah Arr[j+1] = Arr[j];

if (elmt >= Arr[j]) // j adalah indeks elemen yang tepat, sisipkan elmt ke Arr[j+1] Arr[j+1] = elmt; else { /* sudah dicari sampai elemen 0 masih belum ada yang cocok artinya elemen 0 digeser ke elemen 1 supaya elmt bisa masuk ke elemen 0 */ Arr[j+1] = Arr[j]; // geser Arr[j] = elmt; // sisipkan } }}

Langkah-langkah pengurutan :

Kondisi awal

73

elmt = 35i = 1

elmt = 14i = 2

elmt = 51i = 3

elmt = 27i = 4

Kondisi akhir

9.4 Review Radix Sort / Radix Exchange SortIdenya adalah mengelompokkan nilai-nilai ke dalam sejumlah antrian berdasarkan dijit posisi tertentu; pengulangan dimulai dari posisi dijit terkecil (least significant digit) hingga posisi dijit terbesar (most significant digit). Banyaknya pass bergantung pada dijit maksimum nilai (m)

Contoh :Awal : T = {25,57,48,37,12,92,86,33}

Pass = 1 :Queue0 = {}Queue1 = {}Queue2 = {12,92}Queue3 = {33}Queue4 = {}Queue5 = {25}Queue6 = {86}Queue7 = {57,37}Queue8 = {48}Queue9 = {}

Akhir pass = 1 : T = {12,92,33,25,86,57,37,48}Pass = 2 :Queue0 = {}Queue1 = {12}Queue2 = {25}Queue3 = {33,37}Queue4 = {48}

74

Queue5 = {57}Queue6 = {}Queue7 = {}Queue8 = {86}Queue9 = {92}

Akhir pass = 2 : T = {12,25,33,37,48,57,86,92}

Perhatikan struktur Queue berikut ini :

typedef int InfoType;

typedef ... adrQueue;

typedef struct TElmtQ{ InfoType Info; adrQueue Next;} ElmtQ;

typedef struct TQueue{ adrQueue Head; } Queue;

Implementasi :

void RadixSort(TabInt T, int N, int M){ /* mengurutkan tabel T [0..N-1] dengan menggunakan metode radix sort M adalah maksimum dijit elemen tabel T */

Queue Q[10]; // array queue of integer int i, j, l; // indeks untuk traversal int k; // nilai pembagi untuk pencarian dijit ke-m int y; // dijit ke-m

for (i=0; i<10; i++) Head(Q[i]) = NIL;

k = 1; for (i=1 ; i<=M; i++) { for (j=0; j<N; j++) { y = (T[j] / k) % 10; // cari dijit ke-m InsertQ(&Q[y],T[j]); // sisip pada queue }

l = 0;

for (j=0; j<10; j++) { while (Q[j].Head != NIL) { DeleteQ(&Q[j],&T[l]); // hapus head Qj simpan ke Tl l++; } } k *= 10; }}

75

void InsertQ(Queue *Q, int Elemen){ adrQueue P, R;

// Alokasi P ...

Info(P) = Elemen; Next(P) = NIL;

// Insert if (! Head(*Q)) Head(*Q) = P; else { R = Head(*Q); while (Next(R)) { R = Next(R); }

Next(R) = P; }}

void DeleteQ(Queue *Q, int *Elemen){ adrQueue P;

// delete first P = Head(*Q); Head(*Q) = Next(P);

(*Elemen) = Info(P); Next(P) = NIL;

// dealokasi P ...}

9.5 Quicksort / Partition Exchange SortImplementasi :

void QuickSort(TabInt T, int left, int right){ /* mengurutkan tabel integer [left..right] dengan quicksort secara rekursif */

int mid; // nilai tengah

if (left < right) { mid = Partition (T, left, right); QuickSort (T, left, mid-1); QuickSort (T, mid+1, right); }}

int Partition(TabInt items, int left, int right){ /* mempartisi tabel integer [left..right] menjadi 2 buah partisi berdasarkan suatu nilai pivot */

int i = left - 1, j, x = items[right], y;

for(j=left; j<right; j++)

76

{ if (items[j] <= x) { i++;

// tukar items[i] dengan items[j] y = items[i]; items[i] = items[j]; items[j] = y;

} }

// tukar items[i + 1] dengan items[right] y = items[i + 1]; items[i + 1] = items[right]; items[right] = y;

return (i + 1);}

Langkah-langkah pengurutan :

Kondisi awalQuickSort(T,0,4)

left = 0right = 4mid = Partition(T,0,4)QuickSort(T,0,1)QuickSort(T,3,4)

Partition(T,0,4)

T =

i = -1x = 27j = 0

i = 0j = 1

i = 1j = 2

i = 1j = 3

77

T = mid = 2

QuickSort(T,0,1)left = 0right = 1mid = Partition(T,0,1)QuickSort(T,0,0)QuickSort(T,2,1)

Partition(T,0,1)

T =

i = -1j = 0

T = mid = 1

QuickSort(T,3,4)left = 3right = 4mid = Partition(T,3,4)QuickSort(T,3,3)QuickSort(T,5,4)

Partition(T,3,4)

T =

i = 2j = 3

i = 3j = 3

i = 3j = 4

T =

78

mid = 4

Kondisi akhir

9.6 Binary Tree SortStruktur binary search tree adalah sebagai berikut :

typedef int InfoType;

typedef ... adrBST; // bergantung representasi fisik, mengacu ke Node

typedef adrBST BST;

typedef struct TNode{ InfoType Info; int Count; BST Left; BST Right;} Node;

Implementasi :

void BinTreeSort(TabInt T, int N){ /* mengurutkan tabel integer [0..N-1] dengan membangun binary search tree */

int i; BST P = NIL;

for (i=0; i<N; i++) InsertBST(&P,T[i]);

i = 0; ToTable(P,T,&i);}

void InsertBST(BST *P, InfoType X){ /* I.S. P mungkin kosong F.S. X akan disisipkan sebagai elemen binary search tree P, jika nilai X sudah ada maka banyaknya kemunculan dari X bertambah 1

Proses : menyisipkan X menjadi elemen binary search tree */

if (*P == NIL) // Sisip { // alokasi *P ...

Info(*P) = X; Count(*P) = 1;

79

Left(*P) = NIL; Right(*P) = NIL; } else if (X < Info(*P)) InsertBST(&Left(*P),X); else if (X > Info(*P)) InsertBST(&Right(*P),X); else Count(*P)++;}

void ToTable(BST P, TabInt T, int *idx){ // copy isi pohon ke tabel dengan cara inorder

int i;

if (P != NIL) { ToTable(Left(P),T,idx);

// copy ke tabel for (i=0; i<Count(P); i++) { T[(*idx)] = Info(P); (*idx)++; }

ToTable(Right(P),T,idx); }}

Kondisi awal

Dalam bentuk pohon biner menjadi sebagai berikut :

ToTable(P,T,0)Proses node = 10

ToTable(Right(P),T,1)ToTable(Left(Right(P)),T,1)Proses node = 14

80

ToTable(Left(Right(Right(P))),T,2)Proses node = 27

Proses node = 35

ToTable(Right(Right(P)),T,4)Proses node = 51

Kondisi akhir

9.7 Shell SortShell Sort / Diminishing Increment Sort merupakan pengembangan insertion sort. Tabel yang akan diurutkan dibagi menjadi k (disebut increment / span) buah himpunan, lalu masing-masing himpunan akan diurutkan dengan menggunakan insertion sort.

Contoh :k = 5maka himpunan yang terbentuk adalah sebagai berikut :himpunan 1 : x1, x6, x11, ...himpunan 2 : x2, x7, x12, ...himpunan 3 : x3, x8, x13, ...himpunan 4 : x4, x9, x14, ...himpunan 5 : x5, x10, x15, ...

Langkah tersebut diulang untuk beberapa nilai k yang mengecil hingga k = 1. Nilai-nilai k harus ditentukan di awal proses pengurutan.

Contoh :k = {5, 3, 1}Perhatikan pemrosesan berikut ini :

81

Implementasi :

void ShellSort(TabInt T, int N, int Incs[], int NInc){ /* mengurutkan tabel T [0..N-1] dengan menggunakan metode shell sort

T adalah tabel integer yang akan diurutkan, N adalah jumlah elemen tabel T, Incs adalah tabel yang berisi nilai-nilai increment, NInc adalah jumlah elemen increment */

int pass, i, j; // indeks untuk traversal int temp; // variabel penampung sementara int span; // nilai increment

for(pass=0; pass<NInc; pass++) { span = Incs[pass];

// insertion sort pada setiap elemen himpunan for(i=span; i<N; i++) { temp = T[i]; j = i - span; while ((j >= 0) && (temp < T[j])) { T[j+span] = T[j]; j -= span; } T[j+span] = temp; } }}

Pemilihan nilai k menurut Knuth : Didefinisikan fungsi h sebagai berikut :

h(1) = 1h(i) = 3 * h(i–1) + 1,i 2

Implementasi :

int h(int n){ if (n == 1) return 1; else return( 3 * h(n - 1) + 1);

82

}

pilih x integer terkecil h(x) n tentukan banyaknya increment, misalnya NInc = x – 2 nilai-nilai increment :

Incsi = h(NInc–i+1) untuk i = 1, 2, .., Ninc

Implementasi :

void GenerateArrIncs(int Incs[], int *NInc, int n){ // generate array Incs

int i, x = 1, hx;

hx = h(x); while (hx < n) { x++; hx = h(x); }

(*NInc) = x - 1;

for (i=1; i<x; i++) Incs[i-1] = h(x-i);}

9.8 Merge Sort Idenya adalah menggabungkan 2 buah subtabel yang telah terurut (skema merging pada arsip sekuensial, versi and). Contoh :

Implementasi :

void MergeSort(TabInt T, int left, int right){ // mengurutkan tabel T [0..N-1] dengan menggunakan metode merge sort

int mid; // nilai tengah

83

if (left < right) { if ((right - left) == 1) { // elemennya tinggal dua if (T[left] > T[right]) { mid = T[left]; T[left] = T[right];

T[right] = mid;}

} else { mid = (left + right) / 2; MergeSort(T,left,mid); MergeSort(T,mid+1,right); Merge(T,left,mid,right); } }}

void Merge(int T[], int left, int mid, int right){ int i = left, j = mid + 1, k = 0; int temp[NMax];

// gabung while ((i <= mid) && (j <= right)) { if (T[i] < T[j]) { temp[k] = T[i]; i++; k++; } else { temp[k] = T[j]; j++; k++; } } // proses sub tabel yang tersisa while (j <= right) { temp[k] = T[j]; j++; k++; } while (i <= mid) { temp[k] = T[i]; i++; k++; } k = 0; for(i=left; i<=mid; i++) { T[i] = temp[k]; k++; } for(i=mid+1; i<=right; i++) { T[i] = temp[k]; k++; }}

84