Pencarian (searching) Dyna Marisa Khairina, M.Kom Ilmu Komputer FMIPA Unmul dyna.ilkom@gmail.com dyna.marisa@gmail.com >> Pertemuan 1 <<
Apa Itu Algoritma ? Penemunya adalah seorang ahli matematika dari Uzbekistan yang bernama Abu Abdullah Muhammad Ibn Musa al-Khwarizmi (770-840) Di literatur barat dia lebih terkenal dengan sebutan Algorizm. Dalam bahasa Indonesia kemudian disebut sebagai algoritma Algoritma adalah kunci dari bidang ilmu komputer, karena banyak bidang di bawah ilmu komputer yang lahir berdasarkan konsep algoritma ini Cara membuat masakan (resep masakan) adalah juga sebuah contoh nyata dari algoritma
Algoritma Algoritma adalah bahasa/kata logika, metode dan tahapan (urutan) sistematis yang digunakan untuk memecahkan suatu permasalahan Algoritma adalah urutan langkah logis tertentu untuk memecahkan suatu masalah. Yang ditekankan adalah urutan langkah logis, yang berarti algoritma harus mengikuti suatu urutan tertentu, tidak boleh melompat-lompat
Algoritma vs Program Program adalah kompulan instruksi komputer, sedangkan metode dan tahapan sistematis dalam program adalah algoritma Program ditulis dengan menggunakan bahasa pemrograman. Jadi bisa disebut bahwa program adalah suatu implementasi dari bahasa pemrograman formula : program = struktur data + algoritma
Pencarian (Searching) Proses pencarian (searching) adalah proses menemukan sebuah nilai (data) tertentu di dalam sekumpulan nilai yg bertipe sama Proses pengolahan data selalu didahului dengan proses pencarian Ex, utk menghapus atau mengubah nilai tertentu di dalam kumpulannya, langkah pertama yg harus dilakukan adalah mencari apakah nilai tsb terdapat di dalam kumpulan yg dimaksud Ex, utk menyisipkan data ke dalam kumpulan juga dimulai dengan pencarian apakah data yg akan disisipkan sudah terdapat di dalam kumpulan. Jika sudah ada, maka diandaikan tidak boleh ada duplikasi data
Tinjauan Singkat Larik Larik merupakan tipe data terstruktur Sebuah larik dapat diumpamakan sbg sekumpulan kotak yg menyimpan sekumpulan elemen bertipe sama secara berurutan (sequential) di dalam memori utama komputer Pendefinisian larik (nama dan tipenya) di dalam bagian deklarasi DEKLARASI D : array[1 . . 11] of integer Kar : array[1 . . 8] of character const N = 5 {jumlah data siswa} Siswa : array[1 . . N] of Data type Data = record <Nama : string, Usia : integer>
D Kar Siswa Ket: D = Larik bertipe integer, Kar = Larik bertipe karakter dan Siswa = Larik bertipe rekaman. Angka 1, 2, 3, … menyatakan indeks larik 21 36 8 7 10 68 32 12 1 2 3 4 5 6 7 8 9 10 11 k m t a f * # 1 2 3 4 5 6 7 8 1 Ardi 18 Bebi 24 Chika 30 Daniel 21 Efran 22 2 3 4 5
Pencarian Beruntun (Sequential Search) Pencarian beruntun adalah proses membandingkan setiap elemen larik satu per satu secara beruntun, mulai dari elemen pertama sampai elemen yang dicari ditemukan, atau seluruh elemen sudah diperiksa Pencarian beruntun dibedakan menjadi 2 macam, yaitu: Pencarian beruntun pada larik tidak terurut dan Pencarian beruntun pada larik terurut
Pencarian beruntun pada larik tidak terurut (acak) Pencarian dilakukan dengan memeriksa setiap elemen larik mulai dari elemen pertama sampai elemen yang dicari ditemukan atau sampai seluruh elemen sudah diperiksa Diketahui sebuah tabel TabInt [1..N] yg telah berisi nilai dengan tipe integer. Jika pada tabel tsb akan dicari apakah harga/nilai X ada dalam TabInt tsb? Maka pencarian yg akan dilakukan adalah membandingkan setiap nilai pada tabel tsb dengan nilai X yang dicari Proses tsb dilakukan secara berurutan mulai dari elemen pertama sampai ketemu, atau sampai elemen terakhir. Apabila nilai X ditemukan maka harga/nilai indeks I dimana X diketemukan pertama kalinya akan bernilai tidak sama dengan nol . I diberi harga 0 jika pencarian tidak ketemu. Pencarian segera dihentikan begitu harga pertama diketemukan.
Contoh: 13 87 14 21 75 53 Misal nilai yang dicari adalah X = 21, maka elemen yg diperiksa adalah 13, 87, 14, 21 (ditemukan) Jadi indeks larik yang dikembalikan : I = 4 Misal nilai yang dicari adalah X = 15, maka elemen yang diperiksa adalah 13, 87, 14, 21, 75, 53 (tidak ditemukan) Jadi indeks larik yang dikembalikan : I = 0
Pencarian beruntun pada larik terurut Pencarian dilakukan dengan memeriksa setiap elemen larik yang berurutan mulai dari elemen pertama sampai elemen yang dicari ditemukan atau sampai seluruh elemen sudah diperiksa Diketahui sebuah tabel bilangan integer TabInt [1..N], yg telah diisi dan isinya terurut membesar. Jika pada tabel tsb akan dicari apakah harga/nilai X ada dalam TabInt tsb? Maka pencarian yg akan dilakukan adalah membandingkan setiap nilai pada tabel tsb dengan nilai X yang dicari. Proses tsb dilakukan secara berurutan mulai dari elemen pertama sampai ketemu, atau sampai kepada elemen terakhir atau sampai dengan harga X yg bernilai lebih besar dari nilai elemen suatu posisi yg sedang diakses pada tabel. Apabila nilai X ditemukan maka harga/nilai indeks I dimana X diketemukan pertama kalinya akan bernilai tidak sama dengan nol. I diberi harga 0 jika pencarian tidak ketemu.
Contoh: 55 56 78 80 100 156 199 Misal nilai yang dicari adalah X = 100, maka elemen yg diperiksa adalah 55, 56, 78, 80, 100 (ditemukan) Jadi indeks larik yang dikembalikan : I = 5 Misal nilai yang dicari adalah X = 170, maka elemen yang diperiksa adalah 55, 56, 78, 80, 100, 156, 199 (tidak ditemukan) Jadi indeks larik yang dikembalikan : I = 0
If I = 0 then Write(X, ‘tidak ditemukan If I = 0 then Write(X, ‘tidak ditemukan!’) Else Write(X, ‘ditemukan pada elemen ke-’, I) Endif
Hal lain yg harus dipertegas adalah duplikasi data Apabila X yg dicari terdapat lebih dari satu buah banyaknya di dalam larik L, maka hanya X yg pertama kali ditemukan yg diacu dan proses pencarian dihentikan apabila X yg pertama sudah ditemukan atau X tidak ditemukan di dalam larik L Contoh,, kembali pada slide 7
Procedure CARI_I (input L : larik, input N : integer, input X : integer, output I : integer) {Mencari keberadaan nilai X di dalam larik L[1 . . N]} {K.Awal : nilai X dan elemen larik L[1 . . N] sudah terdefinisi} {K.Akhir : I berisi indeks larik L tempat X berada. Jika X tidak ditemukan, I diisi dengan nilai 0} DEKLARASI k : integer {indeks larik} DESKRIPSI k 1 while (k < N) and (L[k] X) do k k + 1 endwhile {k = N or L[k] = X} if L[k] = X then {X ditemukan} I k else I 0 endif
Pada algoritma CARI_I, pembandingan X dengan elemen larik dilakukan di dalam kondisi while-do. Apabila elemen larik yg ke-k tidak sama dengan X dan k belum sama dengan N, pemeriksaan diteruskan ke elemen berikutnya (k k+1) Pemeriksaan dihentikan apabila L[k] = X atau indeks k sudah sama dengan N. Hasil pencarian disimpulkan di luar kondisi while-do dengan pernyataan if (L[k] = X) then . . . Pernyataan terakhir ini juga memeriksa apakah elemen terakhir, L[N], sama dengan X
Procedure BACA_LARIK (output A : larik, input N : integer) {Mengisi elemen larik A[1 . . N] dengan nilai yg dibaca dari piranti masukan} {K.Awal : larik A belum terdefinisi elemen-elemennya. N sudah berisi jumlah elemen efektif} {K.Akhir : setelah pembacaan, sebanyak N buah elemen larik A berisi nilai-nilai yg dibaca dari piranti masukan} DEKLARASI k : integer {indeks larik} DESKRIPSI for k 1 to N do read(A[k]) endfor
Algoritma PENCARIAN {Program utk mencari nilai tertentu di dalam larik} DEKLARASI const Nmaks = 100 {jumlah maksimum elemen larik} type larik : array[1 . . Nmaks] of integer A : larik X : integer {elemen yg dicari} I : integer {indeks larik tempat X ditemukan} Procedure BACA_LARIK (output A : larik, input N : integer) {Mengisi elemen larik A[1 . . N] dengan nilai yg dibaca dari piranti masukan} Procedure CARI_I (input L : larik, input N : integer, input X : integer, output I : integer) {Mencari keberadaan nilai X di dalam larik L[1 . . N]} DESKRIPSI read(N) BACA_LARIK(A, N) read(X) CARI_I(A, N, X, I) if I = 0 then write(X, ‘tidak ditemukan!’) else write(X, ‘ditemukan pada indeks larik ke- ‘, I) endif
Pencarian Bagidua (Binary Search) Pencarian bagidua atau biner adalah metode pencarian yg diterapkan pada sekumpulan data yg sudah terurut (terurut menaik atau terurut menurun)
Pencarian Bagidua / Biner (Binary Search) Flowchart untuk Pencarian Biner
Algoritma Pencarian Biner /* n buah rekaman diurutkan menaik menurut kunci rekaman */ awal := 1 akhir := n while Awal ≤ Akhir do tengah := [(awal + akhir) / 2] if kunci(cari) = kunci(tengah) then pencarian berakhir else if kunci(cari) > kunci(tengah) then awal := tengah + 1 else akhir := tengah – 1 end
Kunci1 < kunci2 < kunci3 < …… Kunci1 < kunci2 < kunci3 < ……. < KunciN , untuk sebuah berkas dengan rekaman yang telah diurutkan jumlah probe (pemeriksaan) yang diperlukan untuk membaca sebuah rekaman dapat diusahakan untuk diperkecil dengan menggunakan teknik pencarian biner Jika kunci(cari) < kunci(tengah), maka bagian berkas mulai dari kunci(tengah) sampai akhir berkas dieliminasi Sebaliknya jika kunci(cari) > kunci(tengah) maka bagian berkas mulai dari depan sampai dengan kunci(tengah) dieliminasi
Contoh : Berikut ini akan dicari record dengan kunci 49 1 2 3 4 5 6 7 8 9 [21 25 28 33 38 39 48 49 69] 21 25 28 33 38 [39 48 49 69] 21 25 28 33 38 39 48 [49 69] Bilangan yang dicetak tebal menunjukkan record yang sedang dibandingkan dan tanda kurung membatasi bagian berkas yang tersisa yang masih harus diperbandingkan Tanda [ untuk Awal dan tanda ] untuk Akhir
Tengah1 = [(1 + 9) / 2] = 5 K(cari) : K(tengah1) 49 > 38 Awal = tengah1 + 1 = 6 Tengah2 = [(6 + 9) / 2] = 7 K(cari) : K(tengah2) 49 > 48 Awal = tengah2 + 1 = 8 Tengah3 = [(8 + 9) / 2] = 8 K(cari) : K(tengah3) 49 = 49 Ketemu, Probe = 3
Atau menggunakan Logika yang lain ??
Misalkan indeks kiri adalah i dan indeks kanan adalah j Misalkan indeks kiri adalah i dan indeks kanan adalah j. Pada mulanya, i = 1 dan j = N Langkah 1 : Bagi dua elemen larik pada elemen tengah. Elemen tengah adalah elemen dengan indeks k = (i+j) div 2 (Elemen tengah, L[k], membagi larik menjadi dua bagian, yaitu bagian kiri L[i . . j] dan bagian kanan L[k+1 . . j] ) 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 larik bagian kiri atau di 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 i > j (yaitu, ukuran larik sudah nol!)
Contoh Pencarian Biner Misalkan diberikan larik L dengan 8 buah elemen yg sudah terurut menurun, Misalkan elemen yg dicari adalah X = 18 Langkah 1 : i = 1 dan j = 8 Indeks elemen tengah k = (1+8) div 2 = 4 81 76 21 18 16 13 10 7 i=1 2 3 4 5 6 7 8=j 81 76 21 18 16 13 10 7 1 2 3 4 5 6 7 8 kiri kanan
L[4] = 18 ? Ya! {X ditemukan, pencarian dihentikan} Langkah 2 : L[4] = 18 ? Ya! {X ditemukan, pencarian dihentikan} Misalkan elemen yg dicari adalah X = 16 Langkah 1 : i = 1 dan j = 8 Indeks elemen tengah k = (1+8) div 2 = 4 81 76 21 18 16 13 10 7 1 2 3 4 5 6 7 8 kiri kanan
Lakukan pencarian pada larik bagian kanan dengan Langkah 2 : L[4] = 16 ? Tidak! Harus diputuskan apakah pencarian akan dilakukan di bagian kiri atau di bagian kanan dengan pemeriksaan sbg berikut : L[4] > 16 ? Ya! Lakukan pencarian pada larik bagian kanan dengan i = k+1 = 5 dan j = 8 (tetap) 16 13 10 7 i=5 6 7 j=8
Indeks elemen tengah k = (5+8) div 2 = 6 Langkah 1’ : i = 5 dan j = 8 Indeks elemen tengah k = (5+8) div 2 = 6 L[6] = 16 ? Tidak! Harus diputuskan apakah pencarian akan dilakukan di bagian kiri atau di bagian kanan dengan pemeriksaan : L[6] > 16 ? Tidak! Lakukan pencarian pada larik bagian kiri dengan i = 5 (tetap) dan j = k - 1 = 5 16 13 10 7 5 6 7 8 kiri ‘ kanan ‘ 16 5
Indeks elemen tengah k = (5+5) div 2 = 5 Langkah 1” : i = 5 dan j = 5 Indeks elemen tengah k = (5+5) div 2 = 5 Langkah 2” : L[5] = 16 ? Ya! (X ditemukan, pencarian dihentikan) 16 5
Misalkan elemen yang dicari adalah X = 100 Langkah 1 : i = 1 dan j = 8 Indeks elemen tengah k = (1+8) div 2 = 4 81 76 21 18 16 13 10 7 1 2 3 4 5 6 7 8 kiri kanan
Lakukan pencarian pada larik bagian kiri dengan Langkah 2 : L[4] = 100 ? Tidak! Harus diputuskan apakah pencarian akan dilakukan di bagian kiri atau di bagian kanan dengan pemeriksaan : L[4] > 100 ? Tidak! Lakukan pencarian pada larik bagian kiri dengan i = 1 (tetap) dan j = k – 1 = 3 81 76 21 i=1 2 j=3
Indeks elemen tengah k = (1+3) div 2 = 2 Langkah 1’ : i = 1 dan j = 3 Indeks elemen tengah k = (1+3) div 2 = 2 Langkah 2’ : L[2] = 100 ? Tidak! Harus diputuskan apakah pencarian akan dilakukan di bagian kiri atau di bagian kanan dengan pemeriksaan : L[2] > 100 ? Tidak! Lakukan pencarian pada larik bagian kiri dengan i = 1 dan j = k – 1 = 1 81 76 21 1 2 3 kiri ‘ kanan ‘ 81 1
Indeks elemen tengah k = (1+1) div 2 = 1 Langkah 2” : i = 1 dan j = 1 Indeks elemen tengah k = (1+1) div 2 = 1 Langkah 2” : L[1] = 100 ? Tidak! Harus diputuskan apakah pencarian akan dilakukan di bagian kiri atau di bagian kanan dengan pemeriksaan : L[1] > 100 ? Tidak! Lakukan pencarian pada larik bagian kiri dengan i = 1 dan j = k – 1 = 0 Karena i > j, maka tidak ada lagi bagian larik yg tersisa. Dengan demikian, X tidak ditemukan di dalam larik. Pencarian dihentikan. 81 1
Procedure BagiDua1 (input L : larik, input N : integer, input X : integer, output I : integer) {Mencari X di dalam larik L[1 . . N] yg sudah terurut menurun.Output procedure ini adalah indeks I yg L[I] = X. I = 0 jika X tdk ditemukan} {K.Awal : Larik L[1 . . N] sudah berisi data yg sudah terurut menurun dan X adl nilai yg akan dicari} {K.Akhir : I berisi indeks larik L tempat X ditemukan. Jika X tidak ditemukan, I diisi dengan nilai 0} DEKLARASI i, j : integer {indeks kiri dan indeks kanan larik} k : integer {indeks elemen tengah} ketemu : boolean {flag utk menentukan ketemu atau tidak} DESKRIPSI i 1 j N ketemu false while (not ketemu) and (i ≤ j) do k (i + j) div 2 {bagidua larik L pada posisi k} if (L[k] = X) then ketemu true else {L[k] X} if (L[k] > X) then i k + 1 {akan lakukan pencarian pada larik bagian kanan, set indeks ujung kiri larik yg baru} else j k – 1 {akan lakukan pencarian pada larik bagian kiri, set indeks ujung kanan larik yg baru} endif endwhile {ketemu = true or i > j} if (ketemu) then I k {X ditemukan} I 0 (X tidak ditemukan di dalam larik}
Procedure BagiDua2 (input L : larik, input N : integer, input X : integer, output I : integer) {Mencari X di dalam larik L[1 . . N] yg sudah terurut menaik.Output procedure ini adalah indeks I yg L[I] = X. I = 0 jika X tdk ditemukan} {K.Awal : Larik L[1 . . N] sudah berisi data yg sudah terurut menaik dan X adl nilai yg akan dicari} {K.Akhir : I berisi indeks larik L tempat X ditemukan. Jika X tidak ditemukan, I diisi dengan nilai 0} DEKLARASI i, j : integer {indeks kiri dan indeks kanan larik} k : integer {indeks elemen tengah} ketemu : boolean {flag utk menentukan ketemu atau tidak} DESKRIPSI i 1 j N ketemu false while (not ketemu) and (i ≤ j) do k (i + j) div 2 {bagidua larik L pada posisi k} if (L[k] = X) then ketemu true else {L[k] X} if (L[k] < X) then i k + 1 {akan lakukan pencarian pada larik bagian kanan, set indeks ujung kiri larik yg baru} else j k – 1 {akan lakukan pencarian pada larik bagian kiri, set indeks ujung kanan larik yg baru} endif endwhile {ketemu = true or i > j} if (ketemu) then I k {X ditemukan} I 0 (X tidak ditemukan di dalam larik}
Sekian dan Terimakasih Sampai Jumpa di Pertemuan Berikutnya