Anda di halaman 1dari 15

BAB XIII

SEARCHING

Kegiatan Belajar 13 : Konsep searching dalam C/C++


A. Tujuan
Setelah mempelajari konsep fungsi dalam C/C++, diharapkan mahasiswa dapat:
1. Menjelaskan konsep Searching dalam Bahasa C/C++
2. Membedakan penggunaan konsep sequential search, binary search dan
interpolation search dalam bahasa C/C++
3. Mengimplementasikan penggunakan Searching dalam program sederhana
dalam bahasa pemrograman C/C++

B. Uraian Materi
Pencarian merupakan proses yang mendasar di dalam pemrograman. Pencarian
(Searching) merupakan tindakan untuk mendapatkan suatu data dalam kumpulan
data berdasarkan satu kunci (key) atau acuan data. Dalam kehidupan sehari-hari,
seringkali kita berurusan dengan pencarian; misalnya untuk menemukan nomor
telepon seseorang pada buku telepon atau mencari istilah dalam kamus, dan masih
banyak lagi. Pada aplikasi komputer, pencarian kerapkali dilakukan. Misalnya
untuk proses penghapusan data/record atau mengubah data/record tertentu di dalam
suatu tabel atau file, langkah pertama yang harus dilakukan adalah mencari apakah
data tersebut terdapat di dalam tabel/file atau tidak. Jika ada maka dapat dihapus
atau diubah.
Kegunaan beberapa struktur data dalam hubungannya untuk menyimpan data
sehingga memudahkan proses pencarian kembali tergantung pada:
1. Media penyimpanan data (memori, disk, tape).
2. Karakteristik jenis data yang disimpan (data numerik/character/string).
3. Jumlah data yang akan disimpan dan keperluan untuk akses data secepat-
cepatnya.
Contoh struktur data yang dipakai untuk proses penyimpanan data selanjutnya
untuk proses pencarian yaitu: array, list, dan pohon biner. Di dalam pembahasan ini
hanya membahas pencarian data pada array.

4
Terdapat bermacam-macam persoalan pencarian dalam array. Pertama: dari
sekumpulan data akan dilakukan pencarian data X, maka hasil pencarian hanya
menampilkan suatu pesan “X ditemukan” atau “X tidak ditemukan”. Kedua: dari
sekumpulan data akan dilakukan pencarian data X, andaikan data X ditemukan di
posisi n dalam array maka hasil pencarian akan menampilkan “X ditemukan pada
posisi n” dan jika data X tidak ditemukan maka hasil pencarian akan menampilkan
“data X tidak ditemukan”. Ketiga: dari sekumpulan data akan dilakukan pencarian
data X, ternyata data X terdapat lebih dari satu maka muncul pertanyaan “data yang
mana yang akan ditampilkan? Apakah data yang pertama kali yang ditampilkan
atau seluruh data yang ditemukan yang ditampilkan?”. Dari ketiga persoalan di atas
dapat dilakukan, tergantung kebutuhan masing-masing.
Pencarian dapat dilakukan berdasarkan tempat penyimpanan, yang dibagi atas
dua, yaitu pencarian internal dan pencarian eksternal. Pencarian internal yaitu
pencarian yang dilakukan terhadap data yang berada dalam memori komputer.
Pencarian eksternal yaitu pencarian yang dilakukan terhadap data yang berada
dalam memori eksternal. Di dalam pembahasan ini hanya membahas tentang
pencarian internal.
Pada umumnya dikenal tiga metode searching, antara lain: Sequensial Search,
Binary Search, dan Interpolation Search.

1. Sequential Search
Sequential Search merupakan proses pencarian data dengan metode
pencarian langsung. Ini dilakukan dengan cara mencocokkan data yang akan
dicari dengan semua data yang ada dalam kelompok data. Proses pencocokan
data dilakukan secara berurutan. Satu demi satu dimulai dari data ke1 hingga
data pada urutan terakhir. Metode ini merupakan metode pencarian yang paling
mudah. Dalam konsep array, pencarian beruntun membandingkan setiap
elemen array satu per satu secara beruntun yang dimulai dari elemen pertama
hingga elemen yang dicari ditemukan atau hingga elemen terakhir dari array.
Pencarian beruntun dapat dilakukan terhadap elemen array yang belum terurut
atau terhadap elemen array yang terurut. Perbedaan dari keduanya terletak pada
efisiensi operasi pembandingan yang dilakukan.

5
Dengan kata lain sequential search akan mencari data dengan cara
membandingkannya satu-persatu dengan data yang ada. Prosesnya tentu saja
akan singkat jika data yang diolah sedikit, dan akan lama jika data yang diolah
banyak. Metode ini disarankan untuk digunakan pada data yang sedikit saja.
Berikut adalah contohnya secara manual:

a) Gunakan Sequential search pada data berikut:


Data : 20 25 35 79 80 90
Data yang dicari 35
Iterasi Data keterangan
0 20 25 35 79 80 90 Data awal
1 20 25 35 79 80 90 Belum cocok
2 20 25 35 79 80 90 Belum cocok
3 20 25 35 79 80 90 Data ditemukan

Ket : angka yang ditebalkan maksudnya angka yang diseleleksi.


Yang diatas pengertian secara manual. Secara teoritis sequential search :
pencarian ini hanya melakukan pengulangan dari 1 sampai dengan jumlah data.
Pada setiap pengulangan, dibandingkan data ke-i dengan yang dicari. Apabila
sama, berarti data telah ditemukan. Sebaliknya apabila sampai akhir
pengulangan tidak ada data yang sama, berarti data tidak ada. Pada kasus yang
paling buruk, untuk N elemen data harus dilakukan pencarian sebanyak N kali
pula.
Algoritma pencarian berurutan dapat dituliskan sebagai berikut :
1) i←0
2) ketemu←false
3) Selama (tidak ketemu) dan (i <= N) kerjakan baris 4 4 Jika (Data[i] = x)
maka ketemu ← true, jika tidak i ← i + 1 5 Jika (ketemu) maka i adalah
indeks dari data yang dicari, jika tidak data tidak ditemukan Di bawah
ini merupakan fungsi untuk mencari data menggunakan pencarian
sekuensial.

6
int SequentialSearch(int x)
{
int i = 0;
bool ketemu = false;
while ((!ketemu) && (i <>
if(Data[i] == x)
ketemu = true;
else
i++;
}
if(ketemu) return i;
else
return -1;
}

b) Diberikan suatu array nilai dengan banyak elemen 8 seperti berikut:

Misalkan nilai yang dicari adalah: X = 15


1) Kasus Pertama : Kalau yang diharapkan hanya menyatakan ada
atau tidak ada maka pemeriksaan dilakukan terhadap 10 dan 15
maka tampil pesan “15 ditemukan”.
2) Kasus Kedua: Kalau yang diharapkan adalah menampilkan
seluruh data yang sama dan posisinya maka pemeriksaan
dilakukan terhadap seluruh data 10, 15, 9, 3, 25, 65, 15, dan 30.
Pada saat pemeriksaan dilakukan dan ternyata sama maka posisi
data yang sama tersebut akan disimpan dalam variabel juga (tipe
array) dan hitung banyaknya data yang sama. Sehingga akan
tampil pesan “15 ditemukan sebanyak 2 yaitu pada posisi 2 dan
7”.

Berikut adalah penyelesainnya dalam bentuk program:


1) Penyelesaian kasus pertama

7
#include<iostream>
#include<conio.h>
using namespace std;

main()
{
int Nilai[20];
int i, N, Bilangan;
bool ketemu;

cout<<"Masukkan Banyaknya Bilangan = ";


cin>>N;

//Membaca elemen Array


for(i=0; i<N; i++)
{
cout<<"Masukkan elemen ke-"<<i<<" = ";
cin>>Nilai[i];
}

//Mencetak Elemen Array


cout<<"\n\Deretan Bilangan = ";
for(i=0; i<N; i++)
cout<<Nilai[i]<<" ";

cout<<"\n\nMasukkan Bilangan yang akan Dicari = ";


cin>>Bilangan;

//Melakukan Pencarian
i=0;
do
{
if(Nilai[i]==Bilangan)
ketemu = true;
i++;
}
while(!(ketemu));

if(ketemu)
cout<<"Bilangan "<<Bilangan<<" ditemukan";
else
cout<<"Bilangan "<<Bilangan<<" tidak ditemukan";
getch();
}

8
2) Penyelesaian kasus kedua

#include<iostream>
#include<conio.h>
using namespace std;

main()
{
int Nilai[20];
int Posisi[20];
int i, N, Bilangan, Banyak=0;
bool ketemu;

cout<<"Masukkan Banyaknya Bilangan = ";


cin>>N;
cout<<endl;

//Membaca elemen Array


for(i=0; i<N; i++)
{
cout<<"Masukkan elemen ke-"<<i<<" = ";
cin>>Nilai[i];
}

//Mencetak Elemen Array


cout<<"\n\Deretan Bilangan = ";
for(i=0; i<N; i++)
cout<<Nilai[i]<<" ";

cout<<"\n\nMasukkan Bilangan yang akan Dicari = ";


cin>>Bilangan;

//Melakukan Pencarian
for(i=0; i<N; i++)
{
if(Nilai[i]==Bilangan)
{
ketemu = true;
Posisi[Banyak]=i;
Banyak++;
}
}
if(ketemu)
{
cout<<"Bilangan "<<Bilangan<<" ditemukan sebanyak "<<Banyak;
cout<<"\npada posisi ke = ";
for(i=0; i<Banyak; i++)
cout<<Posisi[i]<<" ";
}
else
cout<<"Bilangan "<<Bilangan<<" tidak ditemukan";
getch();
}

Berikut adalah proses kerja program kedua:

9
Misalkan kita memiliki suatu array yang berisi 8 elemen seperti di atas, dimana
variabel yang digunakan adalah:
a) Nilai : Variabel array sekumpulan bilangan
b) Posisi : Variabel array yang menampung indeks dari bilangan yang dicari
c) Bilangan : Bilangan yang akan dicari
d) Banyak : Banyaknya bilangan yang dicari di dalam nilai

Data yang akan dicari Bilangan = 15


Proses pencarian/proses perulangan yang pertama (i=0)
if(Nilai[i]==Bilangan) → False
Maka tidak ada perubahan dan dilanjutkan ke proses perulangan kedua dengan
menaikkan harga i=1(i++).

Proses pencarian/proses perulangan yang ke dua(i=1)


if(Nilai[i]==Bilangan) → true
Karena ketemu(=)maka posisi akan berisi sama dengan indeks i=1
(Posisi[Banyak]=i dan Banyak = 1) kemudian dilanjutkan ke proses perulangan
ketiga dengan menaikkan harga i=2(i++)

Proses pencarian/proses perulangan yang ke tiga (i=2)


if(Nilai[i]==Bilangan) → False
Karena tidak sama maka tidak ada perubahan dan dilanjutkan ke proses
perulangan keempat dengan menaikkan harga i=3(i++).

Proses pencarian/proses perulangan yang ke empat (i=3)


if(Nilai[i]==Bilangan) → False

10
Karena tidak sama maka tidak ada perubahan dan dilanjutkan ke proses
perulangan keempat dengan menaikkan harga i=4(i++).

Proses pencarian/proses perulangan yang ke lima (i=4)


if(Nilai[i]==Bilangan) → False
Karena tidak sama maka tidak ada perubahan dan dilanjutkan ke proses
perulangan keempat dengan menaikkan harga i=5(i++).

Proses pencarian/proses perulangan yang ke enam (i=5)


if(Nilai[i]==Bilangan) → False
Karena tidak sama maka tidak ada perubahan dan dilanjutkan ke proses
perulangan keempat dengan menaikkan harga i=6(i++).

Proses pencarian/proses perulangan yang ke tujuh (i=6)


if(Nilai[i]==Bilangan) → true
Karena ketemu(=)maka posisi akan berisi sama dengan indeks i=5
(Posisi[Banyak]=i dan Banyak = 2) kemudian dilanjutkan ke proses perulangan
ke delapan dengan menaikkan harga i=7(i++)

Proses pencarian/proses perulangan yang ke delapan (i=7)


if(Nilai[i]==Bilangan) → False

11
Karena tidak sama maka tidak ada perubahan dan karena isi array telah semua
dibandingkan maka proses pencarian berhenti.

Maka dari proses di atas dapat kita lihat keluaran dari program adalah “Data 15
ada ditemukan sebanyak 2 yang ada pada posisi 1 dan 6”.
Sequential Searching memiliki Kelebihan dan Kekurangan yaitu:
1) Kelebihan Sequential Searching bisa dikatakan lebih mudah dalam
implementasinya dalam pemrograman.
2) Kekurangannya jika data yang terdapat dalam suatu array itu sangat
banyak, maka akan diperlukan waktu yang lebih lama untuk
membandingkan data yang dicari dengan jumlah data yang sangat banyak
dalam suatu array.

2. Binary Search
Binary Search adalah sebuah teknik untuk menemukan nilai tertentu
dalam sebuah larik (array) linear, dengan menghilangkan setengah data pada
setiap langkah, dipakai secara luas tetapi tidak secara ekslusif dalam ilmu
komputer. Sebuah pencarian biner mencari nilai tengah (median), melakukan
sebuah pembandingan untuk menentukan apakah nilai yang dicari ada sebelum
atau sesudahnya, kemudian mencari setengah sisanya dengan cara yang sama.
Sebuah pencarian biner adalah salah satu contoh dari algoritma divide and
conquer .
Penerapan terbanyak dari binary search adalah untuk mencari sebuah
nilai tertentu dalam sebuah list terurut. Jika dibayangkan, pencarian biner dapat
dilihat sebagai sebuah permainan tebak-tebakan, kita menebak sebuah
bilangan, atau nomor tempat, dari daftar (list) nilai.
Pencarian diawali dengan memeriksa nilai yang ada pada posisi tengah
list; oleh karena nilai-nilainya terurut, kita mengetahui apakah nilai terletak

12
sebelum atau sesudah nilai yang di tengah tersebut, dan pencarian selanjutnya
dilakukan terhadap setengah bagian dengan cara yang sama.

Contoh programnya adalah sebagai berikut:


int BinarySearch(int x)
{
int L = 0, R = Max-1, m;
bool ketemu = false;
while((L <= R) && (!ketemu))
{
m = (L + R) / 2;
if(Data[m] == x)
ketemu = true;
else if (x <>
R = m - 1;
else
L = m + 1;
}

if(ketemu)
return m;
else
return -1;
}

Binary search adalah metode pencarian suatu data atau elemen di dalam
suatu array dengan kondisi data dalam keadaan terurut. Proses pencarian binary
search hanya dapat dilakukan pada kumpulan data yang sudah diurutkan
terlebih dahulu (menaik atau menurun). Prinsip dari binary search terhadap N
elemen dapat dijelaskan seperti berikut:
1) Tentukan posisi awal = 0 dan posisi akhir = N-1.
2) Hitung posisi tengah = (posisi awal + posisi akhir)/2.
3) Bandingkan data yang dicari dengan elemen posisi tengah.

a) Jika sama maka catat posisi dan cetak kemudian berhenti.


b) Jika lebih besar maka akan dilakukan pencarian kembali ke bagian
kanan dengan posisi awal = posisi tengah + 1 dan posisi akhir tetap
kemudian ulangi mulai poin 2.
c) Jika lebih kecil maka akan dilakukan pencarian kembali ke bagian kiri
dengan nilai posisi awal tetap dan nilai posisi akhir = posisi tengah – 1
kemudian ulangi mulai poin 2.

13
Misalkan kita mempunyai sederetan data dalam array nilai sebanyak 10
elemen dan akan dilakukan pencarian data 87 terhadap array.
Nilai[0,9] = 12, 45, 23, 87, 90, 55, 15, 25, 40, 21
Urutkan elemen array secara menaik, sehingga diperoleh:

Nilai[0,9] = 12, 15, 21, 23, 25, 40, 45, 55, 87, 90
Data yang akan dicari = 87 (Bilangan)
Tentukan nilai awal=0, akhir=N-1=9
Hitung tengah =(9+0)/2=4
Bandingkan Bilangan < Nilai[tengah] → 87=25→false
Bandingkan Bilangan < Nilai[tengah] → 87<25→false
Bandingkan Bilangan < Nilai[tengah] → 87>25→true maka pencarian
dilakukan ke sebelah kanan dengan nilai awal = tengah + 1 = 5

Karena awal masih lebih kecil dari akhir maka ulangi kembali mulai
menghitung tengah.

Hitung tengah = (9+5)/2 = 7


Bandingkan Bilangan < Nilai[tengah] → 87=55→false
Bandingkan Bilangan < Nilai[tengah] → 87<55→false
Bandingkan Bilangan < Nilai[tengah] → 87>55→true maka pencarian
dilakukan ke sebelah kanan dengan nilai awal = tengah + 1 = 8

Karena awal masih lebih kecil dari akhir maka ulangi kembali mulai
menghitung tengah

Hitung tengah = (9+8)/2 = 8


Bandingkan Bilangan < Nilai[tengah] → 87=87→true

Karena sudah ditemukan hasilnya maka proses pencarian berhenti.

Berikut adalah programnya untuk pencarian dengan metode binary search:

14
#include<stdio.h>
#include<iostream>
#include<conio.h>
#include<iomanip>
using namespace std;

main(){
//Deklarasi Variabel
int Nilai[20];
int i, j, N;
int temp, awal, akhir, tengah, Bilangan;

//Proses Penginputan data


cout<<"Banyak Bilangan : ";
cin>>N;
for(i=0; i<N; i++){
cout<<"Elemen ke-"<<i<<" = ";
cin>>Nilai[i];
}
cout<<"\nElemen Sebelum diurut = ";
for(i=0; i<N; i++)
cout<<setw(3)<<Nilai[i];

//Proses Pengurutan Data


for(i=0; i<N-1; i++){
for(j=i+1; j<N; i++){
if (Nilai[i] > Nilai[j]){
temp = Nilai[i];
Nilai[i] = Nilai[j];
Nilai[j] = temp;
}}}
cout<<"\nElemen Setelah diurut = ";
for(i=0; i<N; i++)
cout<<setw(3)<<Nilai[i];
cout<<"\nindeks Elemen = ";
for(i=0; i<N; i++)
cout<<setw(3)<<i;
cout<<"\nMasukkan data yang akan anda cari: ";
cin>>Bilangan;

//Proses Pencarian Data


awal = 0;
akhir = N-1;
do{
tengah = (akhir + awal)/2;
if(Bilangan < Nilai[tengah])
akhir = tengah - 1;
else
awal = tengah + 1; }
while((akhir >= awal) && (Nilai[tengah] !=Bilangan));
if(Nilai[tengah] == Bilangan){
cout<<"\nData "<<Bilangan<<" ada dalam array";
cout<<" pada posisi "<<tengah;
}
else
cout<<"\nData "<<Bilangan<<" tidak ada dalam array\n";
getch();}

15
Kelebihan dan Kekurangan Binary Search:
1) Kelebihannya yaitu tidak perlu membandingkan data yang dicari
dengan seluruh data array yang ada, cukup melalui titik tengah
kemudian kita bisa menentukan ke mana selanjutnya mencari data
yang ingin dicari.
2) Kekurangan implementasi agak sedikit lebih rumit karena tidak bisa
digunakan pada data array yang masih acak. Jadi harus melakukan
sorting terlebih dahulu dalam implementasinya.

3. Interpolation Search
Proses pencarian data ini hampir sama dengan proses pencarian binary
search. Pencarian ini juga dilakukan pada kumpulan data yang sudah urut
(menaik atau menurun). Akan tetapi jika pada binary search kita membagi
data dengan (akhir+awal)/2 tiap prosesnya, maka pada interpolation search
kita akan membagi data menurut rumus sebagai berikut:
Posisi = (kunci – data[low]/data[high] – data[low]) * (high – low) + low
Maka dengan menggunakan rumus di atas diperoleh program lengkap seperti
program berikut.

#include<stdio.h>
#include<conio.h>
#include<iostream>
#include<iomanip>
using namespace std;
main(){

//deklarasi variable
int Nilai[20];
int i,j,Bilangan,N;
int temp,awal,akhir,tengah;
//proses penginputan data
cout<<"Banyak Data : ";
cin>>N;
for(i=0; i<N; i++){
cout<<"elemen ke-"<<i<<" : ";
cin>>Nilai[i];
}

16
cout<<"\nData sebelum diurut : ";
for(i=0; i<N; i++)
cout<<setw(3)<<Nilai[i];

//proses pengurutan data


for(i=0; i<N-1; i++)
{
for(j=i+1; j<N; j++)
{
if (Nilai[i]>Nilai[j])
{
temp=Nilai[i];
Nilai[i]=Nilai[j];
Nilai[j]=temp;
}
}
}
cout<<"\nData setelah diurut : ";
for(i=0; i<N; i++)
cout<<setw(3)<<Nilai[i];

//Input data yang akan dicari


cout<<"\nMasukkan data yang akan anda cari : ";
cin>>Bilangan;

//proses pencarian data


akhir = N-1;
awal = 0;
do
{
tengah = ((Bilangan - Nilai[awal]) / (Nilai[akhir] -
Nilai[awal]) * (akhir-awal) + awal);
if (Nilai[tengah]> Bilangan)
akhir = tengah-1;
else if (Nilai[tengah]< Bilangan)
awal = tengah + 1;
}
while((Bilangan>=Nilai[awal])&&(Nilai[tengah]!=Bilangan));
if (Nilai[tengah]== Bilangan)
cout<<"\nData "<<Bilangan<<" ada dalam array pada posisi
"<<tengah;
else
cout<<"\nData "<<Bilangan<<" tidak ada dalam array";
getch();
}

17
C. Rangkuman
1) Pada umumnya dikenal tiga metode searching, antara lain: Sequensial Search,
Binary Search, dan Interpolation Search;

2) Sequential Search merupakan proses pencarian data dengan metode pencarian


langsung;

3) Binary search adalah metode pencarian suatu data atau elemen di dalam suatu
array dengan kondisi data dalam keadaan terurut;

4) Proses pencarian data ini hampir sama dengan proses pencarian binary search
yang dilakukan pada kumpulan data yang sudah urut.

18

Anda mungkin juga menyukai