PENCARIAN (SEARCHING) Algoritma dan Pemrograman Tahar Agastani Teknik Informatika UIN - 2008 Teknik Pencarian: Overview Sequential (Linear) Search. Binary Search. Interpolation Search. 2 1
Sequential Search Merupakan teknik yang sederhana dan langsung, dapat digunakan pada struktur data baik array maupun linked-list, dan data tidak perlu urut 3 Ilustrasi Sequential Search skrng skrng skrng -7 9-5 2 8 3-4 0 1 2 3 4 5 6 Target adalah -5 Langkah dimulai dari awal (0) sampai menemukan Bilangan (data) bisa tidak terurut 4 2
Algoritma N: Banyaknya record dalam list array k 1. Untuk setiap k[i] : 0 i N-1 Uji apakah k[i] = Kunci 2. Bila k[i] = Kunci, Indeks = i Selesai 3. Bila k[i] <> Kunci, Lanjutkan pencarian hingga i = N-1 4. Bila i = N-1 dan k[i] <> Kunci, Indeks = -1 berarti data yg dicari tdk ada 5. Selesai 5 Fungsi Sequential Search Untuk mencari data Key pada array X dengan jumlah elemen N, Return Index Array jika data ada, dan return 1 jika data Key tidak Ada int SeqSearch( int *X, int N, int ) { int i; for(i=0; i < N ; i++) if(==x[i]) return(i); return(-1); 6 3
Latihan 1. Buat main program untuk memanggil fungsi SeqSearch diatas bila list-nya sbb: 34 36 23 12 16 18 24 10 dan key = 16. Tampilkan pada posisi mana key ditemukan. 7 Binary Search Teknik ini hanya dapat dilakukan pada list yang telah terurut dan berada pada struktur array. 8 4
Ilustrasi Binary Search Bag. Kiri Memerlukan tengah List terurut. Bisa melakukan akses random. 9 tengah Bag. kanan Penggunaan lain binary search Untuk menemukan dimana sebuah fungsi adalah nol. Fungsi-fungsi komputasi. Struktur data Tree. Debugging code 10 5
Contoh Binary Search -1 2 3 5 8 10 15 0 1 2 3 4 5 6 kiri tengah kanan 11 Binary Search -1 2 3 5 8 10 15 0 1 2 3 4 5 6 kiri tengah kanan 12 6
Binary Search -1 2 3 5 8 10 15 0 1 2 3 4 5 6 kanan kiri tengah 13 Kasus 1: list: < list[tengah] kiri kanan tengah kanan baru Kasus 2: list: list[tengah] < kiri tengah kiri kanan baru 14 7
Algoritma N: Banyaknya record dalam list array k 1. Kiri = 0 dan Kanan = N-1 2. Tengah = (int)(kiri + Kanan) / 2 3. Bila k[tengah] = Kunci, Maka Indeks = Tengah, Selesai 4. Bila k[tengah] < Kunci, Kanan = Tengah - 1 5. Bila k[tengah] > Kunci, Kiri = Tengah + 1 6. Bila Kiri Kanan, dan k[tengah] <> Kunci, Ulangi mulai dari 2. 7. Bila k[tengah] <> Kunci, Indeks = -1 8. Selesai 15 Fungsi Binary Search Untuk mencari data Key pada array X (yang terurut) dgn jumlah elemen N, Return Index dari Array jika data ada, dan return 1 jika data Key tidak ada //Cara iteratif int BinarySearch(int *X, int N, int ) { int mid; int low = 0; int high = N - 1; while (low <= high){ mid = (low + high) / 2; if( == X[mid]) return(mid); if( < X[mid] ) high = mid - 1; else low = mid + 1; return(-1); 16 8
// cara rekursif int BinSearch(int X[], int low, int high, int ) { int mid; if (low > high) return(-1); else { mid = (low + high)/2; if ( == X[mid]) return(mid); else if ( < X[mid]) return BinSearch(X,low,mid-1,); else return BinSearch(X,mid+1,high,); 17 Contoh Pencarian Biner pada daftar mahasiswa dengan kunci = NIM, dan = 268 (Tiur). Indeks 0 1 2 3 Nama Ahmad Zamzami Ursula Hamdan NIM 34 65 112 116 4 Budiman 124 5 Rahayu 176 6 7 Usman Fifi 178 187 8 Alex 190 9 Lukman 208 10 Widodo 214 11 12 13 Tiur Halim Rumokoy 268 333 42418 9
Latihan 1. Buat main program untuk memanggil fungsi BinSearch versi iteratif diatas bila list-nya sbb: 34 36 23 12 16 18 24 10 dan key = 18. (catatan: terlebih dahulu buat list menjadi terurut dengan selection sort). 2. Buat main program untuk memanggil fungsi BinSearch versi rekursif diatas bila list-nya sbb: 34 36 23 12 16 18 24 10 dan key = 12. (catatan: terlebih dahulu buat list menjadi terurut dengan insertion sort). 3. Buat main program untuk mengimplementasikan ilustrasi pencarian biner pada daftar mahasiswa diatas. 19 Interpolation Search Teknik ini menemukan item dengan memperkirakan seberapa jauh kemungkinan item berada dari posisi saat itu dan pencarian berikutnya. Teknik ini juga dilakukan pada list yang sudah terurut. 20 10
Ilustrasi Interpolation Search 69 k: 220 239 350 743 900 980 0 1 2 97 98 99 k[min] Target adalah 743 k[max] Perkiraan posisi : (743 220)/(980 220) = 0,69 Posisi taksiran: 0.69 x 100 = 69 21 Ilustrasi Interpolation Search 69 k: 220 239 350 743 900 980 0 1 2 97 98 99 k[min] k[max] Apakah k[69] = 743? Bila Kunci > k[69], maka: k [min] = k[69+1] sedangkan k[max] tetap Bila Kunci < k[69], maka: k [min] tetap sedangkan k[max] = k[69-1] 22 11
Rumus Umum P = Kunci - k[min] k[max] - k[min] Posisi = min+round(p*(max-min)) 23 Fungsi Interpolation Search int InterpolationSearch(int *X, int key, int N) { int low = 0; int high = N - 1; int pos; while((x[low]<key) && (X[high]>=key)) { pos=low+((key-x[low])*(high-low))/(x[high]-x[low]); if (X[pos] < key) low = pos + 1; else if (X[pos] > key) high = pos - 1; else return pos; if (X[low] == key) return low; else return -1; // Tidak ditemukan 24 12
Latihan 1. Buat main program untuk memanggil fungsi InterpolationSearch diatas bila list-nya sbb: 34 36 23 12 16 18 24 10 dan key = 16. (catatan: terlebih dahulu buat list menjadi terurut dengan salah satu fungsi sort). 25 SELESAI 26 13