Algoritma Knuth-Morris-Pratt: Perbedaan antara revisi

Konten dihapus Konten ditambahkan
Gozali (bicara | kontrib)
←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:
Algoritma'''Algoritme Knuth-Morris-Pratt''' adalah salah satu [[algoritme pencarian string]], dikembangkan secara terpisah oleh [[Donald Knuth|Donald E. Knuth]] pada tahun 1967 dan [[James Morris|James H. Morris]] bersama [[Vaughan Pratt|Vaughan R. Pratt]] pada tahun 1966, namuntetapi keduanya mempublikasikannya secara bersamaan pada tahun 1977.
 
Jika kita melihat algoritma[[Algoritme pencarian string#Algoritme brute force dalam pencarian string|algoritme brute force]] lebih mendalam, kita mengetahui bahwa dengan mengingat beberapa perbandingan yang dilakukan sebelumnyassebelumnya kita dapat meningkatkan besar pergeseran yang dilakukan. Hal ini akan menghemat perbandingan, yang selanjutnya akan meningkatkan kecepatan pencarian.<ref>{{en}}Lecroq, Thierry Charras, Christian. 2001. Handbook of Exact String Matching Algorithm. ISBN 0-9543006-4-5</ref>
 
== Cara kerja ==
Perhitungan penggeseran pada algoritmaalgoritme ini adalah sebagai berikut, bila terjadi ketidakcocokkan pada saat pattern sejajar dengan <math>teks[i..i+n-1]</math>, kita bisa menganggap ketidakcocokan pertama terjadi diantaradi antara <math>teks[i+j]</math> dan <math>pattern[j]</math>, dengan <math>0 < j < n</math>. Berarti, <math>teks[i..i+j-1] = pattern[0..j-1]</math> dan <math>a=teks[i+j]≠b</math> tidak sama dengan <math>b=pattern[j]</math>. Ketika kita menggeser, sangat beralasan bila ada sebuah awalan <math>v</math> dari pattern akan sama dengan sebagian akhiran <math>u</math> dari sebagian teks. Sehingga kita bisa menggeser pattern agar awalan <math>v</math> tersebut sejajar dengan akhiran dari <math>u</math>.
 
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 algoritmaalgoritme Knuth-Morris-Pratt pada saat mencocokkan string:
# AlgoritmaAlgoritme Knuth-Morris-Pratt mulai mencocokkan pattern pada awal teks.
# Dari kiri ke kanan, algoritmaalgoritme ini akan mencocokkan karakter per karakter pattern dengan karakter di teks yang bersesuaian, sampai salah satu kondisi berikut dipenuhi:
## Karakter di pattern dan di teks yang dibandingkan tidak cocok (mismatch).
## Semua karakter di pattern cocok. Kemudian algoritmaalgoritme akan memberitahukan penemuan di posisi ini.
# AlgoritmaAlgoritme kemudian menggeser pattern berdasarkan tabel next, lalu mengulangi langkah 2 sampai pattern berada di ujung teks.
 
== 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]]