Download - Binary Searc Dan Grraf

Transcript

BINARY SEARCH DAN PENCARIAN BERURUTAN SECARA INDEXDiajukan guna memenuhi salah satu tugas mata Kuliah Struktur Data

Kelompok IV1. 2. 3. 4. 5. 6. 7. Heri Wahyudi Alfi Agung Juliansyah Agun Gunawan Rian Andriana Waris Didi Rosadi Dani Hermawan (3609630 03) (3609630 13) (3609630 16) (3609630 19) (3609630 12) (3509630 05) (3609630 22)

SEKOLAH TINGGI MANAJEMEN INFORMATIKA DAN KOMPUTER INDONESIA MANDIRI 2012

PENCARIAN BINER (BINARY SEARCH)1. DefinisiPencarian Biner (Binary Search) merupakan metode pencarian yang digunakan pada kondisi data yang sudah terurutkan. Metode ini dianggap jauh lebih cepat dibandingkan dengan metode sequential search. 2. Proses pencarian dengan metode binary search dapat dijelaskan sebagai berikut : Data yang akan dicari harus diurutkan terlebih dahulu (bila kondisi data belum urut). Kemudian data tersebut dibagi menjadi 2 sub vektor yang mempunyai jumlah elemen yang sama. Kemudian data dibandingkan dengan data terakhir dari sub vektor pertama. Jika data yang dicari lebih kecil, pencarian diteruskan pada sub vektor pertama dengan terlebih dahulu membagi 2 sub vektor tersebut. Tetapi jika data yang dicari lebih besar dari data terakhir pada subvektor pertama, berarti data yang dicari kemungkinan terletak pada sub vektor kedua. Dengan demikian pencarian dilakukan pada sub vektor kedua. Proses diatas diulang sampai data yang dicari ditemukan atautidak ditemukan.

Algoritma pencarian biner (Binary Search) adalah: Data diambil dari posisi 1 sampai posisi akhir N Kemudian cari posisi data tengah dengan rumus (posisi awal +posisi akhir) / 2 Kemudian data yang dicari dibandingkan dengan data yang ditengah, apakah sama atau lebih kecil, atau lebih besar?

Jika Jika

lebih lebih

besar, kecil,

maka maka

proses proses

pencarian pencarian

dicari dicari

dengan posisi awal adalah posisi tengah + 1 dengan posisi akhir adalah posisi tengah 1 Jika data sama, berarti ketemu.

1. Ilustrasi Misalkan i= indeks kiri; j= indeks kanan. Inisialisasi i dengan 1 dan dengan 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..k-1] dan bagian kanan L[k+1..j] )

Langkah 2:Periksa apakah L[k] = x.

Jika L[k] = x, pencarian selesai 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 lagi pada larik bagian kiri. Sebaliknya, jika L[k] > x, pencarian dilakukan lagi pada larik bagian kanan.

Langkah 3:Ulangi Langkah 1 hingga x ditemukan atau i > j (yaitu, ukuran larik sudah nol!) Konsep Pencarian Binary/Bagi Dua Pilih Indek Kiri (Low) dan Indek Kanan (High) Langkah 1: Bagi dua elemen larik pada elemen tengah. Elemen tengah adalah elemen dengan indek middle=(low+high) div 2. Elemen tengah (middle), akan membagi array menjadi 2 bagian yaitu: Bagian kiri, dengan index LARIK[Low .. middle-1] Bagian Kanan, dengan index LARIK[middle+1..High] Langkah 2: Periksa apakah LARIK[middle] = X , pencarian akan dihentikan sebab X sudah ditemukan Jika LARIK[middle] X, maka kita tentukan pencarian akan dilakukan disebelah kiri atau kanan. Jika Jika LARIK[middle] LARIK[middle] < > X, X, maka maka pencarian pencarian dilakukan dibagian kiri LARIK dilakukan di bagian kanan LARIK Langkah 3: Ulangi langkah 1 sampai dengan X ditemukan, atau low > high (menentukan ukuran larik sudah 0).

ALGORITMAKamus Const N : integer = 8 { misalkan jumlah elemen array maksimum = 8 } Type A = array [ 1 ..... N ] of integer Cari, BatasAtas, BatasBawah, Tengah : Integer Ketemu : boolean ALGORITMA Input (cari) { meminta nilai data yang akan dicari} BatasAtas 1 { indeks array dimulai dari 1 } BatasBawah N Ketemu False While (BatasAtas < BatasBawah) and (not ketemu) do Tengah (BatasAtas + BatasBawah) div 2 If A [Tengah] = cari then Ketemu true Else If ( A [Tengah] < cari ) then { cari di bagian kanan } BatasAtas Tengah + 1 Else BatasBawah Tengah 1 { cari di bagian kiri } Endif Endif EndWhile If (ketemu) then Output ( Data berada di index nomor, Tengah ) Else Output ( Data tidak ditemukan ) Endif

1. Aplikasi Binery SearchContoh Nilai-Nilai data yang sudah terurut :

A

21

52

83

123

155

256

377

578

Kasus 1 : cari = 12 Loop pertama: Tengah = (BatasAtas + BatasBawah) div 2 = (1 + 8) div 2 = 4 A [Tengah] = A [4] = 12, berarti loop pertama data langsung ditemukan Kasus 2 : cari = 15 Loop pertama : Tengah = (BatasAtas + BatasBawah) div 2 = (1 + 8) div 2 = 4 A [Tengah] = A [4] = 12 < cari = 15, berarti BatasAtas = Tengah + 1 = 4 + 1 =5 Loop kedua : Tengah = (BatasAtas + BatasBawah) div 2 = (5 + 8) div 2 = 6 A [Tengah] = A [6] = 25 > cari = 15, berarti BatasBawah = Tengah - 1 = 6 - 1 =5 Loop ketiga : Tengah = (BatasAtas + BatasBawah) div 2 = (5 + 5) div 2 = 5 A [Tengah] = A [5] = 15, berarti setelah loop ketiga, data ditemukan Kasus 3 : cari = 10 Loop pertama : Tengah = (BatasAtas + BatasBawah) div 2 = (1 + 8) div 2 = 4 A [Tengah] = A [4] = 12 > cari = 10, berarti BatasBawah = Tengah - 1 = 4 - 1 =3 Loop kedua : Tengah = (BatasAtas + BatasBawah) div 2 = (1 + 3) div 2 = 2 A [Tengah] = A [2] = 5 < cari = 10, berarti BatasAtas = Tengah + 1 = 2 + 1 = 3

Loop ketiga : Tengah = (BatasAtas + BatasBawah) div 2 = (3 + 3) div 2 = 3 A [Tengah] = A [3] = 8, berarti setelah loop ketiga, data tidak ditemukan Untuk jumlah data sebanyak n, maka proses pembandingan maksimal sebanyak ( log n ) kali. Untuk contoh di atas, jumlah data 8, maka proses pembandingan maksimal sebanyak 3 kali

Contoh 1 Di bawah ini adalah kuncikunci carilah kunci 39 dengan mengunakan algorithm Binary Search. [13, 16, 18, 27, 28, 29, 38, 39, 53]. 123456789 File ini dinamakan File Sequential (secara berurutan). Cara penyelesaian. Bila di cari kunci 39 maka ; Bila terendah = 1, dan tertinggi = 9, maka 1 + 9 = 10 , lalu 10 / 2 = 5. 1. Nomor urut 5, adalah kunci 28 , tapi 28 < 39, [13, 16, 18, 27, 28, 29, 38, 39, 53]. maka terendah = 5 , dan tertinggi = 9, maka : 5 + 9 = 14 14 / 2 = 7. 2. Nomor urut 7 adalah 38 , tapi 38 < 39, [13, 16, 18, 27, 28, 29, 38, 39, 53]. maka terendah = 8, dan tertinggi = 9, (karena mid + 1 jadi 7+1=8) maka : 8 + 9 = 17

17 / 2 = 8,5 => 8,5 8 Note: kl mengambil kebawah, haruskonsisten untuk jawaban selanjutnya jika ada kasus yg sama juga harus kebawah 3. Nomor urut 8 adalah kunci 39 , dimana kunci 39 = 39. [13, 16, 18, 27, 28, 29, 38, 39, 53] Contoh 2 Ada 2000 kunci Mahasiswa AKAKOM dengana mengunakan Algoritma Binary Search. Carilah kunci 1345 Cara penyelesaian. 1. pergi ke tengah yaitu ; record dengan kunci 1000. 2. pergi ke record tengah pada separuh bagian ke-dua yaitu ; record sementara (1001+2000)/2 ketemu 1500, maka Record yang di cari ada diantara 1001- 1500. 3. pergi ke bagian tengah antara (1001+1499)/2, yaitu ; record 1250. Record yang dicari 1345 > 1250 berarti ada di antara 1250 - 1499. 4. pergi ke bagian tengah antara (1251+1499)/2 , yaitu ; 1375. Record yang di cari 1345 < 1375 , berarti ada di antara 1251 1274. 5. pergi ke bagian tengah antara (1251+1374)/2 atau 1312,5. Record yang di cari 1345 > 1312 , berarti ada di antara 1313 1374. 6. pergi ke-bagian tengah antara (1313+1374)/2 atau 1343,5. Record yang di cari 1345 > 1343, berarti ada di antara 1344 1374. 7. pergi ke-bagian tengah antara (1344+1374)/2 atau 1359. Record yang di cari 1345 < 1359, berarti ada di antara 1334 1358. 8. pergi ke-bagian tengah antara (1344+1358)/2 atau 1351. Record yang di cari 1345 < 1351, berarti ada di antara 1344 1350. 9. pergi ke-bagian tengah antara (1344+1350)/2, atau 1347. Record yang di cari 1345 < 1347, berarti ada di antara 1344 1346. 10. pergi ke bagian tengah antara (1344+1346)/2, atau 1345. Record yang di cari1345 = 1345, ketemu. Contoh 3 Dari data berikut gunakanlah metode binary search Cari nomer kunci dari 232 , sedangkan jumlah seluruh mahasiswa sebanyak 700 orang. Pembahasaan : (1 + 700)/2 = 350 angka 350 lebih besar dari 232, maka kita harus mencarinya kembali. (1+ 349)/2 = 175

angka 175 lebih kecil dari 232, maka kita akan mencari kembali (176 + 349)/2 = 262 angka 362 lebih besar dari 232, maka kita akan melakukan pencarian lagi. (176 + 261)/2 = 218 angka 218 lebih kecil dari 232 maka dicari lagi (219 + 261)/2 = 240 angka 240 lebih besar dari 232, maka akan dicari lagi (219 + 239)/2 = 229 angka 229 lebih kecil dari 232, maka akan dicari lagi (230 + 239)/2 = 234 angka 234 lebih besar dari 232, maka akan dicari lagi (230 + 233)/2 = 231 angka 231 lebih kecil dari 232, maka (232 + 233)/2 = 232 sudah ditemukan contoh 4 Di bawah ini adalah kuncikunci carilah kunci 17 dan 39 dengan mengunakan algorithm Binary Search. [13, 16, 18, 27, 28, 29, 38, 39, 53]. Jawab : File ini dinamakan File Sequential (secara berurutan). Cara penyelesaian. Bila di cari kunci 39 maka Bila terendah = 1, dan tertinggi = 9, maka 1 + 9 = 10 , lalu 10 / 2 = 5 1 Nomor urut 5, adalah kunci 28 , tapi 28 < 39,

[13, 16, 18, 27, 28, 29, 38, 39, 53]. maka terendah = 6, dan tertinggi = 9 maka 6 + 9 = 15 lalu 15 / 2 = 7 2 Nomor urut 7 adalah 38 , tapi 38 < 39, [13, 16, 18, 27, 28, 29, 38, 39, 53]. maka terendah = 8, dan tertinggi = 9, maka 8 + 9 = 17, lalu 17 / 2 = 8. 3 Nomor urut 8 adalah kunci 39 , dimana kunci 39 = 39. [13, 16, 18, 27, 28, 29, 38, 39, 53] Contoh 5 Dari daftar kunci berikut 2,5,11,12,14,19,30,32,41,42,47,49,51,52 Dicari suatu kunci 12 dan 42, tentukan pencarian tersebut dengan metode binary search Cara penyelesaian. Jika kita hendak mencari suatu kunci dari daftar berikut maka terlebih dahulu kita harus mengetahui daftar tertinggi dan daftar terendah jadi langkah pertama yang harus di ambil, yaitu : 1 mencari kunci dari angka 12 maka : nilai terendah = 1 dan nilai tertinggi = 14 maka 1 + 14 = 15, lalu 15/2 = 7,5 2 karena nomer urut 7 adalah 30, maka 30 > 12 [2, 5, 11, 12, 14, 19, 30, 32, 41, 42, 47, 49, 51, 52,] maka didapat nilai terendah = 1, dan nilai tertinggi adalah = 7 sehingga didapat : 1 + 6 = 7, lalu 7 / 2 = 3. 3 karena nomer urut dari nomer 3 adalah 11, maka 11 < 12 [2, 5, 11, 12, 14, 19, 30, 32, 41, 42, 47, 49, 51, 52,]

maka didapat nilai terendah = 4, dan nilai tertinggi adalah = 6 sehingga didapat : 4 + 6 = 10, lalu 10 / 2 = 5. 4 karena nomer urut dari nomer 5 adalah 14, maka 14 > 12 [2, 5, 11, 12, 14, 19, 30, 32, 41, 42, 47, 49, 51, 52,] maka didapat nilai terendah = 4, dan nilai tertinggi adalah = 4 sehingga didapat : 4 + 4 = 8, lalu 8 / 2 = 4. nomer 4 adalah kunci dari nomer 12, dimana kunci 12 = 12. ketemu Untuk mencari kunci nomer 42 dengan methode Binary Search, maka : 1. dari daftar dibawah ini dapat kita lihat bahwa : [2, 5, 11, 12, 14, 19, 30, 32, 41, 42, 47, 49, 51, 52,] didapat nilai terendah = 1, dan nilai tertinggi = 14 hingga di dapat : 1 + 14 = 15, lalu 15 / 2 = 7,5 2. karena nomer urut 7 adalah 30, dan 30 < 42 [2, 5, 11, 12, 14, 19, 30, 32, 41, 42, 47, 49, 51, 52,] maka di dapat nilai terendah = 8, dan nilai tertinggi = 14 jadi 8 + 14 =22, lalu 22/2 =11 3. karena nomer urut 11 adalah 47, dan 47 > 42 [2, 5, 11, 12, 14, 19, 30, 32, 41, 42, 47, 49, 51, 52,] maka di dapat nilai terendah = 8, dan nilai tertinggi = 10 jadi 8 + 10 =18, lalu 18/2 =9 4. karena nomer urut 9 adalah 41, dan 41 < 42 [2, 5, 11, 12, 14, 19, 30, 32, 41, 42, 47, 49, 51, 52,] maka di dapat nilai terendah = 10, dan nilai tertinggi = 10 jadi 10 + 10 =20, lalu 20/2 =10 nomer 10 adalah kunci dari nomer 42, dimana kunci 42 = 42, ketemu

2. 3. Simulasi Program ALGORITM program bagidua; uses crt; var i, j, k, x, idx : integer; ketemu : boolean;

A : array [1..8] of integer;

Begin clrscr; i := 1; j := 8;

A[1] := 3; A[2] := 6; A[3] := 7; A[4] := 8; A[5] := 9; A[6] := 12; A[7] := 17; A[8] := 19; write ('nilai yang dicari : '); readln (x); ketemu := false; while (not ketemu) and (i x )then j := k-1 else i := k+1;

Else

end; writeln;

if ketemu then begin idx := k; writeln ('Ketemu pada indeks ',idx) End. Else begin idx := -1; writeln (' tidak ketemu, indeks ',idx); end; readln; OUTPUT PROGRAM x (nilai yang di cari) = 6, ditemukan

end.

OUTPUT PROGRAM x (nilai yang di cari) = 13, tidak ditemukan

Contoh Program yang menggunakan Binnary search:Program Binnary_Search; uses crt; VAR i,N:integer; max,min : integer; A : array[1..10] of integer; begin clrscr; writeln('**PROGRAM BINNARY SEARCH**');writeln; write(' Banyaknya data ada: '); readln(N); for i:=1 to N do begin write(' Data ke-',i,'='); readln(A[i]); end; max := A[1]; min := A[1]; for i:=2 to N do if A[i] > max then max:=A[i] else if A[i] < min then min := A[i]; writeln(' '); writeln(' Nilai MAX MIN= ',max:3, min:5); writeln('==========================='); writeln('--------TERIMAKASIH--------'); writeln('==========================='); readln; end.

Kode Program

Saat program dijalankan

1. KesimpulanBinary Search adalah algoritma pencarian yang lebih efisien daripada algorima Sequential Search. Hal ini dikarenakan algoritma ini tidak perlu menjelajahi setiap elemen dari tabel. Kerugiannya adalah algoritma ini hanya bisa digunakan pada tabel yang elemennya sudah terurut baik menaik maupun menurun. Pada intinya, algoritma ini menggunakan prinsip divide and conquer, dimana sebuah masalah atau tujuan diselesaikan dengan cara mempartisi masalah menjadi bagian yang lebih kecil. Algoritma ini membagi sebuah tabel menjadi dua dan memproses satu bagian dari tabel itu saja. Algoritma ini bekerja dengan cara memilih record dengan indeks tengah dari tabel dan membandingkannya dengan record yang hendak dicari. Jika record tersebut lebih

rendah atau lebih tinggi, maka tabel tersebut dibagi dua dan bagian tabel yang bersesuaian akan diproses kembali secara rekursif. Binnary Search. teknik ini hanya dapat digunakan hanya pada kumpulan data yang sudah di urutkan, karena teknik ini melakukan pencarian dengan mencari data pada index yang tengah, apakah lebih besar/lebih kecil/sama dengan. bila hasil sama dengan maka nilai yang di cari telah di temukan. bila lebih kecil/lebih besar maka akan di buang setengah data dari yang salah, dan mencari dari indeks yang tengah dari sisanya. demikian samapi data ditemukan atau tidak di temukan. Pencarian Biner (Binary Search) dilakukan untuk : memperkecil jumlah operasi pembandingan yang harus dilakukan antara data yang dicari dengan data yang ada di dalam tabel, khususnya untuk jumlah data yang sangat besar ukurannya. Prinsip dasarnya adalah melakukan proses pembagian ruang pencarian secara berulang-ulang sampai data ditemukan atau sampai ruang pencarian tidak dapat dibagi lagi (berarti ada kemungkinan data tidak ditemukan). Syarat utama untuk pencarian biner adalah data di dalam tabel harus sudah terurut, misalkan terurut menaik.

Binary Search Algoritma ini digunakan untuk kebutuhan pencarian dengan waktu cepat. program pencarian; uses crt; procedure binary_search; var L: array[1..10] of integer; bil,i,j,k: integer; ketemu: boolean; begin write(Angka yang dicari= ); readln(bil); L[1]:=1; L[2]:=3; L[3]:=5; L[4]:=7; L[5]:= 9; L[6]:=11; L[7]:=13; L[8]:=15; L[9]:=17; L[10]:=19; ketemu:=FALSE; i:=1; j:=10;

while (ibil) then j:=k-1 else i:=k+1; end; if ketemu then writeln(Ditemukan!) else writeln(Tidak ditemukan!); end; begin clrscr; binary_search; readkey; end. Dari program diatas diasumsikan bahwa data telah terurut secara menaik, karena untuk algoritma ini data yang akan dicari harus terurut.

Prosedure Binary Search PascalProcedure Binarysearch(var x:larik); { Metode Binary search }

Var atas,tengah,bawah,cari :integer; ketemu :boolean; Begin write(Masukan data yang dicari (dgn Binary Serach) : ); readln(cari); atas:=n;bawah:=1;ketemu:=false; while not(ketemu) do begin tengah:=(atas+bawah) div 2; If x[tengah]=cari then begin ketemu:=true; writeln(Kunci yang di cari berada pada index ke ,tengah); end else if cariatas) then begin ketemu:=true; writeln(Data yang Anda cari tidak ada !); end; end; end;