Strago StringMatching 11rev
Strago StringMatching 11rev
Overview
1. Definisi String Matching?
2. Algoritma Brute Force
3. Algoritma Boyer-Moore
4. Algoritma Knuth-Morris-Pratt
11 – String Matching
STRAGO/IN053/FTI/UKM/MA/2015
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
7 8
STRATEGIALGO/S1IF/FIT/UKM/MA/2014 STRATEGIALGO/S1IF/FIT/UKM/MA/2014
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
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
j 0 jnew
No x in P
STRAGO/IN053/FTI/UKM/MA/2015 STRAGO/IN053/FTI/UKM/MA/2015
3
5/20/2016
STRAGO/IN053/FTI/UKM/MA/2015 STRAGO/IN053/FTI/UKM/MA/2015
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
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
STRAGO/IN053/FTI/UKM/MA/2015 STRAGO/IN053/FTI/UKM/MA/2015
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
STRAGO/IN053/FTI/UKM/MA/2015 STRAGO/IN053/FTI/UKM/MA/2015
7
5/20/2016
STRAGO/IN053/FTI/UKM/MA/2015 STRAGO/IN053/FTI/UKM/MA/2015
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