Kamis, 04 Juni 2015

Searching (Sequential Search dan Binarry Search)



Pengantar Pencarian Data

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.

Sequential Search (Pencarian Sekuensial)

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:
  • -1 jika data yang dicari tidak ditemukan, dan
  • 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

             JIKA TIDAK ketemu  MAKA
                   posisi <- -1
             AKHIR-JIKA
      AKHIR-JIKA
    
      NILAI-BALIK posisi
AKHIR-SUBRUTIN

Program:

#include <iostream.h>
#include <conio.h>

int cari(int data[], int n, int k)
{
   int posisi, i, ketemu;

   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>

int hitung(int data[], int n, int k)
{
   int jumlah, i, ketemu;

   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;

   cout << "Banyak bilangan " << dicari
        << " dalam larik data: "
        << hitung(data, 8, dicari) << "\n";

   getch ();
   return 0;
}

Hasil eksekusi program:

















Binary Search (Pencarian Terhadap Data Urut)

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;
}

Hasil eksekusi program:
















Data yang belum terurut harus diurutkan terlebih dahulu dengan menggunakan tehnik sorting.


Tidak ada komentar:

Posting Komentar