Algoritma Pencarian searching Definisi Algoritma Pencarian Proses pencarian

  • Slides: 28
Download presentation
Algoritma Pencarian (searching)

Algoritma Pencarian (searching)

Definisi Algoritma Pencarian • Proses pencarian adalah menemukan nilai (data) tertentu dalam sekumpulan data

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

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

Pencarian untuk duplikasi data : • Apabila data yang dicari terdapat lebih dari satu

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 : 1. Metode pencarian

Metode pencarian data di dalam array diklasifikasikan menjadi dua, yaitu : 1. Metode pencarian beruntun (sequantial search) 2. Metode pencarian bagi dua/pencarian biner (binary search)

Metode pencarian beruntun (sequantial search) • Disebut juga dengan pencarian lurus (linear 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 •

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 • Proses pencarian dihentikan.

Dua Versi algoritma pencarian beruntun ( sequential search) • Aksi pembandingan dilakukan sebagai kondisi

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:

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 Prosedur : Procedure cariberuntun(input

• Algoritma versi 1: hasil pencarian sebuah variabel boolean 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 • 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

Algoritma lengkap u/ panggil prosedur : versi 1 Deklarasi : Program Pencarian I :

Algoritma lengkap u/ panggil prosedur : versi 1 Deklarasi : Program Pencarian I : integer Deklarasi: Algoritma : const Nmaks = 100 I 1 type Larik. Int : array[1. . Nmaks] of integer While(i<n) and (A[i] ≠ x) do A: Larik. Int I I +1 x: integer Endwhile found : boolean If A[i] = x then ketemu true {x n : integer ditemukan} Procedure bacalarik(output A: Larik. Int, input Else ketemu false {x tidak ada dalam n: integer) larik A} Endif Deklarasi : ALGORITMA : I : integer read(n) Algoritma: baca. Larik(A, , n) for I 1 to n do read (x) read(A[i]) cariberuntun(A, n, x, found) endfor if found = true then write(x, ‘ Procedure cariberuntun(input A: larikint, ditemukan’) input n: integer, input x: integer, output else write(x, ‘ tidak ditemukan’) ketemu: boolean) endif

Versi 1: Aksi pembandingan dilakukan sebagai kondisi pengulangan : • Hasil pencarian yg diinginkan:

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 tidak ditemukan, idx diisi dengan nilai -1.

Algoritma versi 1: hasil pencarian sebuah Indeks elemen array • Prosedur : Procedure cariberuntun(input

Algoritma versi 1: hasil pencarian sebuah Indeks elemen array • 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 • 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

Contoh Kasus : versi 1 menambah (append) nilai/data ke dalam larik (array) • Tentukan

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

Algoritma : penambah (append) nilai/data ke dalam larik (array) Program Tambahelemenlarik Deklarasi: const Nmaks = 100 type Larik. Int : array[1. . Nmaks] of integer L: Larik. Int x, idx, n : integer Procedure bacalarik(output A: Larik. Int, 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) Deklarasi : I : integer

Algoritma : I 1 While(i<n) and (A[i] ≠ x) do I I +1 Endwhile

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) baca. Larik(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

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 • Prosedur : Procedure cariberuntun(input A:

Algoritma versi 2: hasil pencarian sebuah variabel boolean • 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 } • 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

Algoritma versi 2: hasil pencarian sebuah indeks elemen larik • Prosedur : Procedure cariberuntun(input

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

Algoritma versi 2: hasil pencarian sebuah indeks elemen larik • Fungsi : Function cariberuntun(input

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

Kinerja Algoritma Pencarian Beruntun (Sequential search) • Data yg belum terurut : – Secara

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

Pencarian beruntun – data yg terurut

Metode pencarian bagidua (binary search) • Algoritma pencarian pada data terurut yang paling efisien

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 : 1. Bagi

Langkah-langkah pencarian bagidua Misal indeks kiri = I, indeks kanan j : 1. 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] 2. 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. 3. Ulangi langkah 1

Ilustrasi pencarian bagidua : Misal data yang dicari adalah 22 :

Ilustrasi pencarian bagidua : Misal data yang dicari adalah 22 :

Algoritma pencarian bagidua :

Algoritma pencarian bagidua :

Kinerja pencarian bagidua : • Untuk kasus terburuk: x tidak diketemukan, atau x ditemukan

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 Binary Search 1. Dapat digunakan baik

Algoritma pencarian beruntun atau pencarian bagidua? Sequential Search Binary Search 1. Dapat digunakan baik untuk data yg belum terurut maupun data terurut 2. Kinerja lebih lambat 1. Hanya dapat digunakan untuk data yg terurut saja. 2. Kinerja lebih cepat