Selasa, 04 Oktober 2016

Combinatorial Problem

Combinatorial problem (masalah kombinatorial)
Kombinatorial adalah cabang matematika untuk menghitung jumlah penyusunan objek-objek tanpa harus mengenumerasi terlebih dahulu seperti permutasi atau kombinasi.
pada kehidupan sehari-hari kombinatorial dan peluang diskrit banyak sekali ditemui. Misalnya saja untuk menyelesaikan Vehicle Routing Problem (VRP) dan beberapa games sederhana yaitu Blackjack .
Kaidah perkalian (rule of product) dan kaidah penjumlahan (rule of sum) adalah dua kaidah dasar untuk memecahakan persoalan menghitung dalam Kombinatorial.
1.      Kaidah perkalian
Bila percobaan ke-1 menghasilkan p kemungkinan jawaban, dan percobaan ke-2 menghasilakan q kemungkinan, maka apabila percobaan ke-1 dan ke-2 akan menghasilakan p x q kemungkinan jawaban yang mungkin terjadi.

2.      Kaidah penjumlahan
Bila percobaan ke-1 menghasilkan p kemungkinan jawaban, dan percobaan ke-2 menghasilakan q kemungkinan, maka apabila percobaan ke-1 atau ke-2 akan menghasilakan p + q kemungkinan jawaban yang mungkin terjadi.
Kata yang di garis bawahi yaitu dan serta atau. Kedua kata ini adalah kata kunci untuk mengidentifikasi apakah suatu persoalan menghitung dapat diselesaikan dengan kaidah perkalian atau kaidah penjumlahan. Kaidah perkalian menyatakan bahwa kedua percobaan dilakukan secara simultan atau serempak, sedangkan pada kaidah penjumlahan, kedia percobaan dilakukan tidak simultan.

Dalam kombinatorial juga terdapat prinsip Inklusi- Eksklusi. Prinsip ini juga dapat digunakan untuk menyelesaikan persoalan kombinatorial. rumus dari Prinsip Inklusi – Eksklusi adalah :
      |A U B|=|A| + |B| -|A∩B|



Beberapa Aplikasi mengunakan kombinatorial

A.      VRP (Vehicle Routing Problem)
Vehicle Routing Problem (VRP) merupakan permasalahan optimasi penentuan rute dengan keterbatasan kapasitas kendaraan.  Pada permasalahan ini, ada sebuah depot awal dan sejumlah n tempat untuk dikunjungi dengan demand yang dapat berbeda-beda. Sebuah kendaraan diharapkan untuk memenuhi permintaan setiap tempat tersebut dari depot.


Secara ringkas, karakterristik permasalah VRP adalah sebagai berikut :
a.      Perjalanan berawal dan berakhir dari dan ke depot awal seperti pada gambar di atas.
b.      Apabila kendaraan sudah terpakai dan tidak dapat melayani tempat berikutnya, kendaraan dapat kembali ke depot untuk memenuhi kapasitas kendaraan dan melayani tempat berikutnya.
c.       Tujuan dari permasalahan ini adalah meminimumkan total jarak yang ditempuh kendaraan dengan mengatur urut-urutan tempat yang harus dikunjungi beserta kapan kembalinya kendaraan kedepot.

Contoh dari pengunaan PRV adalah route Bus Parawisata.

Referensi  
1.      Munir,  Rinaldi, Matematika  Diskrit  Edisi  Ketiga.  Bandung  : Penerbit Informatika
https://en.wikipedia.org/wiki/Vehicle_routing_problem

Numerical Problem

Numerical Problem
Numerical problem bisa juga diartikan sebagai suatu studi algoritma yang memecahkan masalah dalam matematika kontinu. Kebanyakan dalam numerik ini dipakai untuk pemecahan operasi matrik dan vektor karena lebih cepat sedangkan kecepatan pemecahannya bervariasi tergantung urutan besarnya data dan juga bisa menyelesaikan permasalahan yang berkaitan dengan analisis numerik

Sumber : http://informatika.stei.itb.ac.id/~rinaldi.munir/Buku/Metode%20Numerik/BAb-%2001%20Metode%20Numerik%20Secara%20Umum.pdf

Numerical Problem

Numerical problem bisa juga diartikan sebagai suatu studi algoritma yang memecahkan masalah dalam matematika kontinu. Kebanyakan dalam numerik ini dipakai untuk pemecahan operasi matrik dan vektor karena lebih cepat sedangkan kecepatan pemecahannya bervariasi tergantung urutan besarnya data dan juga bisa menyelesaikan permasalahan yang berkaitan dengan analisis numerik

Sumber : http://informatika.stei.itb.ac.id/~rinaldi.munir/Buku/Metode%20Numerik/BAb-%2001%20Metode%20Numerik%20Secara%20Umum.pdf

Graph

Definisi Graph

Graph adalah kumpulan busur dan simpul, secara matematis dapat kita tuliskan SBB.

G = (V,E)

G = Graph
V = Vertex/Simpul, Node/Titik
E = Edge/Busur

Jenis Graph
a. Directed Graph (Digraph)
Jika sisi-sisi graph hanya berlaku satu arah.
Misalnya :
{x,y} yaitu arah x ke y, bukan dari y ke x;
x disebut origin dan y disebut terminus. Secara notasi sisi digraph ditulis sebagai vektor (x, y).

Contoh Digraph G = {V, E} : V = {A, B, C, D, E, F, G, H, I,J, K, L,

E = {(A,B),(A,C), (A,D), (A,F), (B,C), (B,H), (C,E), (C,G), (C,H), (C,I), (D,E), (D,F), (D,G), (D,K), (D,L), (E,F), (G,I), (G,K), (H,I), (I,J), (I,M), (J,K), (J,M), (L,K), (L,M)}.


b. Graph Tak Berarah (Undirected Graph atau Undigraph) 
Setiap sisi {x, y} berlaku pada kedua arah: baik x ke y maupun y ke x. Secara grafis sisi pada undigraph tidak memiliki mata panah dan secara notasional menggunakan kurung kurawal.

Contoh Undigraph G = {V, E} :

 V = {A, B, C, D, E, F, G, H, I,J, K, L, M}

 E = { {A,B},{A,C}, {A,D}, {A,F}, {B,C}, {B,H}, {C,E}, {C,G}, {C,H}, {C,I}, {D,E}, {D,F}, {D,G}, {D,K}, {D,L}, {E,F}, {G,I}, {G,K}, {H,I}, {I,J}, {I,M}, {J,K}, {J,M}, {L,K}, {L,M}}


Masalah-Masalah Graph 
  1. Masalah path minimum (Shortest path problem)Mencari route dengan jarak terpendek dalam suatu jaringan transportasi
  2. Masalah aliran maksimum (maximum flow problem)
    Menghitung volume aliran BBM dari suatu reservoir ke suatu titik tujuan melalui jaringan pipa
  3. Masalah pencarian dalam graph (graph searching problem) Mencari langkah-langkah terbaik dalam program permainan catur komputer. 
  4. Masalah pengurutan topologis (topological ordering problem)
    Menentukan urutan pengambilan mata-mata kuliah yang saling berkaitan dalam hubungan prasyarat (prerequisite). 
  5. Masalah jaringan tugas (Task Network Problem)
    Membuat penjadwalan pengerjaan suatu proyek yang memungkinkan waktu penyelesaian tersingkat. 
  6. Masalah pencarian pohon rentang minimum (Minimum Spanning Tree Problem) Mencari rentangan kabel listrik yang totalnya adalah minimal untuk menghubungkan sejumlah kota. 
  7. Travelling Salesperson ProblemTukang pos mencari lintasan terpendek melalui semua alamat penerima pos tanpa harus mendatangi suatu tempat lebih dari satu kali.
  8. Four-color problem
    Dalam menggambar peta, memberikan warna yang berbeda pada setiap propinsi yang saling bersebelahan.

Rangkuman Struktur Data Graph
Mengenal Graph ƒ

  • Terdiri dari node 
  • Terdiri dari link
Node disebut vertex ƒ

  • Link disebut edge ƒ
  • Informasi penting dalam graph adalah koneksi antar vertex

  • Pada undirected graph, tidak terdapat directions (arah) ƒ
  • Edge dari v0 ke v1 adalah sama dengan edge dari v1 ke v0 ƒJika sebuah masalah dapat direpresentasikan ke dalam bentuk graph maka solusi dari masalah tersebut bisa dicari dengan bantuan graph
  • ƒSetiap vertex mewakili sebuah kondisi (state) dan edge mewakili transisi antar state

Analogi Graph dalam Kehidupan Sehari-Hari


      Graph dalam kehidupan sehari-hari dapat dianalogikan sebagai suatu jaringan satu dengan jaringan lainnya yang saling terhubung. Misal seperti negara Indonesia yang memiliki banyak kota seperti: Jakarta, Bandung, Srabaya, Yogyakarta. Kota-kota itulah yang tergabung dalam negara Indonesia dan kota-kota itulah yang saling berhubungan.

Referensi
http://www.slideshare.net/zaldyputra/makalah-graph-i
http://eprints.undip.ac.id/5202/2/BAB_I_dan_II.pdf
https://www.google.co.id/url?sa=t&rct=j&q=&esrc=s&source=web&cd=3&cad=rja&uact=8&ved=0ahUKEwi5s8eA-cDPAhVBKY8KHWBkBSgQFggpMAI&url=http%3A%2F%2Fwww.informatika.unsyiah.ac.id%2Ftfa%2Fds%2Fgraph.pdf&usg=AFQjCNHWZIOpY-xapCzT6cP4dcD84vR9_g&sig2=C2LbiffCPD_cQdxyLJSbRA&bvm=bv.134495766,d.c2I

Searching

Searching
Searching atau pencarian merupakan proses yang fundamental dalam pengelolaan data.proses pencarian bertujuan untuk menemukan data tertentu dalam sekumpulan data yang bertipe sama .
sebagai contoh, saat kita akan mengubah suatu data maka hal yang pertama kali kita lakukan adalah mencari keberadaan data tersebut. Contoh lainnya pada saat ita akan menginsertkan data, hal yang paling pertama kita melakukan pencarian agar tidak menginputkan data yang sama, setalah titu baru kita bias menginputkan data.
Ada dua maca metode  searching, yaitu :

1.      Sequential Search
Sequential Search atau pencarian beruntun adalah algoritma pencarian yang paling sederhana dibandingkan dengan Bianary Search. Pada dasarnya metode pencarian ini mengunaka proses mebandingkan satu persatu secara beruntun mulai dari elemen awal hingga elemen yang dicari ditemukan, atau seluruh elemen sudah diperiksa. Oleh karena itu metode sequential search memiliki nama lain yaitu linear search atau pencarian lurus.
Pencarian beruntun dapat dilakukan dengan dua acara yaitu dengan menguanankan Boolean atau tanpa Boolean .
Contoh pengunaan sequential seach tanpa Boolean :
Di misalkan data sebagai berikut,
Data
3
6
2
9
15
Indeks
1
2
3
4
5

Data yang di cari adalah 2
lalu program akan membadingkan data yang dicari dengan data yang ada,
Indeks 1(3) = 2 ? tidak
indeks 2(6) = 2 ? tidak
indeks 3(2) = 2 ? ya
Setelah dibadingkan ternyata data yang dicari ditemukan pada indeks ke 3.

Algoritma dari sequential search mengunakan Boolean.

Contoh pengunaan sequential search dengan boolean

logika pencarian dengan boolean sama dengan yang tanpa boolean haya algoritmanya saja yang berbeda.
1.      Binary Search
Berbeda dengan sequential search yang bisa dilakukan dengan data acak, binary search hanya akan berjalan jika data telah terurut.
Binary search adalah pencarian dengan membagi larik menjadi dua bagian. Prinsip yang digunakan dalam sequential search sama seperti kita mencari data dalam kamus, yaitu membagi dua dan dibandingkan, apabila masil belum ketemu akan dibagi dua dan dibandingkan lagi.
Algoritma: 
Di misalkan data sudah terurut :
A
3
6
8
12
18
51
62
66
1
2
3
4
5
6
7
8

Kasus ke-1  : cari = 12
Langkah 1 : tengah = (batasatas + batasbawah) div 2=( 1 + 8 ) div 2 = 4
A [tengah] = A [4] = 12pada Looping pertama data telah ditemukan.
Kasus ke-2 : cari = 10
Langkah pertama :tengah=(batasatas + batasbawah) div 2=( 1 +  8 ) div 2=4
A [tengah] = A [4] = 12 > cari = 10, berarti Batasbawah =tengah – 1 = 4 – 1 = 3

Langkah kedua :tengah=(batasatas + batasbawah) div 2=( 1 +  3 ) div 2=2
A [tengah] = A [2] = 5 < cari = 10, berarti Batasatas =tengah + 1 = 2 + 1 = 3

Langkah ketiga :tengah=(batasatas + batasbawah) div 2=( 3 +  3 ) div 2=3
A [tengah] = A [3] = 8, berarti  setelah Langkah ketiga, data tidak ditemukan


Kedua algoritma pencarian ini memiliki kelebihan dan kekurangan masing-masing. Algoritma pencarian beruntun dapat digunakan untuk data yang sudah terurut maupun data yang belum terurut. Sebalik, Algoritma pencarian bagi dua hanya dapat digunakan jika data telah terurut.
Jika kita tinjau dari kinerja pencarian, apabila data x tidak ditemukan, algoritma pencarian beruntun akan mencarinya sebanyak x(banyaknya data), sedangkan algoritma pencarian bagidua memerlukan waktu yang sebanding dengan 2log(x).
perbandingan anatara algoritma sequential search dengan binary search, dimisalkan data sudah terurut :
Untuk larik yang berukuran x = 256 elemen
sequential search melakukan perbandingan elemen larik
sebanyak 256 kali. Sedangakan , algoritma binary search melakukan
perbandingan elemen larik sebanyak 2log(256) = 8 kali.


Referensi :
Munir,renaldi.,Algoritma & Pemrograman Dalam Bahasa Pascal Dan C edisi revisi ,Informatika Bandung, 2011.

Geometry Problems

GEOMETRY PROBLEMS
Geometry problem adalah yang berhubungan dengan objek geometri seperti: titik garis dll. di dalam analisis algoritma masalah geometry ini di selesaikan menggunakan komputasi(komputer) adapun algoritma penyelesaian yang digunakan didalam geometri probelm dalam komputasi  di sini kami bahas hanya dua:
1.      Closest pair problem
2.      Convex hull problem

1.      Closest pair probelm
Permasalahan  closest  pair  merupakan  salah  satu permasalahan  klasik  dalam  dunia  matematika  diskrit. Secara  singkat,  deskripsi  permasalahan  adalah  sebagai berikut: diberikan N buah titik yang terletak pada bidang planar 2 dimensi,  tentukanlah  dua  buah  titik  yang memiliki jarak paling dekat.
. Kita asumsikan bahwa titik pada pertanyaan ditetapkan dalam bentuk standar dengan Koordinat Cartesius (x, y) dan bahwa jarak antara dua titik Pi = (xi, yi) dan Pj = (xj, yj)  adalah jarak Euclidean standar.

Pendekatan brute force untuk menyelesaikan masalah ini mengarah pada algoritma: menghitung jarak antara setiap pasangan titik yang berbeda dan menemukan pasangan dengan jarak terdekat.Tentu saja, kita tidak ingin menghitung jarak antara pasangan titik yang sama dua kali. Supaya tidak melakukan hal itu, kita menganggap hanya ada pasangan titik titik (Pi, Pj) dimana i < j.
Algoritma BruteForceClosestPoint(P)
          

            for i ß i to n – 1 do
                  for j ß i + 1 to n do
                        d ß sqrt sqrt adalah fungsi akar kuadrat
                        if d < dmin
                                    dmin ß d; index1 ß i; index2 ß j
operasi dasar algoritma akan menguadratkan angka tersebut. Berapa kali hal ini dilaksanakan dapat dihitung sebagai berikut:

 penyelesaian dengan algoritma divide and conquer
tidak sesederhana algoritma brute force. Penyelesaian dengan divide and conquer membutuhkan pencapaian sebuah lemma yang bergantung pada strategi penyelesaian itu sendiri. Lemma inilah yang menjadi kunci optimasi. Pada konsepnya, penyelesaian menggunakan algoritma divide and conquer dapat diabstraksikan melalui pseudocode berikut:

function findClosestPair(left , right) : real
 if (right = left) return 0
else
l = findClosestPair(left , (left + right) / 2)
r = findClosestPair((left + right) / 2 + 1 , right)
mid = conquer(left , right)
return min(l,r,mid)

2.      Convex hull problem
Definisi suatu himpunan titik (berhingga atau tak terhingga) pada bidang disebut cembung jika untuk setiap dua titik P dan Q pada himpunan, seluruh ruas garis dari P dan Q berada didalam himpunan tersebut.
Convex Hull dari himpunan n titik pada bidang adalah polygon cembung terkecil yang mencakup seluruhnya (baik didalam maupun pada batasnya).

memecahkan masalah convex-hull dalam kerangka Brute-Force
Brute force search adalah cara yang sangat mudah diimplementasikan untuk memecahkan masalah karena brute force search selalu mencari  solusi dari seluruh kemungkinan yang ada. tetapi tidak efisien yang didasarkan pada pengamatan berikut ini mengenai segmen garis bata dari convex hull: segmen garis yang menghubungkan dua titik Pi dan Pj dari  satu himpunan N titik merupakan bagian dari batas convex-hull-nya jika dan hanya jika semua titik lain pada himpunan terletak pada sisi yang sama dari garis lurus melalui kedua titik ini. Akan tetapi pemecahan masalah menggunakan metode brute force biasanya memerlukan sumber yang banyak baik waktu dan memori dan kebutuhan tersebut makin membesar dengan cepat sejalan dengan banyaknya permasalahan yang ingin diselesaikan
Beberapa bukti mendasar dari geometri analitik dibutuhkan untuk mengimplementasikan algoritma ini. Pertama, garis lurus melalui dua  (x1,y2) (y1,x2)  dalam bidang koordinat dapat didevenisikan dengan persamaan

Pemecahan Masalah Convex Hull dengan Algoritma Divide and Conquer
Pada penyelesaian masalah pencarian Convex Hull dengan menggunakan algoritma Divide and Conquer, hal ini dapat dipandang sebagai generalisasi dari algoritma pengurutan merge sort. Berikut ini merupakan garis besar gambaran dari algoritmanya:
·         Lakukan pengurutan p1, p2, ... pN dalam koordinat X à|S|
·         Buat partisi himpunan titik-titik tersebut menjadi 2 himpunan A dan B, dimana A terdiri dari setengah jumlah dari |S| dan titik dengan koordinat X yang terendah dan B terdiri dari setengah dari jumlah |S| dan titik dengan koordinat X terbesar
·         Secara rekursif lakukan penghitungan terhadap HA = conv(A) dan HB = conv(B)
·         Gabungkan (merge) kedua hull tersebut menjadi convex hull, H, dengan menghitung dan mencari upper dan lower hull (tangents) untuk HA dan HB. Setiap titik searah jarum jam untuk himpunan yang berada di sebelah kanan, dan berlawanan arah jarum jam pada himpunan yang berada di sebelah kiri. dengan mengabaikan semua titik yang berada diantara dua buah tangen ini

Sumber:
E-Book [Anany Levitin]-Intro_2_Design&Analysis_Algorithms




Algoritma pencarian string

Algoritma pencarian string atau sering disebut juga pencocokan string adalah algoritma untuk melakukan pencarian semua yang di temukan, untuk string yang pendek di sebut dengan pattern dan untuk string yg panjang di sebut dengan text

Pencocokkan string adalah permasalahan paling sederhana dari semua permasalahan string lainnya, dan dianggap sebagai bagian dari pemrosesan data, pengkompresian data, analisis leksikal, dan temu balik informasi. Teknik untuk menyelesaikan permasalahan pencocokkan string biasanya akan menghasilkan implikasi langsung ke aplikasi string lainnya :

Algoritma-algoritma pencocokkan string dapat di bedakan menjadi tiga menurut arah pencariannya.

1. Dari arah dari kiri ke kanan, yang merupakan arah untuk membaca, algoritma yang termasuk kategori ini adalah:
· Algoritma Brute Force
· Algoritma dari Morris dan Pratt, yang kemudian dikembangkan oleh Knuth, Morris, dan Pratt
2. Dari kanan ke kiri, arah yang biasanya menghasilkan hasil terbaik secara praktikal, contohnya adalah:
· Algoritma dari Boyer dan Moore, yang kemudian banyak dikembangkan, menjadi Algoritma turbo Boyer-Moore, Algoritma tuned Boyer-Moore, dan Algoritma Zhu-Takaoka;
3. dari arah yang ditentukan secara spesifik oleh algoritma tersebut, arah ini menghasilkan hasil terbaik secara teoritis, algoritma yang termasuk kategori ini adalah:
· Algoritma Colussi
· Algoritma Crochemore-Perrin

Algoritma Bruce Force
Jenis algoritma ini merupakan algoritma yang mencocokan sebuah pattern atau kata kunci dalam suatu data yang tersimpan antara indeks 0 sampai indeks n – m untuk mengetahui keberadaan pattern dalam suatu text ( Mesran ).
Text disini merupakan suatu data yang tersimpan dalam komputer sedangkan pattern merupakan kata kunci yang akan dicari dalam suatu data. Bentuk algoritma Brute Force ini akan dilakukan dengan cara mengecek satu huruf pada pattern dengan text pada indeks awal atau biasanya pada array 0. Kemudian, algoritma ini akan mencocokan antara kedua huruf tersebut dan jika tidak, maka program akan langsung ke huruf selanjutnya. Proses pencocokan satu huruf antara pattern dengan text dari kiri ke kanan yang bersesuaian sampai salah satu kondisi berikut terpenuhi :
 1. Karakter atau huruf di pattern dan di text yang dibandingkan tidak cocok.
 2. Jika semua karakter pattern cocok dengan text, program akan memberitahukan penemuan pada di posisi ini dan menambahkan nilai suatu variabel sebagai banyaknya pattern yang ditemukan dalam text.
Algoritma ini akan terus menggeser pattern sebesar satu ke kanan dan mengulang lagi yaitu mengecek karakter lagi sampai pattern berada di ujung text. Penggunaan algoritma Bruce Foore ini juga memiliki kelebihan dan kelemahan. Adapun kelebihan dari algoritma ini adalah sebagai berikut :

1. Algoritma ini dapat memecahkan hampir sebagian besar masalah.
2. Sederhana dan mudah dimengerti. Hal ini dapat dilihat dari bentuk algoritma bahwa karakter pattern akan mengecek pada karakter di text. Jika tidak cocok, maka langsung ke karakter berikut. sedangkan jika cocok, karakter lanjut ke kanan dengan mengecek karakter pattern dari awal dengan karate text berikutnya.

3. Algoritma Bruce Force ini mampu menghasilkan algoritma yang layak untuk beberapa masalah terpenting seperti pencarian, pengurutan, pencocokan, dan lain – lain.
4. Algoritma ini mampu menghasilkan baku untuk tugas – tugas komputasi.

Sedangkan kelemahan pada penggunaan algoritma Bruce Force ini dapat diuraikan sebagai berikut : 

1. Algoritma ini jarang menghasilkan algoritma yang baik.
2. Algoritma ini bisa dikatakan kurang kontruktif dalam teknik pemecahan masalah. Bentuk algoritma Bruce Force dapat digambarkan sebagai berikut : Misalkan : Ada seorang anak menulis kalimat “anak ayam.” Anak tersebut mencari kata kunci ( pattern ) “ayam”, maka jalan algoritma Bruce Force dapat diuraikan sebagai berikut : Text : anak ayam Pattern : ayam.

Proses 1 : 
Program akan diawali dengan mengecek dari karakter awal pada pattern dan text. Pada karakter pertama dan memiliki kecocokan pada pattern dan teks yaitu “a”. Tetapi, pada indeks kedua tidak mengalami kecocokan pada karakter pattern dan text sehingga pada pattern akan berpindah ke indeks kedua

INDEKS
0
1
2
3
4
5
6
7
8
TEXT
a
n
a
k

a
y
a
M
PATERN
a
y
a
m






Proses 2 : 
Program akan mengecek karakter pertama pattern dengan text pada indeks kedua. Jika dilihat, karakter pada indeks ini cocok sehingga pattern ini melajutkan ke indeks selanjut nya tetapi pada indeks ketiga patern dan text tidak cocok jadi patern akan berpindah ke indeks keempat. Dilihat dari gambar di bawah ini, dari indeks kedua cocok tetapi indeks ketiga tidak cocok sehingga beralih ke indeks keempat pada karakter text.

INDEKS
0
1
2
3
4
5
6
7
8
TEXT
a
n
a
k

a
y
a
m
PATERN


a
y
a
m




INDEKS
0
1
2
3
4
5
6
7
8
TEXT
a
n
a
k

a
y
a
m
PATERN




a
y
a
m



Proses 3
Pada indeks kelima ( karakter text ) memiliki kecocokan dengan karakter awal pada pattern yaitu “a”. Kemudian maju ke indeks selanjutnya pada text. Pada indeks keenam sampai kedelapan pada text ini memiliki kesamaan pada tiap karakter pattern sehingga program ini akan menambahkan nilai variabel sebagai bentuk bahwa kata kunci yang dimaksud sudah ditemukan.

INDEKS
0
1
2
3
4
5
6
7
8
TEXT
a
n
a
k

a
y
a
m
PATERN





a
y
a
m

Dalam pencocokan karakter antara pattern dan text akan menjadi berbeda status pada saat mengecek kedua karakter tersebut sama tetapi karakter pattern berhuruf besar sedangkan text berhuruf kecil atau sebaliknya. Hal ini tentunya akan menjadi pembeda karena dalam pemrograman memiliki karakter tersendiri baik huruf besar maupun huruf kecil(case sensitive).
Contoh pseudo code 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


Algoritma Knuth-Morris-Pratt
Jenis algoritma ini merupakan proses matching yang dilakukan untuk mengetahui jumlah penggeseran yang dilihat dari kesamaan String antara prefix dan suffix. Dengan menggunakan kedua tersebut, algoritma ini akan membuat penggeseran lebih jauh lagi tidak hanya satu karakter saja seperti algoritma Bruce Force. Proses pengecekan karakter pattern dengan karakter text hampir sama dengan algoritma Bruce Force. Namun, yang berbeda adalah pada saat kondisi antara kedua karakter pattern dan text tidak sama yang akan melakukan penggeseran dilihat dari kesamaan prefix dan suffix.
Algoritma KMP dapat membangun sebuah mesin automata yang statusstatusnya adalah status dari string dimana sistem sedang cari. Dan setiap status memiliki fungsi berhasil dan gagal. Berhasil artinya status akan bergerak lebih mendekat ke status akhir dan gagal artinya status bisa jadi semakin jauh atau tetap terhadap status akhir. Sistem akan mendapatkan sebuah karakter dari text saat kita berhasil dalam membandingkan dan akan mereuse karakter apabila sistem mengalami kegagalan.





Persoalan pencarian string dirumuskan sebagai berikut:
  1. Sebuah teks (text), yaitu sebuah (long) string yang panjangnya n karakter.
  2. Pattern, yaitu sebuah string dengan panjang m karakter (m<n) yang akan dicari dalam teks.
Cari lokasi pertama di dalam teks yang bersesuaian dengan pattern. Aplikasi permasalahan pencocokan string biasa ditemukan dalam pencarian sebuah kata dalam dokumen (misalnya menu Find dalam Microsoft Word).
                Contoh:
                               Pattern: formasi
                                Teks      : info inform diinformasikan
                


  • Mula-mula pattern dan teks sejajar pada posisi paling kiri, dan dibandingkan karakter pertamanya.
  • Langkah 1 dan 2 sama dengan algoritma Brute Force.
  • Pada langkah 3, ketidakcocokan terjadi saat membandingkan karakter ke-3 dari pattern (“R”) dan karakter ke-5 dari teks (spasi). Metode KMP akan memeriksa apakah pada teks yang dilewati pada langkah ini (yaitu F-O-spasi) terdapat karakter awal pattern (yaitu F), dan ternyata cocok di karakter pertama yang sudah dibandingkan pada langkah ini. Karena itu tidak perlu menggeser pattern satu per satu, pattern dapat langsung digeser sejauh 3 karakter pada langkah selanjutnya (langkah 4).
  • Kasus yang sama ditemui lagi pada langkah 6, di mana pattern dapat digeser sejauh 5 karakter ke kanan pada langkah 7. Demikian seterusnya, hingga pada akhirnya hanya diperlukan 11 langkah untuk menemukan pattern pada teks.


Dalam algoritma pencarian string, teks diasumsikan berada di dalam memori, sehingga bila kita mencari string di dalam sebuah arsip, maka semua isi arsip perlu dibaca terlebih dahulu, kemudian disimpan di dalam memori. Jika pattern muncul lebih dari sekali di dalam teks, maka pencarian hanya akan memberikan keluaran berupa lokasi pattern ditemukan pertama kali.

ALGORITMA:
procedure KMPsearch(input m, n:integer, input P: array[1..m]of char,   input T: array[1..n] of char, output idx: integer)
{Mencari kecocokan pattern P di dalam teks T dengan algoritma Knuth-Morris-Pratt. Jika ditemukan P di dalam T, lokasi awal kecocokan disimpan di dalam peubah idx.
Masukan: pattern P yang panjangnya m dan teks T yang panjangnya n. Teks T direpresentasikan sebagai string [array of character]
Keluaran: posisi awal kecocokan [idx]. Jika P tidak ditemukan, idx=-1.}
Deklarasi
  i,j: integer
  ketemu: boolean
  b: array[1..m] of integer

procedure HitungPinggiran(input m: integer, P: array[1..m] of char, output b: array[1..m] of integer)
{menghitung nilai b[1..m] untuk pattern P[1..m]}
Algoritma
for ((setiap baris) and (not ketemu)) HitungPinggiran(m,P,b)
  j   0
  i   1
  ketemu   false
  while (i ≤ n and not ketemu) do
 
   while((j>0) and (P[j+1]≠T[i]))do
      j   b[j]
   endwhile

   if P[j+1]=T[i] then
      j   j+1
   endif
   if j= m then
      ketemu    true
   else
      i   i+1
   endif
endwhile
if ketemu then
   idx    i-m+1 {catatan: jika indeks array dimulai dari 0, maka idx   i-m}
else
   idx    -1
  endif
endfor
if (not ketemu)
    for ((setiap kolom) and (not ketemu))
     {lakukan yang sama seperti pada baris}
    endfor
endif

Algoritma Boyer Moore

          Algoritma Boyer Moore ini merupakan lawan dari algoritma Bruce Force. Hal ini dapat dilihat bahwa untuk melakukan proses matching akan memulai pencocokkan karakter dari kanan, dan bukan dari kiri.
        Didalam algoritma Boyer Moore ini menggunkan metode gerakan geser (slide) dan lompat (jump). Garakan geser untuk memberikan jumlah berapa kali pattern agar cocok sedangkan  Gerakan Lompat untuk memberikan jumlah berapa kali pattern digeser agar cocok karakter terakhir yang kemunculan awalnya dengan pattern.
        Algoritma Boyer Moore adalah algoritma yang tepat untuk proses matching. ini dapat diketahui bahwa algoritma ini dapat mencocokan dari kanan string atau pattern maka ketidakcocokan mungkin membantu kita untuk menggerakkan pattern tersebut dengan jarak yang  lebih jauh yang artinya akan lebih signifikan dalam mengurangi proses perbandingan.
Misalkan ada sebuah teks seperti ini “saya mau pergi sekolah” yang akan dicari dengan kata kunci “sekolah”. Pada kata pattern ini akan dibuat array dengan menggunakan indeks huruf pattern dan posisi huruf tersebut adalah nilai ukuran indeks dari 0 sampai n yang dapat digambarkan sebagai berikut :

Pattern[]
[s]
[e]
[k]
[o]
[l]
[a]
[h]
Indeks
0
1
2
3
4
5
6

Proses matching sebagai berikut:
Proses 1 :
Pertama tama di cocokan antara karakter terakhir dari pattern dengan karakter kelima dari text. Maka di gunakan rumus dibawah ini:

Karakter ke i = i + m - Math.min(j, 1+lo); dengan lo = last[pattern.chartArt(i)]

 Dengan keterangan :
i = nilai indeks pada karakter text yang tidak cocok dengan karakter pattern.
m = panjang karakter pattern.
j = nilai indeks pada karakter pattern yang tidak cocok dengan karakter text.
lo = nilai pengembalian indeks huruf text yang tidak cocok dengan karate pattern.

Nilai lo=last(a), pada indeks pattern h bernilai 5 maka last[h] = 1 jadi di gunakan rumus
I = 6 + 7 –min(6,1) = 6 +7 – 1 = 12 (menuju karakter kesebelas atau indeks kesepuluh)

T
s
a
y
a

m
a
u

p
e
r
g
i

s
e
K
o
l
a
h
P
s
e
k
o
l
a
h
















0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

Proses 2:
 Proses selanjutnya mengecek huruf terakhir dari pattern ternyata tidak cocok jadi akan berpindah lagi menggunakan rumus ke i = 11 + 7 – min(6,-1) = 18 + 1 = 19 (menuju karakter kesembilan belas atau indeks kedelapan belas)

T
s
a
y
a

m
a
u

p
e
r
g
i

s
e
K
o
l
a
h
P





s
e
k
o
l
a
h











0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

Proses 3:
Sama dengan proses sebelumnya di cek kembali apakah huruh terakhir dari pattern karena tidak cocok, kembali gunakan rumus ke i = 18 + 7 – min(6,3) = 25 -  3 = 22 (menuju karakter ke duapuluh dua atau indeks keduapuluh satu )

T
s
a
y
a

m
a
u

p
e
r
g
i

s
e
K
o
l
a
h
P












s
e
k
o
l
a
h




0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

Proses 4:
Kembali di cek apakah huruf akhir dari pattern sama dengan text, ternyata tidak sama kembali maka kembali kita gunakan rumus ke i = 19 + 7 – min(6,last[h]=4) = 26 - 4 = 22 (menuju karakter ke duapuluh dua atau indeks ke duapuluh satu)

Proses 5 :
Telah di temukan nya tulisan ya di cari = “sekolah”
T
s
a
y
a

m
a
u

p
e
R
g
i

s
e
K
o
l
a
h
P















s
e
K
o
l
a
h

0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21


Sumber:

https://id.wikipedia.org/wiki/Algoritma_pencarian_string
E-Book [Anany Levitin]-Intro_2_Design&Analysis_Algorithms