13 Searching (Pencarian) pada Array Satu Dimensi Bab 13.1. Pengertian Search. Secara umum search diartikan mencari data dengan cara menelusuri tempat penyimpanan data tersebut. Tempat penyimpanan data dalam memory dapat berupa array atau dapat juga dalam bentuk Linked List. Data juga dapat berada dalam external storage (umumnya hard disk) berupa suatu file. Searching adalah proses mencari atau pencarian. Dalam bab ini, data yang disearch adalah data yang berada berada dalam memory dalam bentuk array. Data yang berada dalam bentuk linear linked-list sudah dijelaskan pada bab yang bersangkutan. Demikian juga search pada data dalam bentuk non linear linked-list seperti pohon (tree) sudah dijelaskan pada bab mengenai pohon. Secara teori untuk data yang berada dalam array, ada beberapa cara searching atau proses pencarian antara lain : A. Sequential Search. B. Index Sequential Search C. Binary Search. D. Fibonacci Search E. Interpolation Search Sequential Search, sudah dibahas dalam buku pertama yaitu Algoritma dan Struktur Data 1. Yang akan dibahas dalam buku in hanyalah : 11.2. Binary Search. 11.3. Fibonacci Search 11.4. Interpolation Search 367
13.2. Binary Search. Soal Jawab : Binary Search adalah pencarian sebuah elemen dalam sebuah array satu dimensi dengan cara selalu membandingkan dengan nilai yang berada di ‘tengah’ array tersebut. Bila tidak sama maka array dibagi dua dan pencarian diulang pada bagian dimana nilai yang dicari mungkin berada. Binary Search hanya bisa dilakukan pada array yang nilai-nilai elemennya sudah urut (sorted) baik urut menaik (ascending) atau urut menurut (descending). Contoh : Sudah ada array satu dimensi yang dibuat dengan int A[10]. Sudah ada isinya urut menaik sebagai berikut : 5 7 12 15 17 19 22 25 27 n-1 0 1 2 3 4 5 6 7 8 9 32 Soal Susun algoritma untuk menginput sebuah nilai, (misal N) kemudian memeriksa dengan cara atau metoda Binary Search apakah ada isi array yang sama dengan nilai N. Bila ada cetak perkataan “ADA”, sedangkan bila tidak ada maka cetak perkataan “TIDAK ADA”. Contoh, untuk isi array yang diilustrasikan diatas. Bila diinput untuk N = 25, maka tercetak “ADA”. Bila diinput untuk N = 10, maka tercetak “TIDAK ADA” Catatan : Karena isi array A[ ] merupakan nilai yang urut menaik, maka dapat dilakukan pencarian nilai yang sama dengan nilai N dengan cara BINARY SEARCH. Atau dengan perkataan lain, untuk dapat melakukan search secara BINARY SEARCH, maka data harus dalam keadaan urut. Jawab : scanf(“%i”, & N); Lo = 0; Hi = n-1; Flag = 0; while( Lo <= Hi && Flag == 0) { Mid = (Lo + Hi) / 2; if( N == A[Mid] ) Flag = 1; else { if(N < A[Mid]) Hi = Mid – 1; Lo = Mid + 1; } if(Flag == 1 ) printf(“ADA” ); printf(“TIDAK ADA” ); Keluar dari Loop bila Lo > Hi atau Flag != 0 dalam hal ini Flag = 1 a. Lo > Hi artinya TAK ADA isi array yang = N b. Flag = 1 artinya ADA isi array yang = N Kalau N < A[Mid] maka cari ke Kiri Dengan Lo tetap dan Hi = Mid - 1 Kalau N > A[Mid] maka cari ke Kanan dengan Hi tetap dan Lo = Mid + 1 368
Konsep Binary Search. Selalu mencari ‘titik tengah’, dari suatu bagian array, dan membandingkan nilainya dengan N, dengan urutan sebagai berikut : Inputkan N. Tentukan Lo = 0; Hi = n-1; dan Flag = 0 (tanda tidak ditemukan) 5 7 12 15 17 19 22 25 27 n-1 0 1 2 3 4 5 6 7 8 9 32 Lo Mid Hi Mid = ( Lo + Hi ) / 2 2. a. Selama Lo <= Hi dan Flag == 0 Hitung Mid = (Lo + Hi ) / 2 - Bila N == A[Mid ], Isi Flag = 1; (Tanda ditemukan), kembali ke no. 2 - Bila N < A[Mid] , Isi Hi = Mid –1, dan proses pencarian di Bagian Kiri, kembali ke no. 2 - Bila N > A[Mid], Isi Lo = Mid + 1, dan proses pencarian di Bagian Kanan, b. Bila Lo > Hi , atau Flag == 1, pergi ke no 3. Proses pencarian selesai. Mencetak “ADA” bila Flag == 1, atau “TIDAK ADA” bila Flag tetap == 0 Ketiga proses diatas, secara skema dapat digambarkan sebagai berikut : INPUT(N) Lo = 0; Hi = n-1; Flag = 0; Keluar dari loop bila Lo > Hi OR Flag == 1 Mid = (Lo+Hi) Div 2 N == A[Mid] N < A[Mid] N > A[Mid] Cari Kekiri : Hi = Mid -1 Cari Kekanan Lo = Mid + 1 1 2. While Lo <= Hi AND Flag == 0 Ditemukan Flag = 1 3. Flag == 1 Flag == 0 Cetak “ADA” Cetak : “TIDAK ADA” Sehingga digunakan : while( Lo<=Hi && Flag==0 ) SELESAI 369
Pohon Binary Search. Konsep pencarian yang selalu membagi dua bidang yang dicari, lebih mudah bila digambarkan dengan pohon biner, yang biasa disebut Pohon Binary Search, yang dapat digambarkan sebagai berikut : 5 7 12 15 17 19 22 25 27 n-1 0 1 2 3 4 5 6 7 8 9 32 Untuk data dalam array sebagai berikut : Dapat direpresentasikan menjadi pohon biner (Binary Search) sebagai berikut: Akar 6 9 8 17 4 19 12 5 25 7 1 15 22 32 27 3 2 11 10 Nomor elemen Isi elemen Dari pohon Binary Search ini, dapat dengan mudah dilihat : Nilai 17 akan ditemukan pada langkah pertama. Nilai 7 atau nilai 25 akan ditemukan pada langkah ke-2 Nilai 5, atau 12, atau 19, atau 27 akan ditemukan pada langkah ke-3. Nilai 15, atau 22, atau 32 akan ditemukan pada langkah ke-4. Jadi langkah yang paling panjang adalah 4. Terlihat : Ada 10 buah simpul. ( sampai ) dimana simpul sebagai akar Ada 11 buah NULL-LINK, ( ) , dari 1 - 11 9 4 Apabila penelusuran, sampai pada NULL-LINK, berarti data Tidak Ditemukan. Contoh : Bila penelusuran sampai pada NULL-LINK no : Berarti nilai dibawah 5 tidak ditemukan Berarti nilai diatas 5 tapi dibawah 7, tidak ditemukan. Berarti nilai dibawah 12 tapi diatas 7, tidak ditemukan Berarti nilai dibawah 15 tapi diatas 12, tidak ditemukan Berarti nilai diatas 15 tapi dibawah 17, tidak ditemukan Berarti nilai dibawah 19 tapi diatas 17, tidak ditemukan Berarti nilai dibawah 22 tapi diatas 19, tidak ditemukan Berarti nilai diatas 22 tapi dibawah 25, tidak ditemukan Berarti nilai dibawah 27 tapi diatas 25, tidak ditemukan Berarti nilai dibawah 32 tapi diatas 27, tidak ditemukan Berarti nilai diatas 32 tidak ditemukan 370
Contoh : b. Periksa nilai N Langkah-II Langkah-III Misal diinput N = 19 19 Langkah ke II N dibandingkan dengan A[7] Langkah ke III dengan A[5] -------> sama A [ ] Langkah ke I dengan A[4] 5 7 12 15 17 19 22 25 27 32 0 1 2 3 4 5 6 7 8 9 Lo Hi Mid 5 6 7 8 9 5 6 N Set nilai awal Lo dan Hi. Lo = 0 Hi = 9 Lo <= Hi ----> masuk ke langkah-I. Langkah-I. a. Hitung Mid Mid = (Lo + Hi) / 2 = (0 + 9) / 2 = 4 A[Mid] = A[4] = 17 b. Periksa nilai N N > A[Mid] -----> Lo = Mid + 1 = 4 + 1 = 5 sedangkan Hi tetap = 9 Lo <= Hi --------> lanjutkan ke langkah-II. Langkah-II a. Hitung Mid Mid = (Lo + Hi) / 2 = (5 + 9) / 2 = 7 A[Mid] = A[7] = 25 b. Periksa nilai N N < A[Mid] ------> Hi = Mid - 1 = 7 - 1 = 6 sedangkan Lo tetap = 5 Lo <= Hi ----------> Lanjutkan ke langkah-III Langkah-III a.. Hitung Mid Mid = (Lo + Hi) / 2 = (5 + 6) / 2 = 5 A[Mid] = A[5] = 19 b. Periksa nilai N N = A[Mid] ---------> ditemukan isi array yang nilainya = N Ditemukan pada langkah ke - 3 371
Contoh : b. Periksa nilai N Langkah-II Langkah-III Misal diinput N = 20 20 Langkah ke II N dibandingkan dengan A[7] Langkah ke III dengan A[5] -------> tidak sama ( > ) A [ ] Langkah ke I dengan A[4] 5 7 12 15 17 19 22 25 27 32 0 1 2 3 4 5 6 7 8 9 Lo Hi Mid 5 6 7 8 9 5 6 N Set nilai awal Lo dan Hi. Lo = 0 Hi = 9 Lo <= Hi ----> masuk ke langkah-I. Langkah-I. a. Hitung Mid Mid = (Lo + Hi) / 2 = (0 + 9) / 2 = 4 A[Mid] = A[4] = 17 b. Periksa nilai N N > A[Mid] -----> Lo = Mid + 1 = 4 + 1 = 5 sedangkan Hi tetap = 9 Lo <= Hi --------> lanjutkan ke langkah-II. Langkah-II a. Hitung Mid Mid = (Lo + Hi) / 2 = (5 + 9) / 2 = 7 A[Mid] = A[7] = 25 b. Periksa nilai N N < A[Mid] ------> Hi = Mid - 1 = 7 - 1 = 6 sedangkan Lo tetap = 5 Lo <= Hi ----------> Lanjutkan ke langkah-III Langkah-III a.. Hitung Mid Mid = (Lo + Hi) / 2 = (5 + 6) / 2 = 5 A[Mid] = A[5] = 19 b. Periksa nilai N N > A[Mid] ---------> Lo = Mid + 1 = 5 + 1 = 6 sedangkan Hi tetap = 6 Lo <= Hi Lanjutkan ke Langkah-IV 372
Langkah-IV Contoh Soal – 1 : 5 6 Mid Hi Lo 19 22 6 Langkah-IV a.. Hitung Mid Mid = (Lo + Hi) / 2 = (6 + 6) / 2 = 6 A[Mid] = A[6] = 22 b. Periksa nilai N N < A[Mid] ---------> Hi = Mid - 1 = 6 – 1 = 5 sedangkan Hi tetap = 6 Lo > Hi Tidak Ditemukan Sampai Langkah IV dipastikan nilai 20 Tidak Ditemukan Contoh Soal – 1 : Tunjukkkan dengan tabel, “Ditemukan pada langkah ke berapa “ nilai yang diinput dari luar (misal N) ditemukan atau tidak ditemukan untuk data dan algoritma yang dicontohkan sebalumnya , bila data yang diinput : a. 19 b. 25 c. 20 d. 17 17 25 7 5 12 19 27 32 22 15 Akar 1 2 3 4 6 8 9 10 11 5 7 12 15 17 19 22 25 27 n-1 0 1 2 3 4 5 6 7 8 9 32 I II III 5 9 6 4 7 17 25 19 19 > 17 19 < 25 19 = 19 Langkah Lo Hi Kondisi Lo & Hi Mid N & A[Mid] Lo <= Hi A[Mid] Ditemukan pada Langkah -III nilai N = isi array Tabel : Bandingkan dengan sequential search, untuk N = 19 akan ditemukan pada Langkah-5 Jawab – a. N = 19 373
Lo > Hi ---> Nilai 20 Tidak ditemukan 17 25 7 5 12 19 27 32 22 15 Akar 1 2 3 4 6 8 9 10 11 5 7 12 15 17 19 22 25 27 n-1 0 1 2 3 4 5 6 7 8 9 32 I II 5 9 Lo <= Hi 4 7 17 25 25 > 17 25 = 25 Langkah Lo Hi Kondisi Lo & Hi Mid N & A[Mid] A[Mid] Ditemukan pada Langkah -II nilai N = isi array Bandingkan dengan sequential search, untuk N = 25 akan ditemukan pada Langkah-7 Jawab – b. N = 25. Langkah Lo Hi Kondisi Lo & Hi Mid N & A[Mid] I II III IV V 5 6 6 9 Lo <= Hi lo > Hi A[Mid] 4 7 17 25 19 22 20 > 17 20 < 25 20 > 19 20 < 22 Lo > Hi ---> Nilai 20 Tidak ditemukan Pada langkah ke-V sudah dapat diketahui nilai 20 tidak ditemukan dalam array Bandingkan dengan sequential search, untuk N = 20 baru diketahui tidak ditemukan pada langkah ke 10 Jawab – c. N = 20 Langkah Lo Hi Kondisi Lo & Hi Mid N & A[Mid] I 9 Lo <= Hi A[Mid] 4 17 17 = 17 5 Jawab – d. N = 17. Ditemukan pada Langkah - I nilai N = isi array 374
Cara-2. Menggunakan Function. Tanpa pointer Data tidak Global Contoh Soal- 2. Susun algoritma Binary Search dengan mengambil contoh dataseperti pada pada Soal-1. Jawab : Cara-2. Menggunakan Function. Tanpa pointer Data tidak Global Cara-1. Tidak menggunakan Function. //Binsrch1 //Binary Search, //Tidak menggunakan function #include<stdio.h> #define n 10 void main() { int N; int A[n]={5,7,12,15,17, 19,22,25,27,32}; int i,lo,hi,Mid,Flag; scanf("%i", &N); lo=0; hi=n-1; Flag=0; while(lo <= hi && Flag==0) { Mid=(lo+hi)/2; if(N==A[Mid]) Flag=1; else if(N<A[Mid]) hi=Mid-1; else lo=Mid+1; } if(Flag == 1) printf("\nNilai %i Ditemukan pada kolom %i", N, Mid); printf("\nNilai %i Tidak Ditemukan", N); //Binsrch2 //Binary Search, pakai function, //Tapi tidak pakai pointer //Laporan dicetak dalam function #include<stdio.h> #define n 10 void BinSearch(int A[], int N) { int lo, hi, Mid, Flag; lo=0; hi=n-1; Flag=0; while(lo <= hi && Flag==0) { Mid=(lo+hi)/2; if(N==A[Mid]) Flag=1; else if(N<A[Mid]) hi=Mid-1; else lo=Mid+1; } if(Flag == 1) printf("\nNilai %i Ditemukan pada kolom %i", N, Mid); printf("\nNilai %i Tidak Ditemukan", N); void main() { int N; int A[n]={5,7,12,15,17, 19,22,25,27,32}; scanf("%i", &N); BinSearch(A,N); 375
Cara-4. Menggunakan Function. Pakai pointer Tidak recursive Tanpa pointer Semua variabel Global Tidak recursive //Binsrch4 //Binary Search, pakai function, //Pakai pointer //Tidak Recursive #include<stdio.h> #define n 10 void BinSearch(int *lo,int *hi,int N) { int *Mid, *loo, *hii, *loawal; int Flag, i, j; Flag=0; loawal=lo; while(lo <= hi && Flag==0) { i=0; loo=lo; hii=hi; while(loo < hii) { loo=loo+1; i++; } j=i/2; Mid=lo+j; if(N==*Mid) Flag=1; else if(N < *Mid) hi=Mid-1; else lo=Mid+1; if(Flag == 1) printf("\nNilai %i Ditemukan pada kolom %i", N, Mid-loawal); printf("\nNilai %i Tidak Ditemukan", N); void main() { int N, *lo, *hi; int i, *Q; int A[n]={5,7,12,15,17, 19,22,25,27,32}; Q=A; scanf("%i", &N); lo = &A[0]; hi=&A[n-1]; BinSearch(lo, hi, N); //Binsrch3 //Binary Search, pakai function, //Tapitidak pakai pointer //Semua variabel Global //Laporan dicetak dalam funtion #include<stdio.h> #define n 10 int lo, hi, Mid, Flag; int N; int A[n]={5,7,12,15,17, 19,22,25,27,32}; void BinSearch( ) { lo=0; hi=n-1; Flag=0; while(lo <= hi && Flag==0) { Mid=(lo+hi)/2; if(N==A[Mid]) Flag=1; else if(N<A[Mid]) hi=Mid-1; else lo=Mid+1; } if(Flag == 1) printf("\nNilai %i Ditemukan pada kolom %i", N, Mid); printf("\nNilai %i Tidak Ditemukan", N); void main() { scanf("%i", &N); BinSearch(); 376
Cara-5. Menggunakan Function recursive. Tanpa pointer Data Global Funtion BinSearch pada program Binsrch5 dapat ditulis sebagai berikut : //Binsrch5 //Binary Search, pakai function //Function recursive //tidak pakai pointer //Data Global #include<stdio.h> #define n 10 int A[n]={5,7,12,15,17, 19,22,25,27,32}; int BinSearch(int N, int lo, int hi) { int mid; if(lo > hi ) return(-1); else { mid=(lo+hi)/2; if(N==A[mid]) return(mid); { if(N<A[mid]) hi=mid-1; else lo=mid+1; BinSearch(N, lo, hi); } void main() { int N, kol, lo, hi; lo = 0; hi=n-1; scanf("%i", &N); kol = BinSearch(N,lo,hi); if(kol == -1) printf("\nNilai %i Tidak Ditemukan", N); printf("\nNilai %i Ditemukan di kolom %i", N, kol); //Binsrch6 int BinSearch(int N, int lo, int hi) { int mid; if(lo > hi ) return(-1); else { mid=(lo+hi)/2; if(N==A[mid]) return(mid); {if(N<A[mid]) BinSearch(N,lo,mid-1); BinSearch(N, mid+1, hi); } Atau sebagai berikut : //Binsrch7 int BinSearch(int N, int lo, int hi) { int mid; if(lo > hi ) return(-1); else {mid=(lo+hi)/2; return(N==A[mid]? mid : N<A[mid]? BinSearch(N,lo,mid-1): BinSearch(N,mid+1,hi) ); } Instruksi ini biasanya ditulis dalam satu baris sebagai berikut : return(N==A[mid]? mid : N<A[mid]? BinSearch(N,lo,mid-1): BinSearch(N,mid+1,hi) ); 377