Halaman. 2 Algoritma pencarian beruntun versi boolean :
7. 1. 2 Pencarian Beruntun dengan Sentinel Sentinel
merupakan elemen fiktif yang sengaja ditambahkan sesudah elemen terakhir larik. Jika elemen terakhir larik adalah L[N], maka sentinel dipasang pada elemen L[N + 1]. Sentinel ini harganya
sama dengan da ta yang di cari. Akibatnya, proses pencarian selalu berhasil menemukan data yang dicari. Walaupun demikian harus diperiksa lagi letak data tersebut ditemukan, apakah :
i diantara elemen-elemen larik sesungguhnya yaitu dari L[1] sampai L[N], atau ii pada elemen fiktif yaitu L[N + 1] yang berarti X sesungguhnya tidak terdapat di dalam larik L.
Jika X tidak ditemukan, maka sentinel tesebut sekaligus sudah ditambahkan. Perlu diingat batas pendefinisian indeks larik, sebab komputer tidak boleh mengakses elemen larik yang indeksnya
melebihi rentang indeks yang sudah didefinisikan. Perhatikan larik di bawah ini :
13 16 14 21 76 21 1 2 3 4 5 6
N = 6 jumlah elemen larik semula i Misalkan elemen yang dicari adalah X = 21. Maka tambahkan 21 sebagai elemen sentinel di L [N
+ 1] : 13 16 14 21 76 21 21
1 2 3 4 5 6 7 Elemen yang diperiksa selama pencarian : 13, 16, 14, 21
Indeks larik yang dikembalikan : 4 Karena 4
≠ N+1 berarti X = 21 terdapat di dalam larik L semula. ii Misalkan elemen yang dicari adalah X = 13. Maka tambahkan 13 sebagai elemen sentinel di L [N
+ 1] :
Procedure cari runtun_versibooleanL:larik, n:integer; x:integer; var idxX:integer; {mencari X di dalam larik L[1..N] secara beruntun, dimulai dari elemen pertama sampai X ditemukan
atau seluruh elemen larik L sudah diperiksa. Keluaran dari proses ini adalah indeks idxX dimana L[idxX] :=X. idxX berharga 0 jika X tidak ditemukan versi boolean}
Var i : integer; {indeks untuk pencarian}
ketemu : integer;
Begin
i :=
1; ketemu := false;
{periksa selama i = n dan ketemu masih bernilai false}
while i = n and not ketemu do begin
i f L[i] = x then ketemu := true
{hentikan proses
pencarian}
else i := i + 1;
{maju ke elemen berikutnya}
end;
{i n atau ketemu = true} {simpulkan hasil pencarian}
if ketemu then idxX := i
else idxX := 0;
End;
Halaman. 3 13 16 14 21 76 21 13
1 2 3 4 5 6 7 Elemen yang diperiksa selama pencarian : 13
Indeks larik yang dikembalikan : 1 Karena 1
≠ N+1 berarti X = 13 terdapat di dalam larik L semula. iii Misalkan elemen yang dicari adalah X = 15. Maka tambahkan 15 sebagai elemen sentinel di L [N
+ 1] : 13 16 14 21 76 21 15
1 2 3 4 5 6 7 Elemen yang diperiksa selama pencarian : 13, 16, 14, 21, 76, 21, 15
Indeks larik yang dikembalikan : 7 Karena 7 = N+1 berarti X = 15 tidak terdapat di dalam larik L semula.
Algoritma Pencarian Beruntun dengan Sentinel 7.1.3 Pencarian Beruntun pada Larik yang Terurut
Secara singkat proses pencarian pada tabel terurut adalah sebagai berikut : Dimulai dari elemen pertama pada tabel dilakukan pembandingan dengan elemen yang dicari. Jika elemen dalam tabel
masih lebih kecil dari elemen yang dicari, pencarian dihentikan dan bisa dipastikan bahwa elemen yang dicari memang tidak ditemukan.
Jika elemen yang dicari tidak ditemukan dan kits ingin menyisipkan elemen tersebut pada posisinya yang tepat, maka seringkali diperlukan adanya penggeseran terhadap elemen-elemen yang
nantinya akan terletak pada subskrib yang lebih besar dari elemen yang dicari.
Const max : integer = 10; {jumlah maksimum elemen larik}
Type Larik = array [1..max+1] of integer; {tipe larik} Procedure cari beruntunsentinelL:larik, n:integer; x:integer; var idxX:integer;
{mencari X di dalam larik L[1..N] secara beruntun dimulai dari elemen pertama sampai X ditemukan atau seluruh elemen larik L sudah diperiksa. Keluaran dari proses ini adalah indeks idxX dimana L[idxX] :=X. idxX berharga 0
jika X tidak ditemukan} Var i : integer;
{indeks untuk pencarian} ketemu : boolean;
Begin
i := 1; ketemu := false;
{periksa selama I = N dan ketemu masih bernilai false} while I = N and not ketemu do
begin
if L[I] = X then ketemu : = true {hentikan proses pencarian}
else {L[I]
≠X} I := I + 1;
{maju ke elemen berikutnya}
end;
{I N or ketemu = true} if ketemu then
{X ditemukan}
idxX := I else
{X tidak ditemukan di dalam larik}
idxX := 0; End;
Halaman. 4 7. 2. Pencarian Biner Bagi Dua
Binary Search Pencarian duabiner binary search merupakan metode pencarian yang diterapkan pada
sekumpulan data yang sudah terurut baik secara ascending maupun descending. Salah satu keuntungan data yang terurut adalah memudahkan pencarian dalam hal ini adalah pencarian bagidua. Syarat
utama penerapan pencarian bagi dua adalah data yang sudah terurut ascendingmenaik atau descendingmenurun
. Selama proses pencarian diperlukan dua buah indeks larik yaitu indeks terkecil
dan indeks terbesar. Indeks terkecil sebagai indeks ujung kiri larik dan terbesar sebgai indeks ujung kanan larik.
Istilah kiri dan kanan dinyatakan dengan membayangkan elemen larik terentang
horizontal.
Misalkan indeks kiri adalah Atas a dan indeks kanan adalah Bawah b. Pada mulanya, ia=1 dan ib=N
.
Langkah 1 : Bagi dua elemen larik pada elemen tengah. Elemen tengah adalah elemen dengan indeks
k = a + b div 2. Elemen tengah, L[k], membagi larik menjadi dua bagian, yaitu bagian
kiri L[ia..k-1] dan bagian kanan L[k+1..ib].
Langkah 2 : Periksa apakah L[k] = X X adalah elemen yang dicari dalam larik. Jika L[k] = X,
pencarian dihentikan karena X ditemukan. Jika L[k] X , harus ditentukan apakah pencarian akan dilakukan pada larik bagian kiri atau bagian kanan. Jika L[k] X, maka
pencarian dilakukan pada larik bagian kiri. Sebaliknya, jika L[k] X, pencarian dilakukan pada larik bagian kanan.
Langkah 3 : Ulangi langkah 1 sampai X ditemukan atau ia ib yaitu ukuran larik sudah nol.
Contoh pencarian biner : Misalakan diberikan larik L, dengan 8 elemen yang sudah terurut descending seperi berikut :
Procedure cari runtun_ascaendinga:larik, var ada:boolean;var n:integer; var posisi:integer; data :integer; {elemen vektor bertipe integer. Jika data yang dicari ditemukan, letaknya disimpan sebagai peubah posisi. Jika tidak
ditemukan, data baru tersebut akan disisipkan ke dalam vektor} Var i, j : integer;
{indeks untuk pencarian}
Begin
i := 1; j:=0; ada := false;
repeat if a[i] = data then
{elemen yang dicari ditemukan} begin
posisi := i; ada := true;
end else if a[i] data then
{elemen yang dicari tidak ditemukan}
begin j := i;
{posisi elemen yang baru}
i :=
N-1; end;
inci; until i = n or ada;
if not ada then
{data tidak ketemu} begin
if j = 0 then {elemen baru menempati subkrib terakhir}
a [n+1] := data; else
{menyisip di tengah} begin
for i := n downto j do {menggeser elemen}
a[i+1] := a[i]; a[j]
:= data;
{menempatkan elemen baru}
end; inc
n; {menambah ukuran vektor}
end; End;
Halaman. 5 94 67 55 44 42 18 12 06
ia=1 2 3 4 5 6 7
ib=8 i Misalkan elemen yang di cari adalah X = 44.
Langkah 1 : ia = 1 dan ib = 8.
Indeks elemen tengah k = 1 + 8 div 2 = 4 diarsir 94 67 55 44 42 18 12 06
1 2 3 4 5 6 7 8 Langkah 2 :
L[4] = 44 ? Ya. X ditemukan, pencarian dihentikan.
ii Misalkan elemen yang di cari adalah X = 42.
Langkah 1 : ia = 1 dan ib = 8.
Indeks elemen tengah k = 1 + 8 div 2 = 4 diarsir 94 67 55 44 42 18 12 06
ia=1 2 3 4 5 6 7
ib=8 Langkah 2 :
L[4] = 42 ? Tidak. Harus diputuskan apakah pencarian akan dilakukan di bagian kiri atau bagian kanan dengan pemeriksaan sbb :
L[4] 42? Ya. Lakukan pencarian pada larik bagian kanan dengan ia = k + 1 = 4 +1 = 5 dan ib = 8 tetap
42 18 12 06 ia=5 6 7 ib=8
Langkah 1’ : ia = 5 dan ib = 8.
Indeks elemen tengah k = 5 + 8 div 2 = 6 diarsir 42
18 12 06 5 6 7 8
Langkah 2’ : L[6] = 42 ? Tidak. Harus diputuskan apakah pencarian akan dilakukan di bagian kiri atau bagian kanan
dengan pemeriksaan sbb : L[6] 42? Tidak. Lakukan pencarian pada larik bagian kiri dengan
ia = 5 tetap dan ib = k - 1 = 6 –1 = 5 42
5 kiri
kanan
kiri kanan
Kiri’ Kanan’
:
Halaman. 6 Langkah 1’’ :
ia = 5 dan ib= 5 Indeks elemen tengah k = 5 + 5 div 2 =5 diarsir
42 5
Langkah 2’’ L[5] = 42 ? Ya. X ditemukan, pencarian dihentikan
iii Misalkan elemen yang di cari adalah X = 97.
Langkah 1 : ia = 1 dan ib = 8.
Indeks elemen tengah k = 1 + 8 div 2 = 4 diarsir 94 67 55 44 42 18 12 06
ia=1 2 3 4 5 6 7
ib=8 Langkah 2 :
L[4] = 97 ? Tidak. Harus diputuskan apakah pencarian akan dilakukan di bagian kiri atau bagian kanan dengan pemeriksaan sbb :
L[4] 97? Tidak. Lakukan pencarian pada larik bagian kiri dengan ia = 1 tetap dan ib = k – 1 = 4 – 1= 3
94 67 55 ia=1 2 ib=3
Langkah 1’ : ia = 1 dan ib = 3.
Indeks elemen tengah k = 1 +3 div 2 = 2 diarsir 94
67 55 1 2 3
Langkah 2’ : L[2] = 97 ? Tidak. Harus diputuskan apakah pencarian akan dilakukan di bagian kiri atau bagian kanan
dengan pemeriksaan sbb : L[2] 97? Tidak. Lakukan pencarian pada larik bagian kiri dengan
ia = 1 tetap dan ib = k - 1 = 2 –1 = 1 94
1 Langkah 1’’ :
ia = 1 dan ib= 1 :
kanan kiri
Kiri’ Kanan’
:
Halaman. 7
Indeks elemen tengah k = 1 + 1 div 2 =1 diarsir
94 1
Langkah 2’’ ::
L[1] = 97 ? Tidak. Harus diputuskan apakah pencarian akan dilakukan di bagian kiri atau bagian kanan dengan pemeriksaan sbb :
L[1] 97? Tidak. Lakukan pencarian pada larik bagian kiri dengan ia = 1 tetap dan ib = k - 1 = 1 – 1 = 0
karena ia ib, maka tidak ada lagi bagian larik yang tersisa. Jadi, X tidak ditemukan di dalam larik , pencarian dihentikan.
Algoritma pencarian bagidua biner Untuk pencarian biner pada larik yang sudah terurut menaik, hanya perlu mengganti
If L[k] X then dengan
If L[k] X then Untuk larik berukuran N elemen
- algoritma pencarian beruntun melakukan pembandingan elemen larik sebanyak N kali.
- algoritma pencarian biner melakukan pembandingan elemen larik sebanyak
2
logN kali. Karena
2
logN N untuk N yang besar, maka algoritma pencarian biner lebih cepat daripada algoritma beruntun.
:
Procedure cari binerdescendingL:larik, n:integer; x:integer; var idxX:integer; {mencari X di dalam larik L[1..N] yang sudah terurut menaik dengan metode pencarian biner. Keluaran
dari proses ini adalah indeks idxX dimana L[idxX] :=X. idxX berharga 0 jika X tidak ditemukan} Var ia, ib, k : integer;
ketemu : boolean; Begin
ia := 1; ib
:= N;
ketemu := false;
while not ketemu and ia = ib do begin
k := ia + ib div 2;
{bagidua larik L pada posisi k} if L[k] = X then
ketemu : = true else
{L[k] ≠X}
if L[k] X then {akan dilakukan pencarian pada larik begian kanan, set indeks ujung kiri larik yang baru}
ia : = k + 1 else
ib : = k – 1;
end;
{ketemu = true or ia ib} if ketemu then
{X ditemukan}
idxX := k else
{X tidak ditemukan di dalam larik}
idxX := 0; End;
Halaman. 1
BAB VI RECURSIVE
- Rekursif adalah proses pemanggilan dirinya sendiri fungsi atau prosedur. - Fungsi maupun prosedur yang memanggil dirinya disebut fungsi atau prosedur rekursif.
- Fungsi antuk suatu bagian program yang mengembalikan menghasilkan hanya satu nilai. Sebuah function call adalah suatu ekspresi jadi ia memberikan satu nilai.
- Procedure adalah suatu bagian program yang melakukan aksifungsi khusus, biasanya berdasarkan sekumpulan parameter. Sebuah procedure call adalah suatu statemen, jadi ia melakukan aksi.
- Banyak obyek dalam matematika didefinisikan dengan menampilkan suatu proses untuk menghasilkan obyek-obyek tsb.
- Misalnya : n faktorial ndidefinisikan sebagai produk dari semua integer diantara n dan 1. - Contoh lain adalah bilangan asli.
1 adalah bilangan asli. Successor dari 1 adalah bilangan asli.
- Perbedaan rekursi dengan prosedurfungsi adalah rekursi bisa memanggil kedirinya sendiri tetapi prosedur atau fungsi harus dipanggil lewat pemanggil prosedurfungsi.
- Ciri masalah yang dapat diselesaikan secara rekursif adalah masalah tersebut dapat direduksi menjadi satu atau lebih masalah-masalah serupa yang lebih kecil.
- Secara umum suatu algoritma rekursif selalu mengandung 2 macam kasus : 1. satu atau lebih kasus yang pemecahan masalahnya dilakukan dengan menyelesaikan masalah
serupa yg lebih sederhana menggunakan recursive call. 2. satu atau lebih kasus pemecahan masalahnya dilakukan tanpa recursive call. Kasus ini disebut
kasus dasar atau penyetop. - Supaya tidak terjadi rekursif tak hingga, maka setiap langkah rekursif haruslah mengarah ke kasus
penyetop. - Sistem komputer mengikuti jalannya program yang rekursif biasanya dengan menggunakan suatu
struktur data yang disebut stack. - Ketika eksekusi program sampai pada suatu rekursif call, ia menghentikan sementara komputasi yg
sedang dilaksanakannya sekarang untuk melakukan recursive call tsb, agar ia dapat kembali ke keadaan semula setelah recursive call itu selesai , ia harus menyimpan informasi yang cukup.
Informasi yg diperlukan disebut activation frame. - Activation frame disimpan pada bagian memori yg diatur dalam benruk stack.
- Rekursif yang berlapis-lapis dapat menghabiskan memori yang mengakibatkan stack overflow. - Masalah yg mempunyai solusi rekursif juga mempunyai solusi iteratifmenggunakan loop.
- Versi iteratif seringkali lebih efisien daripada versi rekursif karena rekursif biasanya menggunakan memori yg lebih besar dan memerlukan waktu ekstra u penanganan stack of activation frame.
Contoh 1 menghitung faktorial : n = 1 jika n = 0 atau n=1
n = n n-1 n-2 … 1, jika n 0 Algoritma untuk definisi secara iteratif :
Halaman. 2 x n
hasil 1 while x 0 do
begin hasil hasilx
x x-1 endwhile
Definisi diatas dapat juga dituliskan sbb : n = 1 jika n = 0 atau n=1
n = n n-1 , jika n 0 Algoritma untuk definisi secara rekursif:
Faktorialn If n = 0 or n = 1 then faktorial 1
Else faktorial faktorial n-1n endif
endfaktorial
Jika dituliskan dalam bentuk fungsi secara rekursif : Uses Crt;
Function faktorialN:integer:integer; Begin
If N=0 or N=1 then Faktorial := 1
Else Faktorial := N Faktorial N-1;
End; Var
N:byte; {Program Utama}
Begin Clrscr;
Write‘Berapa faktorial : ‘;ReadlnN; Writeln‘Faktorial = ‘,faktorialN;
Readln; End.
Contoh pencarian nilai 5 secara rekursif : 5 = 54
Scr rekursif 4 Dihitung kembali sebesar 43 sehingga : 5 = 543
Scr rekursif 3 Dihitung kembali sebesar 32 sehingga : 5 = 5432
Scr rekursif 2 Dihitung kembali sebesar 21 sehingga : 5 = 54321 = 120
Jika dituliskan dalam bentuk prosedur secara rekursif :
Uses Crt; Procedure faktorialN:integer;var hasil : integer;
Begin If N=0 or N=1 then
hasil := 1 Else
begin Hasil:=hasiln;
Faktorial N-1,hasil; End;
End; Var
N,f:integer; {Program Utama}
Halaman. 3 Begin
Clrscr; Write‘Berapa faktorial : ‘;ReadlnN;
Faktorialn,f; Writeln‘Faktorial = ‘,f;
Readln; End.
Contoh 2 populer yang sering digunakan untuk menjelaskan proses rekursif adalah fungsi penjumlahan dengan mengggunakan sigma.
Perhatikan fungsi dibawah ini : function Summation num : integer : integer;
begin if num = 1 then
Summation := 1 else
Summation := Summationnum-1 + num; end;
Asumsikan fungsi diatas dipanggil seperti dibawah ini : a := Summation3;
maka proses yang terjadi adalah : - Summation 3 menjadi Summation 2 + 3
- Summation 2 menjadi Summation 1 + 2 - Pada saat num=1 proses berhenti dan summation bernilai sama dengan 1
- Summation2 menjadi 1 + 2 - Summation3 menjadi 3 + 3
- Dan akhirnya penjumlahan 3 bilangan menjadi 6
Halaman. 1
BAB VIII POINTER
Tipe data pointer digunakan pada pemrograman dinamis, artinya kebutuhan memori tergantung saat program dieksekusi. Berbeda dengan pemrograman yang menggunakan predefined-types
sebelumnya, dimana kebutuhan memori ditetapkan saat pendefinisian tipe data sehingga bisa berakibat memori yang teralokasi tidak semuanya terpakai, seperti penggunaan array larik. Pemrograman
seperti ini dikenal sebagai pemrograman memori statis.
8.1 Pengertian Pointer
Lihat potongan program di bawah ini :
Type pointer : integer; Var a : integer;
pa : pointer; Begin
a : = 10; pa : = a;
…..
Sebelum a diberi nilai, a ditempatkan oleh sistem ke suatu alamat memori tertentu. Demikian juga pointer pa, sebelum diberikan nilai, pa menunjuk kepada suatu tipe data integer tak tentu. Nilai a adalah suatu nilai yang
terletak didalam jangkauan tipe integer, sedangkan nilai pa adalah alamat memori suatu variabelpengenal dengan tipe integer lihat gambar. Oleh karena itu untuk mengakses sebuah pointer untuk kasus diatas digunakan operator
isi atap atau simpul.
8.2 Deklarasi Pointer
Type pengenal = simpul; Simpul
= tipe;
Contoh : type bil_bulat = integer; var i, j : bil_bulat;
Umumnya tipe berupa rekaman struktur record, misal deklarasi : Type str30 = string[30];
point = data; data = record
nomer : integer; nama_peg : str30;
alamat : str30; pekerjaan : str30;
end; Kemudian bentuk definisinya :
var P1, P2 : point;
a,b,c : str30; Agar nampak bahwa P1 dan P2 bersifat dinamis terhadap kebutuhan memori, deklarasi di atas
dimodifikasi sebagai berikut : Type str30 = string[30];
point = data; a
??? 10100
20200 pa
. ???
a 10
10100 20200
pa .