Algoritma Knuth-Morris-Pratt: Perbedaan antara revisi
Konten dihapus Konten ditambahkan
←Membuat halaman berisi 'Algoritma Knuth-Morris-Pratt, dikembangkan secara terpisah oleh Donald E. Knuth pada tahun dan James H. Morris bersama Vaughan R. Pratt pada tahun 1966, namun keduanya me...' |
k →Cara kerja: pembersihan kosmetika dasar |
||
(44 revisi perantara oleh 17 pengguna tidak ditampilkan) | |||
Baris 1:
Jika kita melihat
== Cara kerja ==
Perhitungan penggeseran pada
Dengan kata lain, pencocokkan string akan berjalan secara efisien bila kita mempunyai tabel yang menentukan berapa panjang kita seharusnya menggeser seandainya terdeteksi ketidakcocokkan di karakter ke-<math>j</math> dari pattern. Tabel itu harus memuat <math>next[j]</math> yang merupakan posisi karakter <math>pattern[j]</math> setelah digeser, sehingga kita bisa menggeser pattern sebesar <math>j-next[j]</math> relatif terhadap teks.<ref>{{en}} Knuth, Donald E. Morris, James H. Pratt, Vaughan R. 1977. Fast Pattern Matching in Strings, SIAM Journal of Computing Vol 6 No.2.</ref>
Secara sistematis, langkah-langkah yang dilakukan
#
# Dari kiri ke kanan,
## Karakter di pattern dan di teks yang dibandingkan tidak cocok (mismatch).
## Semua karakter di pattern cocok. Kemudian
#
== Pseudocode ==
Berikut adalah pseudocode algoritme KMP pada fase pra-pencarian:
procedure preKMP(
input P: array[0..n-1] of char,
input n: integer,
input/output kmpNext: array[0..n] of integer
)
Deklarasi:
i,j: integer
Algoritme
i:= 0;
j:= kmpNext[0]:= -1;
while (i < n) {
while (j > -1 and not(P[i] = P[j]))
j:= kmpNext[j];
i:= i+1;
j:= j+1;
if (P[i] = P[j])
kmpNext[i]:= kmpNext[j];
else
kmpNext[i]:= j;
endif
endwhile
Dan berikut adalah pseudocode algoritme KMP pada fase pencarian:
procedure KMPSearch(
input m, n: integer,
input P: array[0..n-1] of char,
input T: array[0..m-1] of char,
output ketemu: array[0..m-1] of boolean
)
Deklarasi:
i, j,next: integer
kmpNext: array[0..n] of interger
Algoritme:
preKMP(n, P, kmpNext)
i:=0
while (i<= m-n) do
j:=0
while (j < n and T[i+j] = P[j]) do
j:=j+1
endwhile
if(j >= n) then
ketemu[i]:=true;
endif
next:= j - kmpNext[j]
i:= i+next
endwhile
== Kompleksitas ==
Algoritme ini menemukan semua kemunculan dari pattern dengan panjang n di dalam teks dengan panjang m dengan kompleksitas waktu O(m+n). Algoritme ini hanya membutuhkan O(n) ruang dari memory internal jika teks dibaca dari file eksternal. Semua besaran O tersebut tidak tergantung pada besarnya ruang alpabet
== Referensi ==
{{reflist}}
== Lihat pula ==
* [[Daftar algoritme]]
* [[Algoritme pencarian string]]
* [[Algoritme Boyer-Moore]]
== Pranala luar ==
* [http://www-igm.univ-mlv.fr/~lecroq/string/node8.html Halaman berisi penjelasan tentang algoritme Knuth-Morris-Pratt dan juga sebuah applet yang menganimasikan cara kerjanya]
{{DEFAULTSORT:Knuth-Morris-Pratt}}
[[Kategori:Algoritme pencarian]]
[[Kategori:Algoritme string]]
|