SEARCHING
ARRAY
Sesuai dengan judulnya, dalam modul ini kita akan
membahas proses pencarian / searching data pada suatu array / barisan data.
Jika diketahui ada sebuah array / barisan data bernama A yang menampung 10 data
yang bertipe integer sbb A={1,2,3,4,8,5,7,9,6,0} dan kita diberi tugas untuk
mencari beberapa data misal:
·
Jika
data yang akan dicari dalam array A adalah 6, maka dengan cepat dapat kita
ketahui bahwa data 6 ada dalam array A pada index ke-9 (index pada array
dimulai dari 0)
·
Sedangkan
jika data yang akan dicari dalam array A adalah 12, maka dapat disimpulkan
bahwa array A tidak memiliki data 12 tersebut.
Nah, kita sudah memahami proses pencarian data
yang sederhana tersebut dalam pikiran kita, sekarang permasalahannya adalah
bagaimana mengimplementasikannya kedalam program ?.
Pada umumnya dikenal dua metode searching antara
lain : Sequensial search dan binary search, Untuk lebih memahami kedua metode
ini lebih baik kita mulai dari metode yang paling sederhana terlebih dahulu
yaitu sequensial search.
Sequensial search
Disebut juga sebagai metode pencarian urut adalah
metode pencarian yang paling mudah. Bayangkan saja jika anda dihadapkan pada
sebuah rak buku, dan anda diberi tugas untuk mencari sebuah buku dari rak
tersebut. Sudah tentu anda akan mulai mencarinya satu – persatu entah itu dari
atas atau dari bawah sampai buku yang dimaksud ketemu.
Singkatnya sequential search memiliki proses
sebagai berikut:
·
Tentukan
banyaknya data yang akan di olah, missal banyak data adalah N.
·
Tentukan
data apa yang akan dicari, missal data yang akan dicari adalah C.
·
Deklarasikan
sebuah counter untuk menghitung banyak data yang ditemukan, missal counternya
adalah K.
·
Inisialisasikan
K =0
·
Lakukanlah
perulangan sebanyak N kali
·
Dalam
tiap proses perulangan tersebut periksalah apakah data yang sedang
·
·
diolah sama dengan data
yang dicari.
·
Jika
ternyata sama K=K+1
·
Jika
tidak, lanjutkan proses perulangan .
·
Setelah
proses perulangan berhenti, periksalah nilai K.
·
Jika
nilai K lebih dari 0, artinya data yang dicari ada dalam data /array dan
tampilkan nilai K ke layer sebagai jumlah data yang ditemukan.
·
Jika
nilai K=0, artinya data yang dicari tidak ditemukan dalam data / array dan
tampilkan ke layar bahwa data tidak ditemukan
·
Proses
selesai.
Dapat disimpulkan bahwa 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. Disarankan proses ini digunakan pada jumlah
data yang sedikit saja.
Coding
Program Sequential Search untuk dicoba
#include<stdio.h>
void main()
{
//deklarasi variabel
int A[10],index[10], i,j,k;
//proses penginputan data
for(i=0;i<10;i++)
{
printf("Data ke-%d:",i+1);
scanf("%d",&A[i]);
}
//memasukkan data yang akan
dicari ke dalam K
printf("Masukkan data yang akan anda cari:");
scanf("%d",&k);
//proses pencarian data
j=0;
for (i=0;i<10;i++)
{
if(A[i]==k)
{
index[j]=i;
j++;
}
}
//jika data ditemukan dalam array
if (j>0)
{
printf("Data %d yang dicari ada %d buah\n",k,j);
printf("Data tersebut terdapat dalam index ke :");
for(i=0;i<j;i++)
{
printf(" %d ",index[i]);
}
printf("\n");
}
//jika tidak ditemukan
else
{
printf("Data tidak ditemukan dalam array\n");
}
}
GAMBARAN KERJA
Pada program diatas jumlah data yang akan diolah
berjumlah 10 data dan disimpan kedalam array A[10] yang bejenis integer, array
index[10] digunakan untuk mencatat index pada array A dimana data ditemukan
daya tampung array sama dengan array A karena ada kemungkinan data yang akan
dicari adalah semua data yang ada dalam array A. sedangkan variable I digunakan
sebagai counter dalam proses perulangan, variable j digunakan sebagai counter
untuk menghitung jumlah data yang ditemukan dan variable k digunakan untuk
menyimpan data yang akan dicari.
Proses pertama adalah memasukkan data-data yang
akan diolah ke dalam array A dan data yang akan dicari ke dalam variable K.
setelah itu akan dilakukan perulangan sebanyak data yang ada dalam array A
untuk mencari apakah ada data dalam variable K didalam array A, jika ada maka
counter j akan mencatat jumlahnya dan array index akan mencatat pada index ke
berapa data tersebut ditemukan. Setelah proses perulangan selesai, tampilkanlah
hasil yang terdapat pada variable j dan array index ke layer.
Gambaran kerja program (Perhatikan koding diatas agar lebih jelas)
Misalkan pada perulangan yang pertama kita
masukkan data sebagai berikut:
Array A (berisi data yang akan diolah)
|
ISI
|
1
|
3
|
5
|
8
|
6
|
5
|
7
|
11
|
9
|
0
|
|
INDEX
|
0
|
1
|
2
|
3
|
4
|
5
|
6
|
7
|
8
|
9
|
Data yang akan dicari K=5
Proses pencarian / proses perulangan yang kedua
Array A (berisi data yang akan
diolah)
|
ISI
|
1
|
3
|
5
|
8
|
6
|
5
|
7
|
11
|
9
|
0
|
|
INDEX
|
0
|
1
|
2
|
3
|
4
|
5
|
6
|
7
|
8
|
9
|
Data ditemukan ketika i = 2
Maka K++ menjadi 1, artinya ada 1 data dalam array
A
Array index akan menyimpan index tempat data
tersebut ditemukan pada array A
Array index (berisi index data yang ditemukan pada
array A)
|
ISI
|
2
|
|
|
|
|
|
|
|
|
|
|
INDEX
|
0
|
1
|
2
|
3
|
4
|
5
|
6
|
7
|
8
|
9
|
Data ditemukan ketika i = 5
Maka K++ menjadi 2, artinya ada 2 data dalam array
A
Array index akan menyimpan index tempat data
tersebut ditemukan pada array A
Array index (berisi index data yang ditemukan pada
array A)
|
ISI
|
2
|
5
|
|
|
|
|
|
|
|
|
|
INDEX
|
0
|
1
|
2
|
3
|
4
|
5
|
6
|
7
|
8
|
9
|
Proses pencarian data selesai dan tampilkan hasil
output
Data 5 yang dicari ada 2 buah ß ambil dari variable K
Data tersebut terdapat dalam index ke: 2 5 ß ambil dari array index.
Binary search
Proses pencarian binary search hanya dapat dilakukan pada kumpulan data yang sudah diurutkan terlebih dahulu. Jika
terdapat N buah data yang akan dolah, data yang dicari akan dibandingkan dengan
data ke-N jika data ke-N lebih besar dari data yang dicari maka akan dilakukan
pembagian data menjadi dua bagian. Kemudian ujung data pada setiap bagian
dibandingkan lagi dengan nilai yang akan dicari.
Coding Program Binary Search untuk dicoba
#include<stdio.h>
void
main()
{
//deklarasi variabel
int A[10], i,j,k,tkr,top,bottom,middle,tm;
//proses penginputan data
for(i=0;i<10;i++)
{
printf("Data ke-%d:",i+1);
scanf("%d",&A[i]);
}
printf("Masukkan data yang akan anda
cari:");
scanf("%d",&k);
//proses pengurutan data
for(i=0;i<10;i++)
{
for(j=i+1;j<10;j++)
{
if (A[i]>A[j])
{
tkr=A[i];
A[i]=A[j];
A[j]=tkr;
}
}
}
//proses pencarian data
tm=0;
top=9;
bottom=0;
while(top>=bottom)
{
middle=(top+bottom)/2;
if(A[middle]==k)
{
tm++;
}
if(A[middle]<k)
{
bottom=middle+1;
}
else
{
top=middle-1;
}
}
if (tm>0)
{
printf("Data %d yang dicari ada dalam array\n",k);
}
//jika tidak ditemukan
else
{
printf("Data tidak ditemukan dalam array\n");
}
}
Contoh kasus:
Ada 12 data 11 13 15 18 23 27 29 31 54 58 59 61
Data yang akan dicari : 13
·
Proses
1
11 13 15 18 23 27 29 31 54 58
59 61 ß lebih besar dengan data yg
akan dicari , lakukan pembagian data
·
Proses
2
11 13 15 18 23 27ß lebih besar dari data yang
dicari, bagi 2 29 31 54 58 59 61
·
Proses
3
11 13 15ß lebih besar dari data yang
dicari, bagi 2 18 23 27 29 31 54 58 59 61
·
Proses
4
11 ßlebih kecil dari data yang
dicari, abaikan saja 13 15ß lebih besar dari data yang
dicari, bagi 2 18 23 27 29 31 54 58 59 61
·
Proses
5
11 13
ß sesuai
data yang dicari 15 ßlebih besar dari data yang
dicari 18 23 27 29
31 54 58 59 61
Dari proses diatas dapat
disimpulkan bahwa binary search akan membagi-bagi sekumpulan data menjadi 2
bagian sampai data yang dicari ditemukan.
Kesimpulan
Sequential search lebih efektif jika
digunakan pada sekumpulan data yang sedikit, sedangkan binary search efektif
jika digunakan pada sekumpulan data yang berjumlah banyak.
Sequential search dapat digunakan pada
sekumpulan data yang urut ataupun tidak
urut, sedangkan binary search harus pada data yang sudah urut.
Interpolation search
Proses pencarian data ini hampir sama dengan
proses pencarian binary search, pencarian ini juga dilakukan pada kumpulan data
yang sudah urut. Akan tetapi jika pada binary search kita membagi data menjadi
2 bagian tiap prosesnya, pada interpolation search kita akan membagi data
menurut rumus sebagai berikut:
Posisi = ( kunci – data[low] / data[high] – data[low] ) * ( high – low ) +
low
Singkatnya proses pencarian interpolation search
hampir mirip dengan proses pencarian kata dikamus, yaitu kita mencari data yang
dimaksud dengan cara memperkirakan letak data.
Misal terdapat
data sebagai berikut:
Kode Judul Buku
Pengarang
025 The C++ Programming James Wood
034 Mastering Delphi 6 Marcopolo
041 Professional C# Simon Webe
056 Pure JavaScript v2 Michael Bolton
063 Advanced JSP & Servlet David Dunn
072 Calculus Make it Easy Gunner Christian
088 Visual Basic 2005 Express Antonie
096 Artificial Life : Volume 1 Gloria Virginia
Kunci Pencarian
? 088
Low ? 0
High ? 7
Posisi = (088
- 025) / (096 - 025) * (7 - 0) + 0 = [6]
Kunci[6] =
kunci pencarian, data ditemukan : Visual Basic 2005
Kunci Pencarian
? 060
Low ? 0
High ? 7
Posisi = (060
– 025) / (096 – 025) * (7 – 0) + 0 = [3]
Kunci[3] <
kunci pencarian, maka teruskan
Low = 3 + 1
= 4
High = 7
Ternyata
Kunci[4] adalah 063 yang lebih besar daripada 06
Berarti tidak ada kunci 060.
#include<stdio.h>
void
main()
{
//deklarasi variable
int A[10], i,j,k,tkr,low,high,pos,tm;
//proses penginputan data
for(i=0;i<10;i++)
{
printf("data ke-%d:",i+1);
scanf("%d",&A[i]);
}
//Input data yang akan dicari
printf("Masukkan data yang akan anda
cari:");
scanf("%d",&k);
//proses pengurutan data
for(i=0;i<10;i++)
{
for(j=i+1;j<10;j++)
{
if (A[i]>A[j])
{
tkr=A[i];
A[i]=A[j];
A[j]=tkr;
}
}
}
//proses pencarian data
tm=0;
high=9;
low=0;
do
{
pos = ((k - A[low]) / (A[high] - A[low]))*(high-low) + low;
if
(A[pos] == k)
{
tm++;
break;
}
if
(A[pos] > k)
high = pos-1;
else
if
(A[pos] < k)
low = pos + 1;
}
while(k >= A[low] && k <=
A[high]);
if (tm>0)
{
printf("data %d yang dicari ada dalam
array\n",k);
}
//jika tidak ditemukan
else
{
printf("data tidak ditemukan dalam
array\n");
}
}
Secara harafiah, dapat diartikan sebagai metode untuk memecah-mecah
array. Pemecahan array itu sendiri, tergantung berdasarkan apa array akan
dipecah. Agar lebih jelas, lihat ilustrasi array splice pada gambar berikut :
|
Char
|
P
|
A
|
K
|
|
A
|
N
|
T
|
O
|
N
|
|
Indeks
|
0
|
1
|
2
|
3
|
4
|
5
|
6
|
7
|
8
|
|
Char
|
P
|
A
|
K
|
|
A
|
N
|
T
|
O
|
N
|
|
Indeks1
|
0
|
0
|
0
|
|
1
|
1
|
1
|
1
|
1
|
|
Indeks2
|
0
|
1
|
2
|
|
0
|
1
|
2
|
3
|
4
|
Coba coding array explode dan searchingnya berikut ini :
#include
<stdio.h>
#include
<string.h>
void
main()
{
char str[100],cari[100];
char hasil[100][100];
int n,i,j,t,a,b,c,d,e;
printf("Masukkan string: ");
gets(str);
n=strlen(str);
j=0;
for(i=0;i<n;i++)
{
if (i!=(n-1))
{
if(str[i]==32)
j++;
}
else if(i==(n-1))
j++;
}
t=0;
for(i=0;i<j;i++)
{
e=0;
for(a=t;a<n;a++)
{
if(str[a]!=32)
{
hasil[i][e]=str[a];
printf("Indeks
[%d][%d] = %c\n",i,e,hasil[i][e]); //untuk
melihat hasil splice
e++;
}
else
{
t=a+1;
break;
}
}
printf("\n");
}
printf("Kata yang ingin dicari :
");
gets(cari);
b=strlen(cari);
printf("Panjang kata cari
%i\n",b);
c=-1;
d=0;
for(i=0;i<j;i++)
{
t=e=0;
for(a=0;a<n;a++)
{
if(hasil[i][a]<=0
&& cari[e]<=0)
break;
else
{
if(cari[e]==hasil[i][a])
t++;
}
e++;
}
if(t==b)
{
c=i;
break;
}
}
if(c!=-1)
{
printf("Kata %s yang dicari
ada di indeks [%d][%d] sampai [%d][%d]\n",cari,c,0,c,a-1);
}
else
printf("Kata tidak ada dalam
string!\n");
}

0 komentar:
Posting Komentar