ALPRO 1 Pencarian (Searching)
-
Upload
independent -
Category
Documents
-
view
1 -
download
0
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
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)
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
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