Anda di halaman 1dari 12

Bahan Kuliah ke-15

IF2251 Strategi Algoritmik

Algoritma Pencarian String


(String Matching)

Disusun oleh:
Ir. Rinaldi Munir, M.T.

Departemen Teknik Informatika


Institut Teknologi Bandung
2004

Rinaldi Munir/IF2251 Strategi Algoritmik/Bahan Kuliah ke-15

Pencarian string di dalam teks disebut juga


pencocokan string (string matching atau pattern
matching).
Persoalan
berikut:

pencarian

string

dirumuskan

sebagai

Diberikan:
1. teks (text), yaitu (long) string yang panjangnya n
karakter
2. pattern, yaitu string dengan panjang m karakter (m
< n) yang akan dicari di dalam teks.
Carilah (find atau locate) lokasi pertama di dalam teks
yang bersesuaian dengan pattern. Aplikasi dari
masalah pencocokan string antara lain pencarian suatu
kata di dalam dokumen (misalnya menu Find di dalam
Microsoft Word).
Contoh 10.1:
Pattern: hari
Teks:
kamipulangharikamis
target
Contoh 10.2:
Pattern: not
Teks:
nobodynoticedhim
target

Rinaldi Munir/IF2251 Strategi Algoritmik/Bahan Kuliah ke-15

Contoh 10.3:
Pattern: apa
Teks:
SiapayangmenjemputPapa
darikotaBalikpapan?
10.1 Algoritma Brute Force
Dengan sumsi bahwa teks berada di dalam array T[1..n]
dan pattern berada di dalam array P[1..m], maka algoritma
brute force pencocokan string adalah sebagai berikut:
1. Mula-mula pattern P dicocokkan pada awal teks T.
2. Dengan bergerak dari kiri ke kanan, bandingkan setiap
setiap karakter di dalam pattern P dengan karakter
yang bersesuaian di dalam teks T sampai:
a. semua karakter yang dibandingkan cocok atau
sama (pencarian berhasil), atau
b. dijumpai sebuah ketidakcocokan karakter
(pencarian belum berhasil)
3. Bila pattern P belum ditemukan kecocokannya dan
teks T belum habis, geser pattern P satu karakter ke
kanan dan ulangi langkah 2.

Rinaldi Munir/IF2251 Strategi Algoritmik/Bahan Kuliah ke-15

Contoh 10.3:
Teks: nobodynoticedhim
Pattern: not
nobodynoticedhim
s=0not
s=1not
s=2not
s=3not
s=4not
s=5not
s=6not
s=7not
Contoh 10.4:
Teks: 10010101001011110101010001
Pattern: 001011
10010101001011110101010001
s=0001011
s=1001011
s=2001011
s=3001011
s=4001011
s=5001011
s=6001011
s=7001011
s=8001011

Rinaldi Munir/IF2251 Strategi Algoritmik/Bahan Kuliah ke-15

Pseudo-code algoritmanya:
procedure BruteForceSearch(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. 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 direpresentasika sebagai string (array of character)
Keluaran: posisi awal kecocokan (idx). Jika P tidak ditemukan, idx =
-1.
}
Deklarasi
s, j : integer
ketemu : boolean
Algoritma:
s0
ketemufalse
while (s n-m) and (not ketemu) do
j1
while (j m) and (P[j] = T[s+j]) do
jj+1
endwhile
{ j > m or P[j] T[s+j] }
if j = m then
{ kecocokan string ditemukan }
ketemutrue
else
ss+1
{ geser pattern satu karakter ke kanan teks }
endif
endfor
{ s > n m or ketemu }
if ketemu then
idxs+1 { catatan: jika indeks array dimulai dari 0, idx s }
else
idx-1
endif

Rinaldi Munir/IF2251 Strategi Algoritmik/Bahan Kuliah ke-15

Kompleksitas algoritma brute-force:


Kompleksitas kasus terbaik adalah O(n).
Kasus terbaik terjadi jika yaitu bila karakter pertama
pattern P tidak pernah sama dengan karakter teks T yang
dicocokkan
Pada kasus ini, jumlah perbandingan yang dilakukan paling
banyak n kali misalnya:
Teks: Iniadalahstringpanjangyang
berakhirdenganzz
Pattern: zz
Kasus terburuk membutuhkan m(n m + 1) perbandingan,
yang mana kompleksitasnya adalah O(mn), misalnya:
Teks:
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaab
Pattern: aaaab

Rinaldi Munir/IF2251 Strategi Algoritmik/Bahan Kuliah ke-15

10.2 Algoritma Knuth-Morris-Pratt (KMP)


Pada algoritma brute force, setiap kali ditemukan
ketidakcocokan pattern dengan teks, maka pattern digeser
satu karakter ke kanan.
Sedangkan pada algoritma KMP, kita memelihara informasi
yang digunakan untuk melakukan jumlah pergeseran.
Algoritma menggunakan informasi tersebut untuk membuat
pergeseran yang lebih jauh, tidak hanya satu karakter
seperti pada algoritma brute force.
Dengan algoritma KMP ini, waktu pencarian dapat
dikurangi secara signifikan. Algoritma KMP dikembangkan
oleh D. E. Knuth, bersama-sama dengan J. H. Morris dan
V. R. Pratt.
1 2 3 4 5 6 7 8 9

Teks: bimbinganbelajarataubimbel
Pattern: bimbel

j=5
1 2 3 4 5 6 7 8 9

Teks: bimbinganbelajarataubimbel
Pattern:
bimbel

j=2

Rinaldi Munir/IF2251 Strategi Algoritmik/Bahan Kuliah ke-15

Definisi:
Misalkan A adalah alfabet dan x = x1x2xk , k N,
adalah string yang panjangnya k yang dibentuk dari
karakter-karakter di dalam alfabet A.
Awalan (prefix) dari x adalah upa-string (substring) u
dengan
u = x1x2xk 1 , k {1, 2, , k 1}
dengan kata lain, x diawali dengan u.
Akhiran (suffix) dari x adalah upa-string (substring)
u dengan
u = xk b xk b + 1 xk , k {1, 2, , k 1}
dengan kata lain, x diakhiri dengan v.
Pinggiran (border) dari x adalah upa-string r
sedemikian sehingga
r = x1x2xk 1 dan u = xk b xk b + 1 xk , k {1, 2,
, k 1}
dengan kata lain, pinggiran dari x adalah upa-string
yang keduanya awalan dan juga akhiran sebenarnya
dari x.

Rinaldi Munir/IF2251 Strategi Algoritmik/Bahan Kuliah ke-15

Contoh 10.5. Misalkan x = abacab. Awalan sebenarnya


dari x adalah
, a, ab, aba, abac, abaca
(ket: = string kosong)
Akhiran sebenarnya dari x adalah
, b, ab, cab, acab, bacab
Pinggiran dari x adalah
, ab
Pinggiran mempunyai panjang 0, pinggiran
ab mempunyai panjang 2.
Fungsi Pinggiran (Border Function)
Fungsi pinggiran b(j) didefinisikan sebagai ukuran awalan
terpanjang dari P yang merupakan akhiran dari P[1..j].
Sebagai contoh, tinjau pattern P = ababaa. Nilai F untuk
setiap karakter di dalam P adalah sebagai berikut:
j
P[j]
b(j)

1 2 3 4 5 6
a b a b a a
0 0 1 2 3 1

Rinaldi Munir/IF2251 Strategi Algoritmik/Bahan Kuliah ke-15

Algoritma menghitung fungsi pinggiran adalah sb:


procedureHitungPinggiran(inputm:integer,P:array[1..m]ofchar,
outputb:array[1..m]ofinteger)
{Menghitungnilaib[1..m]untukpatternP[1..m]}
Deklarasi
k,q:integer
Algoritma:
b[1]0
q2
k0
forq2tomdo
while((k>0)and(P[q]P[k+1]))do
kb[k]
endwhile
ifP[q]=P[k+1]then
kk+1
endif
b[q]=k
endfor

Contoh:
Teks: abcabcabd
Pattern: abcabd
Mula-mula kita hitung fungsi pinggiran untuk pattern
tersebut:
j
1 2 3 4 5 6
P[j] a b c a b d
b(j) 0 0 0 1 2 0
Teks: abcabcabd
Pattern:
abcabd

j=3
Rinaldi Munir/IF2251 Strategi Algoritmik/Bahan Kuliah ke-15

Algoritma KMP selengkapnya adalah:


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 KnuthMorris-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 direpresentasika 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,outputb:array[1..m]ofinteger)
{Menghitungnilaib[1..m]untukpatternP[1..m]}
Algoritma:
HitungPinggiran(m,P,b)
j0
i1
ketemufalse
while(inandnotketemu)do

while((j>0)and(P[j+1]T[i]))do
jb[j]
endwhile

ifP[j+1]=T[i]then
jj+1
endif
ifj=mthen
ketemutrue
else
ii+1
endif
endwhile
ifketemuthen
idxim+1 { catatan: jika indeks array dimulai dari 0, maka
idxim}
else
idx1
endif

Rinaldi Munir/IF2251 Strategi Algoritmik/Bahan Kuliah ke-15

10

Kompleksitas Waktu Algoritma KMP


Untuk menghitung fungsi pinggiran dibutuhkan waktu
O(m), sedangkan pencarian string membutuhkan waktu
O(n), sehingga kompleksitas waktu algoritma KMP adalah
O(m+n).

Rinaldi Munir/IF2251 Strategi Algoritmik/Bahan Kuliah ke-15

11