ALPRO 1 Pencarian (Searching)

40
[email protected] [email protected] PENCARIAN ( SEARCHING ) Dyna Marisa Khairina, M.Kom Ilmu Komputer FMIPA Unmul >> Pertemuan 1 <<

Transcript of ALPRO 1 Pencarian (Searching)

[email protected]@gmail.com

PENCARIAN (SEARCHING)

Dyna Marisa Khairina, M.KomIlmu Komputer FMIPA Unmul

>> 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 terstrukturSebuah 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

DEKLARASID : array[1 . . 11] of integerKar : array[1 . . 8] of characterconst N = 5 {jumlah data siswa}Siswa : array[1 . . N] of Datatype 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 36 68 32 12 10 361 32 4 5 76 8 9 1

110

k m t a f m * #2 3 4 5 6 7 81

Ardi 18Bebi 24Chika 30Daniel 21Efran 22

12345

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 thenWrite(X, ‘tidak ditemukan!’)

ElseWrite(X, ‘ditemukan pada elemen ke-’, I)

Endif

Hal lain yg harus dipertegas adalah duplikasi dataApabila 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 1while (k < N) and (L[k] X) dok k + 1endwhile{k = N or L[k] = X}if L[k] = X then {X ditemukan}I kelseI 0endif

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 doread(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 integerA : larikX : 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]}

DESKRIPSIread(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 := 1akhir := nwhile Awal ≤ Akhir do

tengah := [(awal + akhir) / 2]if kunci(cari) = kunci(tengah)then pencarian berakhir

else if kunci(cari) > kunci(tengah)then awal := tengah + 1else akhir := tengah – 1

end

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] = 5K(cari) : K(tengah1) 49 > 38Awal = tengah1 + 1 = 6

Tengah2 = [(6 + 9) / 2] = 7K(cari) : K(tengah2) 49 > 48Awal = tengah2 + 1 = 8

Tengah3 = [(8 + 9) / 2] = 8K(cari) : K(tengah3) 49 = 49Ketemu, Probe = 3

Atau menggunakan Logika yang lain ??

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 = 18Langkah 1 :i = 1 dan j = 8Indeks elemen tengah k = (1+8) div 2 = 4

81 76 21 18 16 13 10 78=j75 6432i=1

81 76 21 18 16 13 10 72 65431 87

kiri kanan

Langkah 2 :L[4] = 18 ? Ya! {X ditemukan, pencarian

dihentikan}

Misalkan elemen yg dicari adalah X = 16Langkah 1 :i = 1 dan j = 8Indeks elemen tengah k = (1+8) div 2 = 4

81 76 21 18 16 13 10 721 3 4 5 6 87

kiri kanan

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

dengani = k+1 = 5 dan j = 8 (tetap)

16 13 10 7i=5

6 7 j=8

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 75 6 87

kiri ‘ kanan ‘

165

Langkah 1” :i = 5 dan j = 5Indeks elemen tengah k = (5+5) div 2 = 5

Langkah 2” :L[5] = 16 ? Ya! (X ditemukan, pencarian

dihentikan)

165

Misalkan elemen yang dicari adalah X = 100Langkah 1 : i = 1 dan j = 8 Indeks elemen tengah k = (1+8) div 2 = 4

81 76 21 18 16 13 10 743 65 8721

kiri kanan

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 dengani = 1 (tetap) dan j = k – 1 = 3

81 76 212 j=3i=

1

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 212 31

kiri ‘ kanan ‘

811

Langkah 1” :i = 1 dan j = 1Indeks 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 dengani = 1 dan j = k – 1 = 0Karena i > j, maka tidak ada lagi bagian larik yg tersisa.

Dengan demikian, X tidak ditemukan di dalam larik. Pencarian dihentikan.

811

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}

DESKRIPSIi 1j Nketemu falsewhile (not ketemu) and (i ≤ j) do

k (i + j) div 2 {bagidua larik L pada posisi k}if (L[k] = X) then ketemu trueelse {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}

elsej k – 1 {akan lakukan pencarian pada larik bagian kiri, set indeks ujung kanan

larik yg baru} endifendif

endwhile{ketemu = true or i > j}

if (ketemu) thenI k {X ditemukan}

elseI 0 (X tidak ditemukan di dalam larik}

endif

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}

DESKRIPSIi 1j Nketemu falsewhile (not ketemu) and (i ≤ j) do

k (i + j) div 2 {bagidua larik L pada posisi k}if (L[k] = X) then ketemu trueelse {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}

elsej k – 1 {akan lakukan pencarian pada larik bagian kiri, set indeks ujung kanan

larik yg baru} endifendif

endwhile{ketemu = true or i > j}

if (ketemu) thenI k {X ditemukan}

elseI 0 (X tidak ditemukan di dalam larik}

endif

Sekian dan TerimakasihSampai Jumpa di Pertemuan

Berikutnya