Chapter 9 SEARCHING ALGORITHM Program Studi Ekstensi DTE FTUI Slides © 2007
Definisi (dari Wikipedia) Dalam ilmu komputer, sebuah algoritma pencarian dijelaskan secara luas adalah sebuah algoritma yang menerima masukan berupa sebuah masalah dan menghasilkan sebuah solusi untuk masalah tersebut, yang biasanya didapat dari evaluasi beberapa kemungkinan solusi.ilmu komputermasukan Sebagian besar algoritma yang dipelajari oleh ilmuwan komputer adalah algoritma pencarian. Himpunan semua kemungkinan solusi dari sebuah masalah disebut ruang pencarian.ruang pencarian
#1 Sequential Search – Diketahui: larik l berisi data sebanyak n, apakah ada data x didalam larik l ; jika ada, catat indeks dimana x ditemukan
Pengembangan algoritma #1 Func CariBerturutan (x, l, n) i := 1 while i l[i] do i := i + 1 ewhile if i > n then return (0) else return (i) eif efunc
Pengembangan algoritma #1 Func CariBerturutan (x, l, n) i := 1 ketemu := false while not ketemu and i <= n do if x = l[i] then ketemu := true else i := i + 1 eif ewhile if ketemu then return (i) else return (0) eif efunc
#2 Searching with sentinel Algoritma sebelumnya, jumlah pemeriksaan dilakukan sebanyak 2n (why?) Bagaimana agar pemeriksaan hanya dilakukan sebanyak n saja?
Analisa algoritma Sebelumnya setiap pemeriksaan apakah x=l[i], selalu didahului oleh pemeriksaan apakah i<=n Pemeriksaan i<=n dapat dihilangkan, asal dijamin bahwa pasti ditemukan data x didalam larik l. Untuk itu pada elemen larik ke n+1 dimasukkan x sebagai sentinel (sehingga i tidak melewati batas akhir larik)
Analisa algoritma Jika data x ditemukan pada indeks n+1, berarti bahwa x tidak ada didalam larik l, dan jika x ditemukan pada indeks selain n+1, berarti x ditemukan
Pengembangan Algoritma Func CariSentinel (x, l, n) l[n+1] := x {pasang sentinel} i := 1 while x <> l[i] do i := i + 1 ewhile if i = n + 1 then return (0) {x tidak ditemukan} else return (i) eif efunc
#3. Dichotomy Search Diterapkan pada data yang sudah terurut Ide: – Periksa apakah x berada ditengah larik l. – Jika ada maka berhenti. – Jika x lebih kecil dari elemen tengah larik, maka pencarian bagi-dua dilakukan pada sebelah kiri elemen tengah. – Dianggap bahwa data terkecil ada disebelah kiri dan data terbesar ada di sebelah kanan.
#3. Dichotomy Search Jika x lebih besar dari elemen tengah larik, maka pencarian bagi-dua dilakukan pada sebelah kanan elemen tengah. Pencarian dilakukan terus sampai ditemukan x atau bagian larik yang akan dicari sudah habis.
Analisa Perhatikan ilustrasi berikut ini Mis. larik l terdiri dari 10 elemen dan data yang tersimpan telah terurut Titik tengah larik dihitung berdasarkan : tengah := (kiri+kanan) div 2
Ilustrasi 25 x kiritengahkanan kirikanan
Ilustrasi kiritengahkanan kirikanan
Pengembangan Algoritma Func CariBagiDua (x, l, n) kiri := 1 {batas kiri pencarian} kanan := n {batas kanan pencarian} ketemu := false while not ketemu and kiri <= kanan do tengah := (kiri+kanan) div 2 if x = l[tengah] then ketemu := true else if x < l[tengah] then kanan := tengah-1 else kiri := tengah + 1 eif ewhile If ketemu then return (tengah) else return (0) eif efunc
Simulasi dan Program (Compiler: Pascal)
BINARY SEARCH BINARY SEARCH SEQUENTIAL SEARCH SEQUENTIAL SEARCH SENTINEL SEARCH SENTINEL SEARCH SEARCHING METHOD
SELESAI SEARCHING
Sequential Search Procedure Seqsearch( A[], X, N, IX) Var I : int; Begin I:=1 I:=1 While (I X) do While (I X) do I := I + 1; If (L[I] <> X) then IX := 0 If (L[I] <> X) then IX := 0 else IX := I; else IX := I;End; Simulation
Sentinel Search Procedure Sentsearch( L[], X, N, IX) Var I : int; Begin L[N+1] := X; L[N+1] := X; I:=1 I:=1 While (L[I] <> X) do While (L[I] <> X) do I := I + 1; If (I < N+1) then IX := I If (I < N+1) then IX := I else IX := 0; else IX := 0;End; Simulation
Binary Search Simulation Procedure Binsearch( L[], X, N, IX) Begin Ia:=1; Ib:=N; ketemu := False; Ia:=1; Ib:=N; ketemu := False; While (Not ketemu) and (Ia <= Ib) do While (Not ketemu) and (Ia <= Ib) do Begin Begin k := (Ia + Ib) div 2; k := (Ia + Ib) div 2; if (L[k] = X) then if (L[k] = X) then ketemu := true ketemu := true else else if (L[k] > X) then Ia := k + 1 if (L[k] > X) then Ia := k + 1 else Ib := k – 1; else Ib := k – 1; end; end; If (ketemu) then IX := k Else IX := 0; End;