Anda di halaman 1dari 13

Bahan Kuliah ke-15 IF2251 Strategi Algoritmik

Algoritma Pencarian String (String Matching)

Disusun oleh: Ir. Rinaldi unir!

.".

De#artemen "eknik In$ormatika Institut "eknologi %andung 2&&'

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. Carila (find atau locate) lokasi pertama di dalam teks yang bersesuaian dengan pattern. !plikasi dari masala pencocokan string antara lain pencarian suatu kata di dalam dokumen (misalnya menu Find di dalam Microsoft Word). (ontoh 1&.1: Pattern: hari "eks: kami pulang hari kamis target (ontoh 1&.2: Pattern: not "eks: nobody noticed him target
Rinaldi Munir/ F!!51 "trategi #lgoritmik/Bahan Kuliah ke-15 2

(ontoh 1&.): Pattern: apa "eks: Siapa yang menjemput Papa dari kota Balikpapan? 1&.1 Algoritma Brute Force Dengan sumsi ba #a teks berada di dalam arra$ %$1..n% dan pattern berada di dalam arra$ P$1..m%, maka algoritma &rute force pencocokan string adala sebagai berikut: 1. &ula'mula pattern P dicocokkan pada a#al teks %. 2. Dengan bergerak dari kiri ke kanan, bandingkan setiap setiap karakter di dalam pattern P dengan karakter yang bersesuaian di dalam teks " sampai: a. semua karakter yang dibandingkan cocok atau sama (pencarian ber asil), atau b. dijumpai sebua ketidakcocokan karakter (pencarian belum ber asil) (. )ila pattern P belum ditemukan kecocokannya dan teks % belum abis, geser pattern P satu karakter ke kanan dan ulangi langka 2.

Rinaldi Munir/ F!!51 "trategi #lgoritmik/Bahan Kuliah ke-15

(ontoh 1&.): "eks: nobody noticed him Pattern: not nobody noticed him not not not not not not not not

s=0 s=1 s=2 s=3 s=4 s=5 s=6 s=7

(ontoh 1&.': "eks: 10010101001011110101010001 Pattern: 001011 10010101001011110101010001 001011 001011 001011 001011 001011 001011 001011 001011 001011

s=0 s=1 s=2 s=3 s=4 s=5 s=6 s=7 s=8

Rinaldi Munir/ F!!51 "trategi #lgoritmik/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 o! character" #eluaran: posisi awal kecocokan idx". Jika P tidak ditemukan, idx $ %&. ' Deklarasi , ! : integer "etemu : #oo$ean Algoritma: % "etemufa$ e &hi$e ( n'm) and (not "etemu) do !1 &hi$e (! m) and (P[!] ( T[ )!]) do !!)1 end&hi$e { j ( m or P)j* T)s+j* ' if ! ( m then { kecocokan string ditemukan ' "etemutrue e$ e )1 { geser pattern satu karakter ke kanan teks ' endif endfor { s ( n , m or ketemu ' if "etemu then idx )1 { catatan: jika indeks array dimulai dari -, idx s ' e$ e idx'1 endif

*om#leksitas algoritma brute-force:


Rinaldi Munir/ F!!51 "trategi #lgoritmik/Bahan Kuliah ke-15 +

,ompleksitas kasus terbaik adala '(n). ,asus terbaik terjadi jika yaitu bila karakter pertama pattern P tidak perna sama dengan karakter teks % yang dicocokkan Pada kasus ini, jumla perbandingan yang dilakukan paling banyak n kali misalnya: "eks: Ini adalah string panjang yang berakhir dengan zz Pattern: zz ,asus terburuk membutu kan m(n - m . 1) perbandingan, yang mana kompleksitasnya adala '(mn), misalnya: "eks: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaab Pattern: aaaab

1&.2 Algoritma *nuth+ orris+Pratt (* P)

Rinaldi Munir/ F!!51 "trategi #lgoritmik/Bahan Kuliah ke-15

Pada algoritma &rute force, setiap kali ditemukan ketidakcocokan pattern dengan teks, maka pattern digeser satu karakter ke kanan. 0edangkan pada algoritma ,&P, kita memeli ara in1ormasi yang digunakan untuk melakukan jumla pergeseran. !lgoritma menggunakan in1ormasi tesrebut untuk membuat pergeseran yang lebi jau , tidak anya satu karakter seperti pada algoritma &rute force. Dengan algoritma ,&P ini, #aktu pencarian dapat dikurangi secara signi1ikan. !lgoritma ,&P dikembangkan ole D. 2. ,nut , bersama'sama dengan 3. 4. &orris dan 5. 6. Pratt.
1 2 ( * + / 7 8 9:

"eks: bimbingan belajar atau bimbel Pattern: bimbel (;+


1 2 ( * + / 7 8 9:

"eks: bimbingan belajar atau bimbel Pattern: bimbel (;2

De$inisi:
Rinaldi Munir/ F!!51 "trategi #lgoritmik/Bahan Kuliah ke-15 7

&isalkan # adala al1abet dan x ; x1x2:xk , k ,, adala string yang panjangnya k yang dibentuk dari karakter'karakter di dalam al1abet #. !#alan (prefix) dari x adala upa'string (su&string) u dengan u ; x1x2:xk ) 1 , k <1, 2, :, k - 1= dengan kata lain, x dia#ali dengan u. !k iran (suffix) dari x adala upa'string (su&string) u dengan u ; xk - & xk - & . 1 :xk , k <1, 2, :, k - 1= dengan kata lain, x diak iri dengan *. Pinggiran (&order) dari x adala sedemikian se ingga upa'string r

r ; x1x2:xk ) 1 dan u ; xk - & xk - & . 1 :xk , k <1, 2, :, k - 1= dengan kata lain, pinggiran dari x adala upa'string yang keduanya a#alan dan juga ak iran sebenarnya dari x.

Rinaldi Munir/ F!!51 "trategi #lgoritmik/Bahan Kuliah ke-15

(ontoh 1&.5. &isalkan x ; abacab. !#alan sebenarnya dari x adala , a, ab, aba, abac, abaca (ket: ; string kosong) !k iran sebenarnya dari x adala , b, ab, cab, acab, bacab Pinggiran dari x adala , ab Pinggiran mempunyai panjang >, pinggiran ab mempunyai panjang 2. Fungsi Pinggiran (Border Function) ?ungsi pinggiran &(() dide1inisikan sebagai ukuran a#alan terpanjang dari P yang merupakan ak iran dari P$1..(%. 0ebagai conto , tinjau pattern P ; ababaa. @ilai F untuk setiap karakter di dalam P adala sebagai berikut: ( P $( % &(() 1 2 ( * + / a b a b a a > > 1 2 ( 1

!lgoritma meng itung 1ungsi pinggiran adala sb:


Rinaldi Munir/ F!!51 "trategi #lgoritmik/Bahan Kuliah ke-15 9

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] } Deklarasi k,q : integer Algoritma: b[1]0 q2 k0 for q2 to m do while ((k > 0) and (P[q] P[k+1])) do kb[k] endwhile if P[q]=P[k+1] then kk+1 endif b[q]=k endfor

Conto : "eks: abcabcabd


1>

Rinaldi Munir/ F!!51 "trategi #lgoritmik/Bahan Kuliah ke-15

Pattern: abcabd &ula'mula kita itung 1ungsi pinggiran untuk pattern tersebut: ( 1 2 ( * + / P $( % a b c a b d &(() > > > 1 2 > "eks: abcabcabd Pattern: abcabd (;(

!lgoritma ,&P selengkapnya adala :


procedure *+P earch(input m, n : integer, input P : array[1..m] of char,

Rinaldi Munir/ F!!51 "trategi #lgoritmik/Bahan Kuliah ke-15

11

input T : array[1..n] of char, output idx : integer) { Mencari kecocokan pattern P di dalam teks T dengan algoritma #nuth% 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 direpresentasika sebagai string array o! character" #eluaran: posisi awal kecocokan idx". Jika P tidak ditemukan, idx $ %&. ' Deklarasi i, ! : integer "etemu : #oo$ean # : 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: HitungPinggiran(m, P, b) j0 i1 ketemufalse while (i n and not ketemu) do while((j > 0) and (P[j+1]T[i])) do jb[j] endwhile if P[j+1]=T[i] then jj+1 endif if j = m then ketemutrue else ii+1 endif endwhile if ketemu then idxi-m+1 { catatan: jika indeks array dimulai dari 0, maka idxi-m } else idx-1 endif

*om#leksitas -aktu Algoritma * P

Rinaldi Munir/ F!!51 "trategi #lgoritmik/Bahan Kuliah ke-15

12

Antuk meng itung 1ungsi pinggiran dibutu kan #aktu '(m), sedangkan pencarian string membutu kan #aktu '(n), se ingga kompleksitas #aktu algoritma ,&P adala '(m.n).

Rinaldi Munir/ F!!51 "trategi #lgoritmik/Bahan Kuliah ke-15

1(

Anda mungkin juga menyukai