• Tidak ada hasil yang ditemukan

Algoritma dan Pemrograman 2 PENCARIAN

N/A
N/A
Protected

Academic year: 2022

Membagikan "Algoritma dan Pemrograman 2 PENCARIAN"

Copied!
13
0
0

Teks penuh

(1)
(2)

PENCARIAN

Pencarian (searching) merupakan proses yang fundamental dalam pengolahan data. Proses pencarian adalah menemukan nilai (data) tertentu didalam sekumpulan data yang bertipe sama. Data dapat disimpan secara temporer dalam memori utama atau disimpan secara permanen dalam memori sekunder. Dalam memori utama data disimpan dalam bentuk array(larik) sedangkan dalam memori sekunder dalam bentuk file(arsip). Pencarian elemen dalam larik disebut juga pencarian internal, sedangkan pencarian data yang disimpan dalam memori sekunder disebut juga pencarian eksternal.

Persoalan Pencarian

Diberikan sebuah larik L yang sudah terdefinisi elemen-elemennya, x adalah elemen yang bertipe sama dengan elemen larik L. Carilah x didalam larik L.

Hasil dari proses pencarian dapat bermacam-macam :

a) Pencarian hanya memeriksa keberadaan x. Keluaran yang diinginkan misalnya berupa pesan bahwa x ditemukan atau tidak ditemukan.

contoh :

write(x,’ditemukan’) atau write(x,’tidak ditemukan’)

b) Hasil pencarian adalah indeks elemen larik. Jika x ditemukan maka indek elemen larik tempat x berada diisikan kedalam idx. Jika x tidak terdapat didalam larik L maka idx diisi dengan nilai khusus misalnya -1.

contoh :

D 35 15 60 70 25 10 12

0 1 2 3 4 5 6

Misalkan x=70, maka idx=3. Tetapi jika x=100, maka idx=-1

(3)

c) Hasil pencarian adalah sebuah nilai boolean yang menyatakan status hasil pencarian. Jika x ditemukan

maka sebuah variabel bertipe boolean misalnya ketemu diisi dengan nilai true, jika sebaliknya maka ketemu diisi dengan false.

I. Pencarian Beruntun (sequential search)

Metode pencarian beruntun adalah proses membandingkan setiap elemen larik satu persatu secara beruntun, mulai dari elemen pertama sampai dengan elemen yang dicari ditemukan atau seluruh elemen sudah

ditemukan.

I. a. Versi 1 (Pembandingan elemen dilakukan diawal pengulangan)

(1). Hasil pencarian : sebuah variabel boolean bernilai true bila x ditemukan atau false bila x tidak ditemukan.

Sudah ada array 1D yang dideklarasikan dengan int L[11] dan sudah ada isinya dengan ilustrasi sebagai berikut :

n 0 1 2 3 4 5 6 7 8 9 10 12 17 10 5 15 25 11 7 25 16 19 Misal elemen yang akan dicari adalah x.

Setiap elemen larik L dibandingkan dengan x mulai dari elemen pertama L[0]. Aksi pembandingan dilakukan selama indek larik i belum melebihi n dan L[i] belum sama dengan n. Aksi pembandingan dihentikan jika L[i] = x atau i = n. Elemen terakhir L[n] diperiksa secara khusus.

(4)

procedure SeqSearch1(input L : LarikInt, input n : integer, input x : integer, output ketemu : boolean)

DEKLARASI i : integer DESKRIPSI

i  0

while (i < n) and (L[i] x) do i  i + 1

endwhile if L[i] = x then

ketemu  true else

ketemu  false endif

#include<iostream.h>

void SeqSearch1(int Data[], int n, int x, bool *ketemu);

void main(void) {

int Data[]={23,56,10,90,35,45,9,100,200,65};

int x,i,jmlDat=10;bool ketemu;

cout<<"Elemen Array : ";

for(i=0;i<jmlDat;i++)cout<<Data[i]<<" ";cout<<endl;

cout<<"Masukan data yang akan dicari ?:";cin>>x;

SeqSearch1(Data,jmlDat,x,&ketemu);

if(ketemu!=false)

cout<<"Data yang dicari ditemukan"<<endl;

else

cout<<"Data yang dicari tidak ada dalam array"<<endl;

}

void SeqSearch1(int Data[],int n,int x, bool *ketemu) {

int i=0;

while(i<n-1 && Data[i]!=x)i++;

if(Data[i]==x)*ketemu=true;

else *ketemu=false;

}

(2). Hasil Pencarian : indek elemen larik yang mengandung x

Setiap elemen larik L dibandingkan dengan x mulai dari elemen pertama L[0]. Aksi pembandingan dilakukan selama indek larik i belum melebihi n dan L[i] belum sama dengan n. Aksi pembandingan dihentikan jika L[i] = x atau i = n. Elemen terakhir L[n] diperiksa secara khusus. Keluaran yang

(5)

dihasilkan oleh prosedur adalah variabel idx yang berisi indek larik tempat x ditemukan. Jika x tidak ditemukan, idx diisi dengan -1.

procedure SeqSearch2(input L : LarikInt, input n : integer,

input x : integer, output idx : integer)

DEKLARASI i : integer DESKRIPSI

i  0

while (i < n) and (L[i] x) do i  i + 1

endwhile if L[i] = x then

idx  i else

idx  -1 endif

#include<iostream.h>

void SeqSearch2(int Data[], int n, int x, int *idx);

void main(void) {

int Data[]={23,56,10,90,35,45,9,100,200,65};

int idx,x,i,jmlDat=10;

cout<<"Elemen Array : ";

for(i=0;i<jmlDat;i++)cout<<Data[i]<<" ";cout<<endl;

cout<<"Masukan data yang akan dicari ?:";cin>>x;

SeqSearch1(Data,jmlDat,x,&idx);

if(idx!=-1)

cout<<"Data yang dicari berada pada indek "<<idx<<endl;

else

cout<<"Data yang dicari tidak ada dalam array"<<endl;

}

void SeqSearch1(int Data[],int n,int x, int *idx) {

int i=0;

while(i<n-1 && Data[i]!=x)i++;

if(Data[i]==x)*idx=i;

else *idx=-1;

}

(6)

I. b. Versi 2 (Pembandingan elemen dilakukan didalam pengulangan)

(1). Hasil pencarian : sebuah variabel boolean bernilai true bila x ditemukan atau false bila x tidak ditemukan.

procedure SeqSearch3(input L : LarikInt, input n : integer,

input x : integer, output ketemu : boolean)

DEKLARASI i : integer DESKRIPSI

i  0

ketemu  false

while (i <= n) and (not ketemu) do if L[i] = x then

ketemu  true else

i  i + 1 endif

endwhile

#include<iostream.h>

void SeqSearch3(int Data[], int n, int x, bool *ketemu);

void main(void) {

int Data[]={23,56,10,90,35,45,9,100,200,65};

int x,i,jmlDat=10;bool ketemu;

cout<<"Elemen Array : ";

for(i=0;i<jmlDat;i++)cout<<Data[i]<<" ";cout<<endl;

cout<<"Masukan data yang akan dicari ?:";cin>>x;

SeqSearch3(Data,jmlDat,x,&ketemu);

if(ketemu==true)

cout<<"Data yang dicari ditemukan"<<endl;

else

cout<<"Data yang dicari tidak ada dalam array"<<endl;

}

void SeqSearch3(int Data[],int n,int x, bool *ketemu) {

int i=0;*ketemu=false;

while(i<n && !(*ketemu)) {

if(Data[i]==x) *ketemu=true;

else i++;

} }

(7)

Pada versi ini variabel boolean ketemu diinisialisasi dengan nilai false. Setiap elemen L dibandingkan dengan x mulai dari elemen pertama. Jika L[i] sama dengan x, variabel ketemu diisi nilai true dan pengulangan dihentikan. Jika L[i] tidak sama dengan x, pembandingan dilanjutkan untuk elemen berikutnya. Setiap elemen diperiksa termasuk elemen terakhir.

(2). Hasil Pencarian : indek elemen larik yang mengandung x

procedure SeqSearch4(input L : LarikInt, input n : integer, input x : integer, output idx : integer) DEKLARASI

i : integer

ketemu : boolean DESKRIPSI

i  0

ketemu  false

while (i <= n) and (not ketemu) do if L[i] = x then

ketemu  true else

i  i + 1 endif

endwhile

if ketemu then idx  i else

idx  -1 endif

#include<iostream.h>

void SeqSearch4(int Data[], int n, int x, int *idx);

void main(void) {

int Data[]={23,56,10,90,35,45,9,100,200,65};

int idx,x,i,jmlDat=10;

cout<<"Elemen Array : ";

for(i=0;i<jmlDat;i++)cout<<Data[i]<<" ";cout<<endl;

cout<<"Masukan data yang akan dicari ?:";cin>>x;

SeqSearch4(Data,jmlDat,x,&idx);

if(idx!=-1)

cout<<"Data yang dicari berada pada indek "<<idx<<endl;

else

cout<<"Data yang dicari tidak ada dalam array"<<endl;

}

void SeqSearch4(int Data[],int n,int x, int *idx) {

int i=0;bool ketemu=false;

while(i<n && !ketemu) {

if(Data[i]==x)ketemu=true;

(8)

elsei++;

}

if(ketemu)

*idx=i;

else

*idx=-1;

}

II. Kinerja Metode Pencarian Beruntun

Metode Pencarian Beruntun berjalan lambat. Waktu pencarian sebanding dengan jumlah elemen larik. Misal larik berukuran n elemen maka pada kasus dimana x tidak terdapat dalam larik atau x ditemukan pada elemen terakhir, maka harus dilakukan perbandingan sebanyak n kali. Jadi waktu pencarian dengan metode pencarian beruntun sebanding dengan n.

III. Metode Pencarian Beruntun pada larik terurut

Larik yang jumlah elemen-elemennya terurut dapat meningkatkan kinerja algoritma pencarian beruntun.

Contoh :

(a). Diberikan larik L tidak terurut : 13 16 14 21 76 15

untuk mencari 15, dibutuhkan perbandingan sebanyak 6 kali.

(b). Misalkan larik L diatas sudah diurut naik : 13 14 15 16 21 76

untuk mencari 15, dibutuhkan perbandingan hanya 3 kali

Prosedur berikut adalah algoritma pencarian beruntun pada larik yang terurut menaik, yang merupakan modifikasi dari algoritma sebelumnya dengan merubah L[i] x menjadi L[i] x.

(9)

procedure SeqSearch(input L : LarikInt, input n : integer, input n : integer, output idx : integer) DEKLARASI

i : integer DESKRIPSI

i  0

while(i < n) and (L[i] < x) do i  i + 1

endwhile if L[i] = x then

idx  i else

idx  -1 endif

#include<iostream.h>

void SeqSearch(int Data[], int n, int x, int *idx);

void main(void) {

int Data[]={23,26,30,50,55,65,69,78,80,90};

int idx,x,i,jmlDat=10;

cout<<"Elemen Array : ";

for(i=0;i<jmlDat;i++)cout<<Data[i]<<" ";cout<<endl;

cout<<"Masukan data yang akan dicari ?:";cin>>x;

SeqSearch(Data,jmlDat,x,&idx);

if(idx!=-1)

cout<<"Data yang dicari berada pada indek "<<idx<<endl;

else

cout<<"Data yang dicari tidak ada dalam array"<<endl;

}

void SeqSearch(int Data[],int n,int x, int *idx) {

int i=0;

while(i<n-1 && Data[i]<x)i++;

if(Data[i]==x) *idx=i;

else *idx=-1;

}

IV. Metode Pencarian Bagidua/Biner (Binary Search)

Metode pencarian bagidua lebih efisien dibandingkan metode pencarian beruntun. Metode ini memerlukan data yang sudah terurut. Dalam proses pencarian diperlukan dua buah indeks array, yaitu indeks terkecil (indeks kiri) dan indeks terbesar (indeks kanan).

(10)

Misalkan indeks kiri adalah i dan indeks kanan adalah j. Data sudah terurut menurun.

Pada mulanya indek kiri i diinisialisasi dengan 1 dan dan j diinisialisasi dengan n.

81 76 21 18 16 13 10 7 i = 0 1 2 3 4 5 6 7 = j Langkah-langkah dalam metode ini adalah:

Langkah 1:

Bagi dua elemen larik pada elemen tengah. Elemen tengah adalah elemen dengan indeks k = (i + j) div 2 Langkah 2:

Periksa apakah L[k] = x?

Jika L[k] = x, pencarian selesai

Jika L[k] < x, pencarian dilakukan pada larik bagian kiri, j = k-1 Jika L[k] > x, pencarian dilakukan pada larik bagian kanan, i = k + 1 Langkah 3 :

Ulangi langkah 1 hingga x ditemukan atau i > j (yaitu ukuran array sudah 0) Contoh 1:

misal elemen yang dicari x = 18

Langkah 1:

i = 0, j = 7

k = (0 + 7) div 2 = 3

81 76 21 18 16 13 10 7

0 1 2 3 4 5 6 7

kiri kanan

Langkah 2 :

Bandingkan L[3] = x?, ya (x ditemukan, proses pencarian selesai)

(11)

Contoh 2: Misal elemen yang dicari x = 16 Langkah 1:

i = 0 dan j = 7

k = (0 + 7) div 2 = 3

81 76 21 18 16 13 10 7

0 1 2 3 4 5 6 7

kiri kanan

Langkah 2:

L[k] = x ?, tidak L[k] < x ?, tidak

L[k] > x ?, ya, berarti pencarian dilakukan pada array kanan dengan indeks i = k +1

16 13 10 7 i = 4 5 6 7 = j Langkah 1’:

i = 4, j = 7

k = (4 + 7) div 2 = 5

16 13 10 7

4 5 6 7

kiri kanan

Langkah 2’ : L[k] = x ?, tidak L[k] < x ?, tidak

L[k] > x ?, ya, maka pencarian dilakukan pada array bagian kiri j = k -1 = 5 -1 = 4

16 4 Langkah 1’’:

i = 4, j = 4,

k = (4 +4) div 2 = 4 16

4

Langkah 2’’:

L[k] = x ? , ya ( x ditemukan, pencarian dihentikan) Jadi nilai 16 berada pada index k, yaitu L[4]

(12)

procedure BinarySearch(input L : LarikInt, input n : integer, input x : integer, output idx : integer) DEKLARASI

i,j,k : integer ketemu : boolean DESKRIPSI

i  0 j  n

ketemu  false

while (not ketemu) and (i n) do k  (i + j) div 2

if (L[k] = x ) then ketemu  true else

if (L[k] x) then i  k + 1

else

j  k - 1 endif endif endwhile

if ketemu then idx  k else

idx  -1 endif

#include<iostream.h>

#define jmlDat 8

void BinSearch(int Data[], int n, int x, int *idx);

void main(void) {

int Data[jmlDat]={81,76,21,18,16,13,10,7},x,idx,i;

cout<<"Elemen Array : ";

for(i=0;i<jmlDat;i++)cout<<Data[i]<<" ";cout<<endl;

cout<<"Masukan data yang akan dicari ?:";cin>>x;

BinSearch(Data,jmlDat,x,&idx);

if(idx!=-1)cout<<"Data yang dicari berada pada indeks : "<<idx<<endl;

else cout<<"Data yang dicari tidak ada dalam array"<<endl;

}

void BinSearch(int Data[],int n,int x, int *idx) {

bool ketemu = false;

int top = n-1,bottom = 0,mid;

while(bottom<=top && !ketemu) {

mid=(top+bottom)/2;

if(Data[mid]==x)ketemu=true;

else

if(Data[mid]<x)top=mid-1;

else bottom=mid+1;

}

if(ketemu) *idx=mid;

else *idx=-1;

}

(13)

Tugas :

1. Tulislah algoritma dan program C++ untuk pencarian sequensial versi 1. Pencarian dilakukan dalam sebuah fungsi yang mengembalikan indek array tempat data yang dicari berada.

2. Tulislah algoritma dan program C++ untuk pencarian sequensial versi 2. Pencarian dilakukan dalam sebuah fungsi yang mengembalikan indek array tempat data yang dicari berada.

3. Tulislah algoritma dan program C++ untuk pencarian sequensial dengan data yang sudah terurut menurun.

4. Tulislah algoritma dan program C++ untuk pencarian metode bagidua dengan array terurut naik.

Referensi

Dokumen terkait

Pada saat proses pencarian menggunakan algoritma Two Sliding Windows , kata pertama yang ditemukan sesuai dengan kata kunci akan dianggap sebagai hasil.

Binary search merupakan sebuah metode pencarian data yang telah terurut. Dalam metode ini semua elemen data yang telah terurut akan diuji satu per satu sampai

Gagasan metode ini adalah memilih elemen maksimum/minimum dari array, lalu menempatkan elemen maksimum/minimum itu pada ujung (awal atau akhir) array. Selanjutnya elemen

 pada dasarnya pencarian ini sama dengan proses pencarian sequential data belum terurut tanpa sentinel yaitu melakukan pengulangan dari elemen ke-1 sampai

 Tuliskanlah algoritma, yang jika diberikan sebuah X bernilai integer akan mencari apakah harga X ada dalam TabInt secara berurutan mulai dari elemen pertama array sampai ketemu

Pencarian dilakukan dengan membagi dua larik yang sudah terurut, hal ini dilakukan sampai data tersebut ditemukan (nilai yang dicari adalah nilai yang di tengah). Ilustrasi

Metode ini lebih efisien daripada metode pencarian linier dimana semua elemen di dalam array diuji satu persatu sampai ditemukan elemen yang diinginkan, tujuan penelitian ini adalah

Pencarian Elemen Lebih Cepat daripada Brute Force: • Binary Search: Algoritma pencarian ini bekerja dengan cara membagi data menjadi dua bagian dan membandingkan elemen tengah dengan