Anda di halaman 1dari 8

5/20/2016

Overview
1. Definisi String Matching?
2. Algoritma Brute Force
3. Algoritma Boyer-Moore
4. Algoritma Knuth-Morris-Pratt

IN053 – Strategi Diadaptasi dari Pattern Matching


Dr. Andrew Davison, WiG Lab (teachers room), CoE,
Algoritmik ad@fivedots.coe.psu.ac.th

11 – String Matching
STRAGO/IN053/FTI/UKM/MA/2015

String Matching? Konsep String


• Definisi : • S : string dengan panjang m.
• diberikan string teks T dan string pola P, temukan • substring S[i .. j] : substring di antara index i dan j.
pola P dalam teks T
• T: “the rain in spain stays mainly on the plain” • prefix dari S : substring S[0 .. i]
• P: “main”
• suffix dari S : substring S[i .. m-1]
• i: index di antara 0 dan m-1
• Aplikasi :
• text editors, Web search engines (e.g. Google), image
analysis

STRAGO/IN053/FTI/UKM/MA/2015 STRAGO/IN053/FTI/UKM/MA/2015

S
Contoh a n d r ew Algoritma Brute Force
0 1 2 3 4 5
• Substring S[1..3] == "ndr“ • Periksa setiap posisi dalam text T untuk
memastikan pola P dimulai pada posisi tersebut
• prefix dari S:
• "andrew", "andre", "andr", "and", "an”, "a"

T: a n d r e w T: a n d r e w
• Suffix dari S:
• "andrew", "ndrew", "drew", "rew", "ew", "w"
P: r e w P: r e w
P maju 1 char untuk diperiksa thd T

....
STRAGO/IN053/FTI/UKM/MA/2015 STRAGO/IN053/FTI/UKM/MA/2015

1
5/20/2016

CONTOH-1 CONTOH-2
• Pattern: NOT • Pattern: 001011

• Teks: NOBODY NOTICED HIM • Teks: 10010101001011110101010001


• Proses Pencocokan :
• Proses Pencocokan : 10010101001011110101010001
NOBODY NOTICED HIM 1 001011
1NOT 2 001011
2 NOT 3 001011
3 NOT 4 001011
4 NOT 5 001011
5 NOT 6 001011
6 NOT 7 001011
7 NOT 8 001011
9 001011
8 NOT

7 8

STRATEGIALGO/S1IF/FIT/UKM/MA/2014 STRATEGIALGO/S1IF/FIT/UKM/MA/2014

Return index where


Brute Force in Java pattern starts, or -1 Pemakaian
public static void main(String args[])
public static int brute(String text,String pattern) { if (args.length != 2) {
{ int n = text.length(); // n is length of text System.out.println("Usage: java BruteSearch
int m = pattern.length(); // m is length of pattern <text> <pattern>");
int j; System.exit(0);
for(int i=0; i <= (n-m); i++) { }
j = 0; System.out.println("Text: " + args[0]);
while ((j < m) && System.out.println("Pattern: " + args[1]);
(text.charAt(i+j) == pattern.charAt(j))
j++; int posn = brute(args[0], args[1]);
if (j == m) if (posn == -1)
return i; // match at i System.out.println("Pattern not found");
} else
return -1; // no match System.out.println("Pattern starts at posn "
} // end of brute() + posn);
}

STRAGO/IN053/FTI/UKM/MA/2015 STRAGO/IN053/FTI/UKM/MA/2015

Analisis Analisis
• Brute force string matching mempunyai O(mn) • Algoritma brute force berjalan cepat bila
untuk kasus terburuk alphabet dari text berukuran besar
• Mis. A..Z, a..z, 1..9, dll
• Pada umumnya search dalam ordinary text
mempunyai O(m+n) -> sangat cepat.
• Algoritma brute force melambat bila
alphabet berukuran kecil
• Mis. 0, 1 (dalam binary files, image files, dll.)

STRAGO/IN053/FTI/UKM/MA/2015
continued STRAGO/IN053/FTI/UKM/MA/2015
continued

2
5/20/2016

3. The Boyer-Moore Algorithm


• Contoh worst case: • Didasarkan pada 2 teknik :
• T: "aaaaaaaaaaaaaaaaaaaaaaaaaah"
1. The looking-glass technique
• P: "aaah"
• Cari P dalam T dengan bergerak mundur dalam
P, mulai dari karakter terakhir dalam P
• Contoh average case:
2. The character-jump technique
• T: "a string searching example is standard"
• Bila ada ketidakcocokan pada T[i] == x
• P: "store"
• Karakter P[j] tidak sama dengan T[i]
• Terdapat 3 kasus

STRAGO/IN053/FTI/UKM/MA/2015 STRAGO/IN053/FTI/UKM/MA/2015

Kasus 2
Kasus 1
• Jika P mengandung x , maka geser P ke kanan • Jika P mengandung x, tapi langkah pada kasus 1
untuk menempatkan kemunculan x dalam P tidak mungkin, maka geser P ke kanan 1 karakter
dengan T[i]. pada T[i+1].

T x a T x a ? ? T x a x T x a x ?
i inew i inew
geser i & j ke kanan, geser i & j ke kanan,
j pada ujung P j pada ujung P
P x c ba P x c ba P cw ax P cw ax
j jnew j X setelah posisi j
jnew
STRAGO/IN053/FTI/UKM/MA/2015 STRAGO/IN053/FTI/UKM/MA/2015

Contoh Boyer-Moore
Kasus 3
• Jika bukan kasus 1 dan 2 (x tidak ada dalam P),
maka geser P untuk menempatkan P[0] dengan
T[i+1]. T:
a p a t t e r n m a t c h i n g a l g o r i t h m

1 3 5 11 10 9 8 7
r i t h m r i t h m r i t h m r i t h m
T x a T x a ? ?? 2 4 6
i inew P: r i t h m r i t h m r i t h m

geser i & j ke kanan, 1. Kasus-1 4. Kasus-3


j pada ujung P 5. Kasus-3
P d c ba P d c ba 2.
3.
Kasus-3
Kasus-3 6. Kasus-1

j 0 jnew
No x in P
STRAGO/IN053/FTI/UKM/MA/2015 STRAGO/IN053/FTI/UKM/MA/2015

3
5/20/2016

Fungsi Last Occurrence Contoh L() P a b a c a b


• Algoritma Boyer-Moore melakukan • A = {a, b, c, d} 0 1 2 3 4 5
preprocessing terhadap P dan alfabet A
untuk membangun fungsi last occurrence L() • P: "abacab"
• L() memetakan semua huruf dalam A menjadi
integer
x a b c d
• L(x) didefinisikan sbg:
• index terbesar i sehingga P[i] == x, atau L(x) 4 5 3 -1
• -1 jika x tidak muncul dalam P
• x : huruf dalam alfabet A

STRAGO/IN053/FTI/UKM/MA/2015 STRAGO/IN053/FTI/UKM/MA/2015

Contoh Boyer-Moore Return index where


Boyer-Moore in Java pattern starts, or -1
T: a b a c a a b a d c a b a c a b a a b b
1
public static int bmMatch(String text,
P: a b a c a b
{
String pattern)
4 3 2 13 12 11 10 9 8
int last[] = buildLast(pattern);
a b a c a b a b a c a b int n = text.length();
5 7 int m = pattern.length();
int i = m-1;
a b a c a b a b a c a b
6 if (i > n-1)
return -1; // no match if pattern is
a b a c a b
// longer than text
1. Kasus-1 4. Kasus-3 :
x a b c d
2. Kasus-1 5. Kasus-1 L(x) 4 5 3 -1
3. Kasus-1

STRAGO/IN053/FTI/UKM/MA/2015 STRAGO/IN053/FTI/UKM/MA/2015

int j = m-1;
do {
if (pattern.charAt(j) == text.charAt(i))
if (j == 0)
Fungsi Last Occurence
return i; // match public static int[] buildLast(String pattern)
else { // looking-glass technique /* Return array storing index of last
i--;
j--; occurrence of each ASCII char in pattern. */
} {
else { // character jump technique int last[] = new int[128]; // ASCII char set
int lo = last[text.charAt(i)]; //last occ
i = i + m - Math.min(j, 1+lo); for(int i=0; i < 128; i++)
j = m – 1 ;
} last[i] = -1; // initialize array
} while (i <= n-1);
for (int i = 0; i < pattern.length(); i++)
return -1; // no match last[pattern.charAt(i)] = i;
} // end of bmMatch()
return last;
} // end of buildLast()

STRAGO/IN053/FTI/UKM/MA/2015 STRAGO/IN053/FTI/UKM/MA/2015

4
5/20/2016

Usage Analisis
public static void main(String args[]) • Boyer-Moore worst case running time : O(nm + A)
{ if (args.length != 2) {
System.out.println("Usage: java BmSearch
<text> <pattern>"); • Boyer-Moore :
System.exit(0);
} • berjalan dengan cepat jika alfabet (A) berukuran besar,
System.out.println("Text: " + args[0]); • Berjalan lambat jika alfabet (A) berukuran kecil,
System.out.println("Pattern: " + args[1]);
• Mis. Baik untuk English text, kurang baik untuk binary
int posn = bmMatch(args[0], args[1]);
if (posn == -1)
System.out.println("Pattern not found"); • Boyer-Moore lebih cepat dari brute force untuk
else searching English text.
System.out.println("Pattern starts at posn "
+ posn);
}

STRAGO/IN053/FTI/UKM/MA/2015 STRAGO/IN053/FTI/UKM/MA/2015

Contoh Worst Case Algoritma KMP


• T: "aaaaa…a" T: a a a a a a a a a • Algoritma Knuth-Morris-Pratt (KMP) mencari
6 5 4 3 2 1 pola dalam teks secara left-to-right order
• P: "baaaaa"
P: b a a a a a • KMP menggeser pola lebih inteligen
12 11 10 9 8 7 dibandingkan brute force algorithm.
b a a a a a
18 17 16 15 14 13
b a a a a a
24 23 22 21 20 19
b a a a a a
STRAGO/IN053/FTI/UKM/MA/2015 STRAGO/IN053/FTI/UKM/MA/2015
continued

Algoritma KMP Contoh i

• Jika ada ketidakcocokan antara text dan pola T:


P pada posisi P[j], bagaimana pergeseran
pola utk menghindari pencocokan yang tidak P: j=5
diperlukan.
• Jawab: jnew = 2
• the largest prefix of P[0 .. j-1] that is a suffix of
P[1 .. j-1]

STRAGO/IN053/FTI/UKM/MA/2015 STRAGO/IN053/FTI/UKM/MA/2015

5
5/20/2016

Mengapa ? j == 5
Fungsi KMP Failure
• Temukan largest prefix (start) of: • KMP preprocesing pola untuk mencocokkan
"a b a a b" ( P[0..j-1] ) prefix dari pola dengan polanya sendiri.
• j = posisi mismatch dalam P[]
yang merupakan suffix (end) of:
"b a a b" ( p[1 .. j-1] ) • k = posisi sebelum mismatch (k = j-1).
• failure function F(k) didefinisikan sbg
• Ukuran dari largest prefix of P[0..k] yang merupakan
• Jawaban : "a b" suffix of P[1..k].
• Set j = 2 // the new j value

STRAGO/IN053/FTI/UKM/MA/2015 STRAGO/IN053/FTI/UKM/MA/2015

Contoh Failure Function Why is F(4) == 2? P: "abaaba"


(k == j-1)
• P: "abaaba" • F(4) berarti
j k 0 1 2 3 4
• find the size of the largest prefix of P[0..4]
j: 0 1 2 3 4 5 F(j)
F(k) 0 0 1 1 2 that is also a suffix of P[1..4]
= find the size largest prefix of "abaab" that
F(k) : ukuran dari is also a suffix of "baab"
the largest prefix. = find the size of "ab"
=2

STRAGO/IN053/FTI/UKM/MA/2015 STRAGO/IN053/FTI/UKM/MA/2015

Return index where


Pemakaian Failure Function KMP in Java pattern starts, or -1

public static int kmpMatch(String text,


• Modifikasi algoritma Knuth-Morris-Pratt’s : String pattern)
• if a mismatch occurs at P[j] (P[j] != T[i]), {
int n = text.length();
• then int m = pattern.length();
k = j-1;
j = F(k); // obtain the new j int fail[] = computeFail(pattern);

int i=0;
int j=0;
:

STRAGO/IN053/FTI/UKM/MA/2015 STRAGO/IN053/FTI/UKM/MA/2015

6
5/20/2016

Failure Function
while (i < n) {
if (pattern.charAt(j) == text.charAt(i)) { public static int[] computeFail(
if (j == m - 1) String pattern)
return i - m + 1; // match
i++; {
j++; int fail[] = new int[pattern.length()];
} fail[0] = 0;
else if (j > 0)
j = fail[j-1]; int m = pattern.length();
else int j = 0;
i++; int i = 1;
} :
return -1; // no match
} // end of kmpMatch()

STRAGO/IN053/FTI/UKM/MA/2015 STRAGO/IN053/FTI/UKM/MA/2015

while (i < m) {
Pemakaian
if (pattern.charAt(j) == public static void main(String args[])
pattern.charAt(i)) { //j+1 chars match { if (args.length != 2) {
fail[i] = j + 1; System.out.println("Usage: java KmpSearch
i++; <text> <pattern>");
j++; System.exit(0);
} }
else if (j > 0) // j follows matching prefix System.out.println("Text: " + args[0]);
j = fail[j-1]; System.out.println("Pattern: " + args[1]);
else { // no match
fail[i] = 0; int posn = kmpMatch(args[0], args[1]);
i++; if (posn == -1)
} System.out.println("Pattern not found");
} else
return fail; System.out.println("Pattern starts at posn "
} // end of computeFail() + posn);
}

STRAGO/IN053/FTI/UKM/MA/2015 STRAGO/IN053/FTI/UKM/MA/2015

Contoh KMP Why is F(4) == 1? P: "abacab"


T: a b a c a a b a c c a b a c a b a a b b • F(4) means
1 2 3 4 5 6 • find the size of the largest prefix of P[0..4] that is
P: a b a c a b also a suffix of P[1..4]
7 = find the size largest prefix of "abaca" that
a b a c a b is also a suffix of "baca"
8 9 10 11 12 = find the size of "a"
a b a c a b
=1
13
a b a c a b
k 0 1 2 3 4 14 15 16 17 18 19
F(k) 0 0 1 0 1 a b a c a b

STRAGO/IN053/FTI/UKM/MA/2015 STRAGO/IN053/FTI/UKM/MA/2015

7
5/20/2016

Keuntungan KMP Kerugian KMP


• KMP mempunyai waktu optimal : O(m+n) • KMP bekerja kurang baik jika ukuran alfabet
• Sangat cepat meningkat
• Ketidakcocokan akan meningkat
• Algoritma tidak perlu mundur dalam
• mismatch cenderung terjadi di awal pola,
memeriksa teks input T sedangkan KMP berjalan cepat jika mismatch
• Algoritma KMP baik untuk pemrosesan files yg terjadi di akhir pola
sangat besar yg berasal dari external devices
atau dikirim melalui network

STRAGO/IN053/FTI/UKM/MA/2015 STRAGO/IN053/FTI/UKM/MA/2015

LATIHAN 5. More Information


• Algorithms in C++ This book is
• Diberikan P dan T sbb : Robert Sedgewick in the CoE library.
• P = bacbaaa Addison-Wesley, 1992
• T = bacbacabcbacbaaacb • chapter 19, String Searching

• Tunjukkan aplikasi algoritma KMP dan


algoritma BM untuk P dan T di atas. • Online Animated Algorithms:
• http://www.ics.uci.edu/~goodrich/dsa/
11strings/demos/pattern/
• http://www-sr.informatik.uni-tuebingen.de/
~buehler/BM/BM1.html
• http://www-igm.univ-mlv.fr/~lecroq/string/

45

STRATEGIALGO/S1IF/FIT/UKM/MA/2014 STRAGO/IN053/FTI/UKM/MA/2015

Referensi
• Materi kuliah IF 2251 Strategi Algoritmik :
• http://kur2003.if.itb.ac.id/
• Mata kuliah IF 2251 Strategi Algoritmik (sem.4)
• Anany Levitin, Introduction to The Design and
Analysis of Algorithms, Pearson, 2012.
• S.Dasgupta, et al. Algorithms, 2006.
• Cormen, et al. Algorithms, MGH,2009.
• Pattern Matching dari
fivedots.coe.psu.ac.th/Software.coe/LAB/PatMat
ch/ oleh Andrew Davison

STRAGO/IN053/FTI/UKM/MA/2015

Anda mungkin juga menyukai