Algoritma Pencarian (searching)
Definisi Algoritma Pencarian Proses pencarian adalah menemukan nilai (data) tertentu dalam sekumpulan data yang bertipe sama (tipe dasar atau tipe bentukan) larik (array) Pencarian (searching) merupakan proses yg mendasar dalam pengelohana data. Contoh: UPDATE, INSERT.
Spesifikasi Masalah Pencarian : Hasil/keluaran dari persoalan pencarian bergantung pada spesifikasi rinci dari persolan tersebut, seperti hasil/keluaran: Sebuah pesan (message) : ditemukan atau tidak ditemukan di dalam Larik. Contoh : write(‘ditemukan’) atau write(‘ tidak ditemukan’) Indeks emelen Larik dari data/nilai yg ditemukan, jika tidak ditemukan indeks diisi dg harga khusus, misal:-1 Contoh: x= 76 idx=3, x=100 idx=-1 Nilai boolean yg menyatakan status hasil pencarian : jika ada data/nilai ditemukan, maka peubah/variabel yg bertipe boolean diisi dg true, dan kalau tidak ketemu diisi dengan false. Contoh: x= 76 ketemu=true, x=100 ketemu= false Spesifikasi Masalah Pencarian :
Pencarian untuk duplikasi data : Apabila data yang dicari terdapat lebih dari satu banyaknya, maka hanya data yang pertama kali ditemukan yang diacu, dan algoritma pencarian selesai. Contoh : Larik A mempunyai dua buah nilai 42, maka algoritma selesai ketika nilai 42 pertama ditemukan, yaitu pada elemen ke-6, dan hasilnya adalah idx = 6, atau ketemu = true. Nilai 42 lainnya tidak dipertimbangkan lagi dalam pencarian.
Metode pencarian data di dalam array diklasifikasikan menjadi dua, yaitu : Metode pencarian beruntun (sequantial search) Metode pencarian bagi dua/pencarian biner (binary search)
Metode pencarian beruntun (sequantial search) Disebut juga dengan pencarian lurus (linear search) Proses membandingkan setiap elemen larik(array) satu persatu beruntun, mulai elemen pertama sampai elemen yg dicari ditemukan, atau seluruh elemen sudah diperiksa
Contoh : Metode pencarian beruntun (sequantial search) Misalkan nilai yang dicari adalah 42 Pemeriksaaan dilakukan terhadap elemen 60, 12, 76, 23, 11, 42 (ditemukan) Ternyata nilai ditemukan pada elemen ke 6 : Indek larik yang dikembalikan : idx 6 Proses pencarian dihentikan. Misalkan nilai yang dicari adalah 20 Pemeriksaan dilakukan terhadap elemen 60, 12, 76, 23, 11, 42, 18, 42 (tidak ditemukan) Ternyata nilai tidak ditemukan di dalam array, Indeks larik yang dikembalikan : idx -1
Dua Versi algoritma pencarian beruntun ( sequential search) Aksi pembandingan dilakukan sebagai kondisi pengulangan : Tidak menggunakan peubah (variabel) boolean dalam proses pencarian. Aksi pembandingan dilakukan di dalam badan pengulangan : menggunakan peubah (variabel) boolean dalam proses pencarian.
Versi 1: Aksi pembandingan dilakukan sebagai kondisi pengulangan : Hasil pencarian yg diinginkan: sebuah peubah boolean yg bernilai true bila nilai ditemukan atau bernilai false bila data/nilai tidak ditemukan Algoritma : Setiap elemen array dibandingkan dengan nilai/data yg dicari mulai dari elemen pertama Aksi pembandingan dilakukan selama indeks array belum melebihi banyaknya elemen array (n) dan A[i] tidak sama dengan nilai/data yg dicari. Aksi pembandingan dihentikan, bila A[i] = nilai/data yang dicari atau i=n. Elemen terakhir A[i] diperiksa secara khusus. Keluaran yg dihasilkan adalah sebuah peubah boolean bernilai true jika data ditemukan, atau false jika data tidak ditemukan.
Algoritma versi 1: hasil pencarian sebuah variabel boolean Fungsi : Function cariberuntun(input A:Larikint, input n:integer, input x :integer) boolean Deklarasi: I : integer Algoritma: I 1 While(i<n) and (A[i] ≠ x) do I I +1 Endwhile If A[i] = x then return true {x ditemukan} Else return false {x tidak ada dalam larik A} endif Prosedur : Procedure cariberuntun(input A:larikint, input n: integer, input x:integer, output ketemu:boolean) Deklarasi : I : integer Algoritma : I 1 While(i<n) and (A[i] ≠ x) do I I +1 Endwhile If A[i] = x then ketemu true {x ditemukan} Else ketemu false {x tidak ada dalam larik A} endif dada
Algoritma lengkap u/ panggil prosedur : versi 1 Deklarasi : I : integer Algoritma : I 1 While(i<n) and (A[i] ≠ x) do I I +1 Endwhile If A[i] = x then ketemu true {x ditemukan} Else ketemu false {x tidak ada dalam larik A} Endif ALGORITMA : read(n) bacaLarik(A,, n) read (x) cariberuntun(A, n, x, found) if found = true then write(x, ‘ ditemukan’) else write(x, ‘ tidak ditemukan’) endif Program Pencarian Deklarasi: const Nmaks = 100 type LarikInt : array[1..Nmaks] of integer A: LarikInt x:integer found : boolean n : integer Procedure bacalarik(output A:LarikInt, input n:integer) Deklarasi : I : integer Algoritma: for I 1 to n do read(A[i]) endfor Procedure cariberuntun(input A:larikint, input n: integer, input x:integer, output ketemu:boolean)
Versi 1: Aksi pembandingan dilakukan sebagai kondisi pengulangan : Hasil pencarian yg diinginkan: indeks elemen array (larik) yang mengandung nilai/data yang dicari. Algoritma : Setiap elemen array dibandingkan dengan nilai/data yg dicari mulai dari elemen pertama Aksi pembandingan dilakukan selama indeks array belum melebihi banyaknya elemen array (n) dan A[i] tidak sama dengan nilai/data yg dicari. Aksi pembandingan dihentikan, bila A[i] = nilai/data yang dicari atau i=n. Elemen terakhir A[i] diperiksa secara khusus. Keluaran yg dihasilkan adalah sebuah peubah index (misal: idx) yang berisi indeks larik tempat data/nilai yang dicari ditemukan. jika data data tidak ditemukan, idx diisi dengan nilai -1.
Algoritma versi 1: hasil pencarian sebuah Indeks elemen array Fungsi : Function cariberuntun(input A:Larikint, input n:integer, input x :integer) integer Deklarasi: I : integer Algoritma: I 1 While(i<n) and (A[i] ≠ x) do I I +1 Endwhile If A[i] = x then return i {x ditemukan} Else return -1 {x tidak ada dalam larik A} endif Prosedur : Procedure cariberuntun(input A:larikint, input n: integer, input x:integer, output idx: integer) Deklarasi : I : integer Algoritma : I 1 While(i<n) and (A[i] ≠ x) do I I +1 Endwhile If A[i] = x then idx i {x ditemukan} Else idx -1 {x tidak ada dalam larik A} endif dada
Contoh Kasus : versi 1 menambah (append) nilai/data ke dalam larik (array) Tentukan atau lakukan pencarian apakah data/nilai tersebut sudah ada dalam array. Jika belum ada, maka nilai/data tersebut ditambahkan pada elemen ke n+1. Penambahan satu elemen baru tidak melampaui ukuran maksimal larik(array) (Nmaks). Setelah penambahan elemen baru, ukuran larik(array) efektif menjadi n+1.
Algoritma : penambah (append) nilai/data ke dalam larik (array) Program Tambahelemenlarik Deklarasi: const Nmaks = 100 type LarikInt : array[1..Nmaks] of integer L: LarikInt x, idx, n :integer Procedure bacalarik(output A:LarikInt, input n:integer) Deklarasi : I : integer Algoritma: for I 1 to n do read(A[i]) endfor Procedure cariberuntun(input A:larikint, input n: integer, input x:integer, output idx:integer)
Algoritma : I 1 While(i<n) and (A[i] ≠ x) do I I +1 Endwhile If A[i] = x then idx i {x ditemukan} Else idx -1 {x tidak ada dalam larik A} Endif ALGORITMA : read(n) bacaLarik(A,, n) read (x) cariberuntun(A, n, x, idx) if idx ≠ -1 then write(x, ‘ sudah terdapat di dalam larik’) else n n + 1 { naikkan ukuran larik } A[n] x { tambahkan nilai x} endif
Versi 2 : Aksi pembandingan dilakukan di dalam badan pengulangan : (bukan di awal pengulangan) Hasil pencarian yg diinginkan: sebuah peubah boolean yg bernilai true bila nilai ditemukan atau bernilai false bila data/nilai tidak ditemukan Algoritma : Diperlukan sebuah peubah boolean untuk menyatakan apakah nilai sudah ditemukan. Peubah boolean (misal. Ketemu) diinisialisasi dg nilai false. Setiap elemen array dibandingkan dengan nilai/data yg dicari mulai dari elemen pertama Jika A[i] = nilai/data yang dicari, peubah Ketemu diisi dengan nilai true, pengulangan dihentikan. Sebaliknya, jika A[i] ≠ nilai yg dicari, pembandingan dilanjutkan untuk elemen berikutnya. Keluaran yg dihasilkan adalah nilai yg disimpan di peubah(variabel) ketemu.
Algoritma versi 2: hasil pencarian sebuah variabel boolean Fungsi : Function cariberuntun(input A:Larikint, input n:integer, input x :integer) boolean Deklarasi: I : integer Algoritma: Ketemu false I 1 While(I ≤ n) and (not ketemu) do if A[i] = x then ketemu true {x ditemukan} else I I +1 endif Endwhile { I > n or ketemu } return ketemu Prosedur : Procedure cariberuntun(input A:larikint, input n: integer, input x:integer, output ketemu:boolean) Deklarasi : I : integer Algoritma : Ketemu false I 1 While(I ≤ n) and (not ketemu) do if A[i] = x then ketemu true {x ditemukan} else I I +1 endif Endwhile { I > n or ketemu } dada
Algoritma versi 2: hasil pencarian sebuah indeks elemen larik Prosedur : Procedure cariberuntun(input A:larikint, input n: integer, input x:integer, output idx: integer) Deklarasi : I : integer ketemu : boolean Algoritma : Ketemu false I 1 While(I ≤ n) and (not ketemu) do if A[i] = x then ketemu true {x ditemukan} else I I +1 endif Endwhile { I > n or ketemu } if ketemu true then idx 1 else idx -1 endif dada
Algoritma versi 2: hasil pencarian sebuah indeks elemen larik Fungsi : Function cariberuntun(input A:Larikint, input n:integer, input x :integer) integer Deklarasi: I : integer ketemu : boolean Algoritma: Ketemu false I 1 While(I ≤ n) and (not ketemu) do if A[i] = x then ketemu true {x ditemukan} else I i +1 endif Endwhile { I > n or ketemu } if ketemu true then return 1 else return -1 endif dada
Kinerja Algoritma Pencarian Beruntun (Sequential search) Data yg belum terurut : Secara umum pencarian Lambat Waktu pencarian sebanding dengan jumlah elemen larik Data yg sudah terurut : Dapat meningkatkan kinerja pencarian Karena dapat segera menyimpulkan bahwa data yg dicari tidak terdapat di dalam larik bila ditemukan elemen larik yg lebih besar dari data yg dicari
Pencarian beruntun – data yg terurut
Metode pencarian bagidua (binary search) Algoritma pencarian pada data terurut yang paling efisien (data harus sudah terurut) Digunakan untuk kebutuhan pencarian dg waktu yang cepat (tidak membaca dari awal sampai akhir) Mencari data dg cara membagi larik menjadi dua Dalam proses pencarian diperlukan dua buah indeks larik, yaitu indeks terkecil (indeks ujung kiri larik) dan indeks terbesar (indeks ujung kanan larik).
Langkah-langkah pencarian bagidua Misal indeks kiri = I, indeks kanan j : Bagi dua elemen larik pada elemen tengah. Elemen tengah adalah indeks k = ( I + j ) div 2 Elemen tengah A[k] membagi larik menjadi dua bagian : bagian kiri A[i..k-1] dan bagian kanan A[k+1..j] Periksa apakah A[k] = x(data yg dicari), Jika ya pencarian selesai (x sudah ditemukan) Jika A[k] ≠ x, harus ditentukan apakah pencarian sebelah kiri atau kanan Jika A[k] < x, maka pencarian dilakukan pada larik sebelah kanan Jika A[k] > x, maka pencarian dilakukan pada larik sebelah kiri. Ulangi langkah 1
Ilustrasi pencarian bagidua : Misal data yang dicari adalah 22 :
Algoritma pencarian bagidua :
Kinerja pencarian bagidua : Untuk kasus terburuk: x tidak diketemukan, atau x ditemukan setelah ukuran larik tinggal 1 elemen). ,misal banyaknya elemen larik=256, maka menghasilkan pembagian larik sebanyak 8 kali, sedang dengan pencarian beruntun melakukan pembandingan sebanyak 256 kali. Untuk larik yang terurut, algoritma pencarian bagi dua (binary search) jauh lebih cepat daripada algoritma pencarian beruntun (sequential search).
Algoritma pencarian beruntun atau pencarian bagidua? Sequential Search Dapat digunakan baik untuk data yg belum terurut maupun data terurut Kinerja lebih lambat Binary Search Hanya dapat digunakan untuk data yg terurut saja. Kinerja lebih cepat