Algoritma Pencarian String (String Matching) —————————————— bahan ajar Ir. Rinaldi Munir, M.T.
- Pencarian string di dalam teks disebut juga pencocokan string (string matching atau pattern matching).
- Persoalan pencarian string dirumuskan sebagai berikut:
Diberikan:
- teks (text), yaitu (long) string yang panjangnya n karakter
- 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: kami pulang hari kamis
^ target
Contoh 10.2:
Pattern: not
Teks: nobody noticed him
^ target
Contoh 10.3:
Pattern: apa
Teks: Siapa yang menjemput Papa dari kota Balikpapan?
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:
- Mula-mula pattern P dicocokkan pada awal teks T.
- Dengan bergerak dari kiri ke kanan, bandingkan setiap setiap karakter di dalam pattern P dengan karakter yang bersesuaian di dalam teks T sampai:
- semua karakter yang dibandingkan cocok atau sama (pencarian berhasil), atau
- dijumpai sebuah ketidakcocokan karakter (pencarian belum berhasil)
- Bila pattern P belum ditemukan kecocokannya dan teks T belum habis, geser pattern P satu karakter ke kanan dan ulangi langkah 2.
Contoh 10.3:
Teks: nobody noticed him
Pattern: not
nobody noticed him
s=0 not
s=1 not
s=2 not
s=3 not
s=4 not
s=5 not
s=6 not
s=7 not
Contoh 10.4:
Teks: 10010101001011110101010001
Pattern: 001011
10010101001011110101010001
s=0 001011
s=1 001011
s=2 001011
s=3 001011
s=4 001011
s=5 001011
s=6 001011
s=7 001011
s=8 001011
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: s¬0 ketemu¬false while (s £ n-m) and (not ketemu) do j¬1 while (j £ m) and (P[j] = T[s+j]) do j¬j+1 endwhile { j > m or P[j] ¹ T[s+j] } if j = m then { kecocokan string ditemukan } ketemu¬true else s¬s+1 { geser pattern satu karakter ke kanan teks } endif
endfor { s > n – m or ketemu } if ketemu then idx¬s+1 { catatan: jika indeks array dimulai dari 0, idx ¬ s } else idx¬-1 endif |
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: Ini adalah string panjang yang berakhir dengan zz
Pattern: zz
Kasus terburuk membutuhkan m(n – m + 1) perbandingan, yang mana kompleksitasnya adalah O(mn), misalnya:
Teks: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaab
Pattern: aaaab
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: bimbingan belajar atau bimbel
Pattern: bimbel
^ j = 5
1 2 3 4 5 6 7 8 9…
Teks: bimbingan belajar atau bimbel
Pattern: bimbel
^ j = 2
Definisi:
Misalkan A adalah alfabet dan x = x1x2…xk , 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 = x1x2…xk – 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 = x1x2…xk – 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.
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 | 1 | 2 | 3 | 4 | 5 | 6 | |
P[j] | a | b | a | b | a | a | |
b(j) | 0 | 0 | 1 | 2 | 3 | 1 |
Algoritma menghitung fungsi pinggiran adalah sb:
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 q¬2 k¬0 for q¬2 to m do while ((k > 0) and (P[q] ¹ P[k+1])) do k¬b[k] endwhile if P[q]=P[k+1] then k¬k+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
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 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 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, output b : array[1..m] of integer) { Menghitung nilai b[1..m] untuk pattern P[1..m] } Algoritma: 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 |
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).
String Matching – Rinaldi Munir
Sumber : Bahan Ajar Rinaldi Munir
ribet cari fungsi pinggiran KMP 😀
😀
nama blognya keren,,,,like it
thx
kalo ngitung jumlah perbandingan di kmp gimana ya..?
masih bingung nih KMP penjelasannya kurang lengkap, step by step y jelasinnya
[…] Sumber : http://repository.widyatama.ac.id/xmlui/bitstream/handle/123456789/3466/Bab%202.pdf?sequence=7 https://retnonw.wordpress.com/2010/04/04/matching-string/ […]