Kamis, 22 Januari 2015

Algoritma Boyer Moore

Algoritma Boyer-Moore adalah salah satu algoritma pencarian string, dipublikasikan oleh Robert S. Boyer, dan J. Strother Moore pada tahun 1977.
Algoritma ini dianggap sebagai algoritma yang paling efisien pada aplikasi umum. Tidak seperti algoritma pencarian string yang ditemukan sebelumnya, algoritma Boyer-Moore mulai mencocokkan karakter dari sebelah kanan pattern. Ide di balik algoritma ini adalah bahwa dengan memulai pencocokan karakter dari kanan, dan bukan dari kiri, maka akan lebih banyak informasi yang didapat.

Berikut adalah contoh algoritmanya :


Dan ini pengimplementasiannya pada java :

/**
 ** Java Program to implement Boyer Moore Algorithm
 **/

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;

/** Class BoyerMoore **/
public class BoyerMoore
{
    /** function findPattern **/
    public void findPattern(String t, String p)
    {
        char[] text = t.toCharArray();
        char[] pattern = p.toCharArray();
        int pos = indexOf(text, pattern);
        if (pos == -1)
            System.out.println("\nNo Match\n");
        else
            System.out.println("Pattern found at position : "+ pos);
    }
    /** Function to calculate index of pattern substring **/
    public int indexOf(char[] text, char[] pattern) 
    {
        if (pattern.length == 0) 
            return 0;
        int charTable[] = makeCharTable(pattern);
        int offsetTable[] = makeOffsetTable(pattern);
        for (int i = pattern.length - 1, j; i < text.length;) 
        {
            for (j = pattern.length - 1; pattern[j] == text[i]; --i, --j) 
                     if (j == 0) 
                    return i;

              // i += pattern.length - j; // For naive method
              i += Math.max(offsetTable[pattern.length - 1 - j], charTable[text[i]]);
        }
        return -1;
      }
      /** Makes the jump table based on the mismatched character information **/
      private int[] makeCharTable(char[] pattern) 
      {
        final int ALPHABET_SIZE = 256;
        int[] table = new int[ALPHABET_SIZE];
        for (int i = 0; i < table.length; ++i) 
               table[i] = pattern.length;
        for (int i = 0; i < pattern.length - 1; ++i) 
               table[pattern[i]] = pattern.length - 1 - i;
        return table;
      }
      /** Makes the jump table based on the scan offset which mismatch occurs. **/
      private static int[] makeOffsetTable(char[] pattern) 
      {
        int[] table = new int[pattern.length];
        int lastPrefixPosition = pattern.length;
        for (int i = pattern.length - 1; i >= 0; --i) 
        {
            if (isPrefix(pattern, i + 1)) 
                   lastPrefixPosition = i + 1;
              table[pattern.length - 1 - i] = lastPrefixPosition - i + pattern.length - 1;
        }
        for (int i = 0; i < pattern.length - 1; ++i) 
        {
              int slen = suffixLength(pattern, i);
              table[slen] = pattern.length - 1 - i + slen;
        }
        return table;
    }
    /** function to check if needle[p:end] a prefix of pattern **/
    private static boolean isPrefix(char[] pattern, int p) 
    {
        for (int i = p, j = 0; i < pattern.length; ++i, ++j) 
            if (pattern[i] != pattern[j]) 
                  return false;
        return true;
    }
    /** function to returns the maximum length of the substring ends at p and is a suffix **/
    private static int suffixLength(char[] pattern, int p) 
    {
        int len = 0;
        for (int i = p, j = pattern.length - 1; i >= 0 && pattern[i] == pattern[j]; --i, --j) 
               len += 1;
        return len;
    }
    /** Main Function **/
    public static void main(String[] args) throws IOException
    {    
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        System.out.println("Boyer Moore Algorithm Test\n");
        System.out.println("\nEnter Text\n");
        String text = br.readLine();
        System.out.println("\nEnter Pattern\n");
        String pattern = br.readLine();
        BoyerMoore bm = new BoyerMoore(); 
        bm.findPattern(text, pattern);     
    }
} 

Ini adalah output dari program diatas :

Algoritma Brute Force

Hai ~
Ketemu lagi nih . Setelah kemarin kemarin kita membahas tentang algoritma sorting dan searching, kali ini kita akan membahas tentang algoritma pencocokan string . Algoritma brute force merupakan algoritma pencocokan string yang ditulis tanpa memikirkan peningkatan performa. Algoritma ini sangat jarang dipakai dalam praktik, namun berguna dalam studi pembanding dan studi-studi lainnya.

Bagaimana cara kerja dari algoritma ini ? Nah disimak yah~
Secara sistematis, langkah-langkah yang dilakukan algoritma brute force pada saat mencocokkan string adalah:
  1. Algoritma brute force mulai mencocokkan pattern pada awal teks.
  2. Dari kiri ke kanan, algoritma ini akan mencocokkan karakter per karakter pattern dengan karakter di teks yang bersesuaian, sampai salah satu kondisi berikut dipenuhi:
    1. Karakter di pattern dan di teks yang dibandingkan tidak cocok (mismatch).
    2. Semua karakter di pattern cocok. Kemudian algoritma akan memberitahukan penemuan di posisi ini.
  3. Algoritma kemudian terus menggeser pattern sebesar satu ke kanan, dan mengulangi langkah ke-2 sampai pattern berada di ujung teks.
Berikut adalah Algoritma brute force yang sedang bekerja mencari string:


Berikut adalah pseucode dari algoritma brute force

procedure BruteForceSearch(
        input m, n : integer,
        input P : array[0..n-1] of char,
        input T : array[0..m-1] of char,
        output ketemu : array[0..m-1] of boolean
       )

Deklarasi:
       i, j: integer 

Algoritma:
        for (i:=0 to  m-n) do
               j:=0
               while (j < n and T[i+j] = P[j]) do    
                        j:=j+1
               endwhile
               if(j >= n) then
                         ketemu[i]:=true;
               endif 
        endfor

Dan ini contoh implementasi pada java :

public class StringMatch {

   private static void match(char[] text, char[] pattern) {
     int j;
     int cek = 0;
     for (int i = 0; i <= text.length - pattern.length; i++) {
        j= 0;
        while (j < pattern.length && text[i + j] == pattern[j]){
           j++;
        }
        if (j >= pattern.length) {
           cek++;
        }
     }
     if (cek > 0) {
        System.out.println("DATA COCOK");
     } else {
        System.out.println("DATA TIDAK COCOK");
     }
   }
   public static void main(String[] args) {
      char[]
x = {'I', 'C', 'O', 'M'};
      char[]
y = {'I', 'C', 'O', 'M', 'I', 'T', '.', 'C', 'O', 'M'};
      match(y,x);
   }
}

Algoritma Greedy



Algoritma greedy merupakan metode yang paling populer untuk memecahkan persoalan
optimasi (persoalan untuk mencari solusi optimum) .


Hanya ada dua macam persoalan optimasi :

1. Maksimasi (maximization)


2. Minimasi (minimization)

Prinsip greedy: “take what you can get now!”.

Algoritma greedy membentuk solusi langkah per langkah (step by step). Pada setiap langkah, terdapat banyak pilihan yang perlu dieksplorasi. Oleh karena itu, pada setiap langkah harus dibuat keputusan yang terbaik dalam menentukan pilihan.  Pada kebanyakan kasus, algoritma greedy tidak akan menghasilkan solusi paling optimal, begitupun algoritma greedy biasanya memberikan solusi yang mendekati nilai optimum dalam waktu yang cukup cepat.

Pseucode untuk algoritma greedy

set Greedy (Set Candidate){

   solution= new Set( );
   while (Candidate.isNotEmpty()) {
     next = Candidate.select(); //use selection criteria,
                 //remove from Candidate and return value
     if (solution.isFeasible( next)) //constraints satisfied
   solution.union( next);
       if (solution.solves()) return solution
    }
   //No more candidates and no solution
   return null

}


Algoritma greedy merupakan algoritma yang besifat heuristik, mencari nilai maksimal sementara dengan harapan akan mendapatkan solusi yang cukup baik. Meskipun tidak selalu mendapatkan solusi terbaik (optimum), algoritma greedy umumnya memiliki kompleksitas waktu yang cukup baik, sehingga algoritma ini sering digunakan untuk kasus yang memerlukan solusi cepat meskipun tidak optimal seperti sistem real-time atau game.
Algoritma greedy memiliki beberapa fungsionalitas dasar, yaitu:
  1. Fungsi untuk melakukan penelusuran masalah.
  2. Fungsi untuk memilih local maximum dari pilihan-pilihan yang ada tiap langkahnya.
  3. Fungsi untuk mengisikan nilai local maximum ke solusi keseluruhan.
  4. Fungsi yang menentukan apakah solusi telah didapatkan.


Rabu, 14 Januari 2015

Binary Search pada Java

Setelah sebelumnya kita membahas tentang Algoritma Pengurutan (Algoritma Sorting), sekarang kita akan membahas tentang Algoritma Searching atau algoritma pengurutan ,


Algoritma Pencarian (Algoritma Searching) merupakan proses yang sangat penting dalam pengolahan data. Proses pencarian adalah menemukan nilai(data) tertentu didalam sekumpulan data yang bertipe sama.Sebuah algoritma pencarian dijelaskan secara luas adalah sebuah algoritma yang menerima masukan berupa sebuah masalah dan menghasilkan sebuah solusi untuk masalah tersebut, yang biasanya didapat dari evaluasi beberapa kemungkinan solusi. Algoritma pencarian (searching algorithm) adalah algoritma yang menerima sebuah Kata kunci dan dengan  langkah-langkah tertentu akan mencari rekaman dengan kata kunci tersebut.  Setelah proses pencarian dilaksanakan, akan diperoleh salah satu dari dua kemungkinan, yaitu data yang dicari ditemukan atau tidak ditemukan.
Ada beberapa macam Algoritma searching, salah satunya adalah Binary Search yang akan kita bahas kali ini . Untuk lebih jelasnya silahkan disimak .

Binary Search adalah sebuah algoritma pencarian dengan cara membagi data menjadi dua bagian setiap kali terjadi proses pencarian untuk menemukan nilai tertentu dalam sebuah larik (array) linear. 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. Pencarian Biner (Binary Search) dilakukan untuk :

  • Memperkecil jumlah operasi pembandingan yang harus dilakukan antara data yang dicari dengan data yang ada di dalam tabel, khususnya untuk jumlah data yang sangat besar ukurannya.
  • Beban komputasi juga lebih kecil karena pencarian dilakukan dari depan, belakang, dan tengah.
  • Prinsip dasarnya adalah melakukan proses pembagian ruang pencarian secara berulang-ulang sampai data ditemukan atau sampai ruang pencarian tidak dapat dibagi lagi (berarti ada kemungkinan data tidak ditemukan).
  • Syarat utama untuk pencarian biner adalah data di dalam tabel harus sudah terurut.

Kekurangan binary search yaitu data harus disorting dahulu dan Algoritma lebih rumit.


Ini contoh source code Binary Search :

import java.util.Scanner;

class BinarySearch
{
  public static void main(String args[])
  {
    int c, first, last, middle, n, search, array[];

    Scanner in = new Scanner(System.in);
    System.out.println("Enter number of elements");
    n = in.nextInt();
    array = new int[n];

    System.out.println("Enter " + n + " integers");


    for (c = 0; c < n; c++)
      array[c] = in.nextInt();

    System.out.println("Enter value to find");
    search = in.nextInt();

    first  = 0;
    last   = n - 1;
    middle = (first + last)/2;

    while( first <= last )
    {
      if ( array[middle] < search )
        first = middle + 1;   
      else if ( array[middle] == search )
      {
        System.out.println(search + " found at location " + (middle + 1) + ".");
        break;
      }
      else
         last = middle - 1;

      middle = (first + last)/2;
   }
   if ( first > last )
      System.out.println(search + " is not present in the list.\n");
  }
}

dan ini contoh tampilannya :


Sekian tutorial kali ini . Semoga bermanfaat ..

Selasa, 13 Januari 2015

Merge Sort pada Java

Hai semua~

Setelah sebelumnya kita membahas tentang salah satu Algoritma Sorting (Insertion Sort), sekarang kita membahas salah satu algoritma sorting lain yaitu Merge Sort .

Merge Sort adalah algoritma pengurutan dalam ilmu komputer yang dirancang untuk memenuhi kebutuhan pengurutan atas suatu rangkaian data yang tidak memungkinkan untuk ditampung dalam memori komputer karena jumlahnya yang terlalu besar. Algoritma ini ditemukan oleh John von Neumann pada tahun 1945.

Algoritma pengurutan data merge sort dilakukan dengan menggunakan cara divide and conquer yaitu dengan memecah kemudian menyelesaikan setiap bagian kemudian menggabungkannya kembali. Pertama data dipecah menjadi 2 bagian dimana bagian pertama merupakan setengah (jika data genap) atau setengah minus satu (jika data ganjil) dari seluruh data, kemudian dilakukan pemecahan kembali untuk masing-masing blok sampai hanya terdiri dari satu data tiap blok.

Setelah itu digabungkan kembali dengan membandingkan pada blok yang sama apakah data pertama lebih besar daripada data ke-tengah+1, jika ya maka data ke-tengah+1 dipindah sebagai data pertama, kemudian data ke-pertama sampai ke-tengah digeser menjadi data ke-dua sampai ke-tengah+1, demikian seterusnya sampai menjadi satu blok utuh seperti awalnya. Sehingga metode merge sort merupakan metode yang membutuhkan fungsi rekursi untuk penyelesaiannya.




Berikut adalah source code Merge Sort


/*
* Mengimplementasikan Merge Sort pada Java
*/
 
import java.util.Scanner;
 
/* Class MergeSort */
public class MergeSort 
{
   /* Fungsi Merge Sort */
   public static void sort(int[] a, int low, int high) 
   {
       int N = high - low;         
       if (N <= 1) 
           return; 
       int mid = low + N/2; 
       
                // recursively sort 
       sort(a, low, mid); 
       sort(a, mid, high); 
       
                // memisahkan 2 sub array yang berurutan 
       int[] temp = new int[N];
       int i = low, j = mid;
       for (int k = 0; k < N; k++) 
       {
           if (i == mid)  
               temp[k] = a[j++];
           else if (j == high) 
               temp[k] = a[i++];
           else if (a[j]<a[i]) 
               temp[k] = a[j++];
           else 
               temp[k] = a[i++];
       }    
       for (int k = 0; k < N; k++) 
           a[low + k] = temp[k];         
   }
   
            /* Main method */
   public static void main(String[] args) 
   {
       Scanner scan = new Scanner( System.in );        
       System.out.println("Test Merge Sort \n");
       int n, i;
            
            /* Memasukan jumlah data dalam integer */
       System.out.println("Masukan jumlah element integer");
       n = scan.nextInt();
       /* Membuat integer array di data n */
       int arr[] = new int[ n ];
       /* Menerima data */
       System.out.println("\nMasukan nilai "+ n +" element integer");
       for (i = 0; i < n; i++)
           arr[i] = scan.nextInt();
       
            /* Memanggil metode sorting (Merge Sort) */
       sort(arr, 0, n);
       
            /* Menampilkan data array yang sudah diurutkan */
       System.out.println("\nElement integer setelah diurutkan ");        
       for (i = 0; i < n; i++)
           System.out.print(arr[i]+" ");            
       System.out.println();            
                }    
}


Dan ini contoh program yang sudah dijalankan menggunakan Merge Sort


Sekian tutorial kali ini . Semoga bermanfaat~

Insertion Sort pada Java

Hai hai ..

Kali ini kita akan membahas tentang Algoritma Sorting pada bahasa Java . Algoritma sorting adalah : 
Algoritma yang meletakan elemen-elemen suatu kumpulan data dalam urutan tertentu atau proses pengurutan data yang sebelumnya disusun secara acak sehingga menjadi tersusun secara teratur menurut suatu aturan tertentu, kita ambil contoh pada aplikasi perbankan. Aplikasi tersebut mampu menampilkan daftar akun-akun yang aktif dan hampir seluruh pengguna sistem akan memilih tampilan daftar berurutan demi mempermudah penelusuran data. Misalnya urutan numerical atau leksikografi atau urutan abjad.


Insertion Sort adalah salah satu algoritma sederhana untuk pengurutan data yang acak agar menjadi data yang terurut. Dimana algoritmanya itu mirip dengan seperti kita mengurutkan kartu, jadi kita harus menentukan kunci(data yang kedua) kemudian dibandingkan dengan data sebelumnya jika data sebelumnya itu lebih besar maka tukar posisi begitu seterusnya sampai data sudah terurut semua.


Berikut contoh source code pada java untuk Insertion Sort  :

1.  /*
2.   * Mengimplementasikan Insertion Sort ke dalam java
3.   */
4.   
5.  import java.util.Scanner;
6.   
7.  /* Class InsertionSort */
8.  public class InsertionSort
9.  {
10.    /* Fungsi Insertion Sort */
11.    public static void sort( int arr[] )
12.    {
13.        int N = arr.length;
14.        int i, j, temp;
15.        for (i = 1; i< N; i++)
16.        {
17.            j = i;
18.            temp = arr[i];   
19.            while (j > 0 && temp < arr[j-1])
20.            {
21.                arr[j] = arr[j-1];
22.                j = j-1;
23.            }
24.            arr[j] = temp;           
25.        }       
26.    }   
27.    /* Main method */
28.    public static void main(String[] args)
29.    {
30.        Scanner scan = new Scanner( System.in );       
31.        System.out.println("Insertion Sort Test\n");
32.        int n, i;
33.        /* Memasukan jumlah data dalam integer */
34.        System.out.println("Masukan jumlah element integer");
35.        n = scan.nextInt();
36.        /* Membuat integer array dielement n */
37.        int arr[] = new int[ n ];
38.        /* Menerima data */
39.        System.out.println("\nMasukan nilai "+ n +" element integer");
40.        for (i = 0; i < n; i++)
41.            arr[i] = scan.nextInt();
42.        /* Memanggil metode sorting (Insertion Sort) */
43.        sort(arr);
44.        /* Menampilkan data array yang sudah diurutkan */
45.        System.out.println("\nElement integer setelah diurutkan ");       
46.        for (i = 0; i < n; i++)
47.            System.out.print(arr[i]+" ");           
48.        System.out.println();                    
49.    }   
      50.}

Dan ini output yang dihasilkan



Sekian tutorial kali . Semoga bermanfaat dan selamat ngodiing !!

Selasa, 06 Januari 2015

Decision dan Looping pada Java


Hai hai ..

Setelah tipe data dan console data, kali ini saya akan membahas tentang Decision Process dan Looping Process . Pastinya tau dong yah maksud dari decision dan looping disini apa . Decision adalah comment yang berfungsi untuk memutuskan sesuatu, sedangkan looping adalah comment yang berfungsi untuk mengulang comment comment yang sudah ada . Lebih lanjurnya, silahkan di liat dibawah ini : 

Terdapat 3 jenis syntax decision pada Java, yaitu:

1. If-Else,
contoh: 

if(i>=40) 
{
    // 40 ke atas
 }

else if(i>=0 && i<=20) 
{
    // 0 sampai 20
 }

else 
{      
    // selain keduanya
 }

2. Switch-Case.
contoh:

switch(i) 
{
        case 1: case 2: case 3: // 1, 2, dan 3
        break;
        
        case 7:// 7 saja
        case 9:// 7 dan 9
        break;
        
        default: // selain 1, 2, 3, 7, dan 9
        break;
}

3. Ternary Operator, contoh:

int i2 = ( i > 10 ? 3 : 2 );

4. Try-Catch-Finally.
contoh:

Console console = System.console();
String line = console.readLine();
int val = 0;
try {
        val = Integer.parseInt(val);
      }
         catch (Exception ex)  // atau NumberFormatException
         {    
                  System.err.println("angka tidak valid”);
         }

         System.out.println("nilai val adalah " + val);


Nah yang di atas adalah beberapa macam decision, sekarang kita bahas untuk yang looping .

Terdapat 4 jenis syntax looping pada Java, yaitu:

1. while 
yaitu looping dengan pemeriksaan di awal, contoh:

x=8; while(x>2) 
{
         x -= 2;
         System.out.print(x);
}

2. dowhile,
yaitu looping dengan pemeriksaan di akhir, minimal dijalankan 1x,
contoh:

x=9; do 
{
    System.out.print(x);
    x /= 2;
 } 

while(x>1);

3. for;;
yaitu looping dengan inisialisasi, syarat dan increment/decrement, contoh:

for(int z=1;z<9;z+=2) 
{
      System.out.print(z);
 }

4. for:
yaitu looping untuk array atau parameter varargs, contoh:

class Test 
{
    public static void main(String[] args) 
    {
         for(String s: args) System.out.println( s );
    }
// jalankan program dengan perintah: java Test 1 dua ‘ti ga’ "em’pat"