Searching [pencarian] Algoritma Pemrograman mas.anto72@gmail.com 1 Jenis Pencarian Pencarian Internal proses pencarian dilakukan pada memori utama (RAM). Pencarian Eksternal proses pencarian dilakukan pada memori sekunder (tape, disk). 2 1
Algoritma Pencarian 1. Algoritma Pencarian Beruntun (sekuensial) 2. Algoritma Pencarian Beruntun dengan Sentinel 3. Algoritma Pencarian Bagidua (Binary Search) 3 Algoritma PencarianSekuensial Proses membandingkan setiap elemen array satu per satu secara beruntun, mulai dari elemen pertama sampai elemen yang dicari ditemukan atau seluruh elemen array diperiksa. Terdapat 2 metode pencarian sekuensial Pada data tidak terurut Pada data terurut 4 2
Pencarian Sekuensial Data Tidak Terurut Contoh : 13 16 14 21 76 21 1 2 3 4 5 6 Misalkan nilai yang dicari : X=21 Maka, elemen yang diperiksa : 13, 16, 14, 21 (ditemukan) Indeks array yang dikembalikan : IX=4 Misalkan nilai yang dicari : X=13 Maka, elemen yang diperiksa : 13 (ditemukan) Indeks array yang dikembalikan : IX=1 Misalkan nilai yang dicari : X=15 Maka, elemen yang diperiksa : 13, 16, 14, 21, 76, 21 (tidak ditemukan) Indeks array yang dikembalikan : IX=0 5 Algoritma Pencarian Sekuensial Data Tidak Terurut(1) Deklarasi Global Const Nmaks = 100 Type larik100 = Array[1..nMaks] of Integer Procedure CariRuntun1(input L : larik100, input N:integer, input X : integer, input/output IX:integer) Deklarasi Lokal I : integer Algoritma I =1 While (I<N) and (L[I[ <> X) do I = I + 1 End While If (L[I] <> X) Then IX =0 Else IX=I Endif Algoritma ini mempunyai kelemahan, walaupun sudah ditemukan tapi proses pencarian tetap dilakukan. 6 3
Algoritma Pencarian Sekuensial Data Terurut Procedure CariRuntunUrut(input L : larik100, input N:integer, input X : integer, input/output IX:integer) Deklarasi Lokal I : integer Algoritma I =1 While (I<N) and (L[I]<X) do I = I + 1 End While If (L[I]=X) Then IX =I Else IX=0 Endif 7 Pencarian Sekuensial Sentinel Menambahkan elemen fiktif setelah elemen terakhir dan elemen tersebut adalah nilai yang dicari. Jika yang dicari pada elemen fiktif, bisa dipastikan yang dicari tidak ditemukan. 8 4
Algoritma Pencarian Sekuensial Sentinel (1) Contoh 1: 13 16 14 21 76 21 1 2 3 4 5 6 Misalkan elemen yang dicari adalah X=21, maka tambahkan 21 sebagai elemen sentinel di L[N+1] Elemen yang diperiksa selama pencarian 13, 16, 14, 21, indeks larik yang dikembalikan : 4, karena 4 <> N+1, berarti X=21 terdapat didalam larik L 13 16 14 21 76 21 21 1 2 3 4 5 6 7 Contoh 2: Misalkan elemen yang dicari adalah X=15, maka tambahkan 15 sebagai elemen sentinel di L[N+1] 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 didalam larik L 13 16 14 21 76 21 15 1 2 3 4 5 6 7 9 Algoritma Pencarian Sekuensial Sentinel (2) Procedure CariSentinel(input L : larik100, input N:integer, input X : integer, input/output IX:integer) Deklarasi Lokal I : integer Algoritma L[N+1]=X I =1 While (L[I]<>X) do I = I + 1 End While If (I<N+1) Then IX =I Else IX=0 Endif 10 5
Pencarian Bagidua (Binary Search) Syarat utama adalah datanya sudah urut baik menaik atau menurun. Langkah-langkah : Langkah 1 : Bagi dua elemen array pada elemen tengah. Elemen tengah adalah elemen dengan indeks k=(ia+ib) div 2. Elemen ini membagi 2 array, bagian kiri L[Ia..k-1] dan bagian kanan L[k+1..Ib] Langkah 2 : Periksa apakah L[k]=X. Jika L[k]=X, pencarian dihentikan sebab X sudah ditemukan. Tetapi, jika L[k]<>X, harus ditentukan apakah pencarian akan dilakukan di array bagian kiri atau dibagian kanan. Jika L[k[<X, maka pencarian dilakukan pada bagian kiri. Sebaliknya, jika L[K]>X, pencarian dilakukan pada array bagian kanan. Langkah 3 : Ulangi langkah 1 sampai X ditemukan atau Ia>Ib. 11 Ilustrasi Binary Search (1) 81 76 21 18 16 13 10 7 Ia=1 2 3 4 5 6 7 8=Ib Misalkan elemen yang dicari adalah X=16 Langkah 1 : Ia=1 dan Ib=8 Indeks elemen tengah k=(1+8) div 2 = 4 81 76 21 18 16 13 10 7 Ia=1 2 3 4 5 6 7 8=Ib kiri kanan Langkah 2 : L[4]=16? tidak Harus diputuskan apakah pencarian akan dilakukan di bagian kiri atau kanan dengan pemeriksaan sebagai berikut : L[4]> 16? Ya, lakukan pencarian array bagian kanan dengan Ia=k+1=5 dan IB=8 (tetap) 12 6
Ilustrasi Binary Search (2) 16 13 10 7 Ia=5 6 7 8=Ib Langkah 1 : 16 13 10 7 Ia=5 dan Ib=8 Ia=5 6 7 8=Ib Indeks elemen tengah k=(5+8) div 2 = 6 kiri kanan Langkah 2 : L[6]=16? tidak Harus diputuskan apakah pencarian akan dilakukan di bagian kiri atau kanan dengan pemeriksaan sebagai berikut : L[6]> 16? Tidak, lakukan pencarian array bagian kiri dengan Ia=5 dan IB=k-1=5 16 I5 Langkah 1 : Ia=5 dan Ib=5 Indeks elemen tengah k=(5+5) div 2 = 5 Langkah 2 : L[5]=16? Ya, X ditemukan, pencarian dihentika 16 I5 13 Algoritma Binary Search (1) Procedure CariBinarySearch(input L : larik100, input N:integer, input X : integer, input/output IX:integer) Deklarasi Lokal Ia, Ib : Integer K: Integer ketemu= : boolean Algoritma Ia=1 Ib=N Ketemu=false While (not ketemu) and (Ia<=Ib) do k=(ia+ib) div 2 If (L[k]=X) then ketemu=true else 14 7
Algoritma Binary Search (2) if (L[k] < X) then Ia=k+1 else Ib=K-1 endif endif Endwhile If (ketemu) then IX=k Else IX=0 endif 15 Latihan 81 76 21 18 16 13 10 7 Ia=1 2 3 4 5 6 7 8=Ib Tuliskan langkah pencarian dari array diatas untuk bilangan 81 dan 10 16 8