Pencarian (searching) merupakan tindakan untuk mendapatkan suatu data dalam kumpulan data.
Dalam kehidupan sehari hari, seringkali kita berurusan dengan pencarian; misalnya untuk
menemukan nomor telepon seseorang pada buku telepon atau mencari suatu istilah dalam kamus.
Pada aplikasi komputer, pencarian kerap dilakukan; misalnya untuk mendapatkan data dari
seorang mahasiswa, mendapatkan nomor telepon berdasarkan suatu alamat atau nama
perusahaan.
Untuk keperluan mencari data, terdapat beberapa algoritma pencarian. Yang dimadsud dengan
algoritma pencarian adalah "algoritma yang menerima sebuah argumen a dan mencoba untuk
menemukan sebuah rekaman yang memiliki kunci a". Sebagai contoh, dikehendaki untuk
mendapatkan mahasiswa dengan nomor 140010289. Hasilnya adalah rekaman yang berisi data
mahasiswa tersebut; yang barang kali berisi nama, alamat, tanggal lahir, dan nama program
studi. Dalam implementasi, algoritma bisa jadi memberikan nilai balik berupa sebuah rekaman
yang diperoleh, tetapi bisa hanya memberikan pointer yang menunuk ke sebuah rekaman.
Pencarian dapat dilakukan terhadap data yang secara keselurahan berada dalam memori
komputer ataupun terhadap data yang berada dalam penyimpanan eksternal (harddisk). Pencarian
yang dilakukan terhadap data yang berada dalam memori komputer dikenal dengan sebutan
pencarian internal, sedangkan pencarian yang dilakukan pada media penyimpanan eksternal
disebut pencarian eksternal. Pencarian internalah yang akan kita bahas.
Pencarian sekuensial (atau disebut juga pencarian linear) merupakan model pencarian yang
paling sederhana yang dilakukan terhadap suatu kumpulan data.
Secara konsep, penjelasannya adalah seperti berikut: terdapat L yang merupakan larik yang
berisi n buah data (L[0],L[1],...,L[n-1]) dan k adalah data yang hendak dicari. Pencarian
dilakukan untuk menemukan
L[i] = k
dengan i adalah bilangan indeks terkecil yang memenuhi kondisi 0<=k<=n-1. Tentu saja ada
kemungkinan bahwa data yang dicari tidak ditentukan. Contoh:
L <- [10,9,4,6,4,3,2,5]
Dimanakah posisi 4 yang pertama? Dalam hal ini k adalah 4 dan k ditemukan pada posisi dengan
indeks berupa 2.
Contoh :
1.Implementasi pencarian sekuensial yang digambarkan di atas dalam bentuk algoritma dan
program
Algoritma:
Subrutin berikut merupakan implementasi algoritma pencarian secara sekuensial. Dalam hal ini
subrutin menghasilkan nilai balik berupa:
bilangan antara 0 sampai dengan n-1 (dengan n adalah jumlah elemen larik) jika data
yang dicari ditemukan.
SUBRUTIN cari(L,n,k)
JIKA n<= 0 MAKA
posisi <- -1
SEBALIKNYA
ketemu <- SALAH
i <- 0
ULANG SELAMA (i<n-1) DAN (TIDAK ketemu)
JIKA k = L[i] MAKA
posisi <- i
ketemu <- BENAR
SEBALIKNYA
i <- i+1
AKHIR-JIKA
AKHIR-ULANG
Program:
#include <iostream.h>
#include <conio.h>
if (n <= 0)
posisi = -1;
else
{
ketemu = 0;
i = 1;
while ((i < n-1) && ! ketemu)
if (data[i] == k)
{
posisi = i;
ketemu = 1;
}
else
i++;
if (!ketemu)
posisi = -1;
}
return posisi;
}
int main()
{
int data[8] = { 6, 7, 8, 5, 7, 8, 1, 9};
int dicari = 5;
cout << "Posisi " << dicari << " dalam larik data: "
<< cari(data, 8, dicari) << "\n";
getch ();
return 0;
}
Hasil eksekusi program:
2. Tulislah algoritma untuk menghitung jumlah suatu bilangan dalam larik L yang berisi n buah
elemen.
Algoritma:
SUBRUTIN hitung(L,n,k)
jumlah <- 0
UNTUK i <- 0 S/D n-1
JIKA k = L[i] MAKA
jumlah <- jumlah+1
AKHIR-JIKA
AKHIR-UNTUK
NILAI-BALIK jumlah
AKHIR-SUBRUTIN
Program:
#include <iostream.h>
#include <conio.h>
jumlah = 0;
for (i = 1; i < n; i++)
if (data[i] == k)
jumlah++;
return jumlah;
}
int main()
{
int data[8] = { 6, 7, 8, 5, 7, 8, 1, 9};
int dicari = 8;
getch ();
return 0;
}
Hasil eksekusi program:
Apabila kumpulan data sudah terurut , pencarian data dengan menggunakan pencarian sekuensial
akan memakan waktu yang lama jika jumlah data dalam kumpulan data tersebut sangat banyak.
Untuk mengatasi hal itu terdapat algoritma yang dirancang agar pencarian data dapat dilakukan
secara efisien. Metode yang digunakan dikenal dengan nama pencarian biner (binary search).
Pencarian biner hanya bisa dilakukan jika data sudah terurut.
Pencarian biner dilakukan dengan membagi larik menjadi dua bagian dengan jumlah yang sama
atau berbeda 1 jika jumlah data semula ganjil. Data yang dicari kemudian dibandingkan dengan
data terakhir pada bagian pertama. Dalam hal ini ada tiga kemungkinan yang terjadi:
data yang dicari sama dengan elemen terakhir pada bagian petama dalam larik. Jika
kondisi ini terpenuhi , data yang dicari berarti ditemukan.
data yang dicari bernilai kurang dari nilai elemen terakhir pada bagian pertama dalam
larik. Pada keadaan ini, pencarian diteruskan pada bagian pertama.
data yang dicari bernilai lebih dari nilai elemen terakhir pada bagian pertama dalam larik.
Pada keadaan ini, pencarian diteruskan pada bagian kedua.
Contoh program:
#include <iostream.h>
#include <conio.h>
int caribin(int data[], int n, int k)
{
int ada, atas, bawah, tengah, posisi;
ada = 0;
bawah = 0;
atas = n-1;
while (atas >= bawah)
{
tengah = (atas + bawah) / 2;
if (k > data[tengah])
bawah = tengah + 1;
else
if (k < data[tengah])
atas = tengah - 1;
else
{
ada = 1; /* Ketemu */
posisi = tengah;
bawah = atas + 1; /* Mengakhiri pengulangan */
}
}
if (!ada)
posisi = -1;
return posisi;
}
int main()
{
int data[] = { 1, 2, 4, 4, 5, 7, 8, 10, 13, 14, 15};
int dicari = 13;
cout << "Posisi " << dicari << " dalam larik data: "
<< caribin(data, 11, dicari) << "\n";
getch ();
return 0;
}
Data yang belum terurut harus diurutkan terlebih dahulu dengan menggunakan tehnik sorting.