Algoritma Knuth-Morris-Pratt: Perbedaan antara revisi
k bot kosmetik perubahan |
k →Cara kerja: pembersihan kosmetika dasar |
||
(14 revisi perantara oleh 11 pengguna tidak ditampilkan) | |||
Baris 1: | Baris 1: | ||
''' |
'''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, tetapi keduanya mempublikasikannya secara bersamaan pada tahun 1977. |
||
Jika kita melihat [[ |
Jika kita melihat [[Algoritme pencarian string#Algoritme brute force dalam pencarian string|algoritme brute force]] lebih mendalam, kita mengetahui bahwa dengan mengingat beberapa perbandingan yang dilakukan sebelumnya 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 == |
== Cara kerja == |
||
Perhitungan penggeseran pada |
Perhitungan penggeseran pada algoritme 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 di 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]</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. |
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 |
Secara sistematis, langkah-langkah yang dilakukan algoritme Knuth-Morris-Pratt pada saat mencocokkan string: |
||
# |
# Algoritme Knuth-Morris-Pratt mulai mencocokkan pattern pada awal teks. |
||
# Dari kiri ke kanan, |
# Dari kiri ke kanan, algoritme 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). |
## Karakter di pattern dan di teks yang dibandingkan tidak cocok (mismatch). |
||
## Semua karakter di pattern cocok. Kemudian |
## Semua karakter di pattern cocok. Kemudian algoritme akan memberitahukan penemuan di posisi ini. |
||
# |
# Algoritme kemudian menggeser pattern berdasarkan tabel next, lalu mengulangi langkah 2 sampai pattern berada di ujung teks. |
||
== Pseudocode == |
== Pseudocode == |
||
Berikut adalah pseudocode |
Berikut adalah pseudocode algoritme KMP pada fase pra-pencarian: |
||
procedure preKMP( |
procedure preKMP( |
||
input P |
input P: array[0..n-1] of char, |
||
input n |
input n: integer, |
||
input/output kmpNext |
input/output kmpNext: array[0..n] of integer |
||
) |
) |
||
Deklarasi: |
Deklarasi: |
||
i,j: integer |
i,j: integer |
||
Algoritme |
|||
Algoritma |
|||
i |
i:= 0; |
||
j |
j:= kmpNext[0]:= -1; |
||
while (i < n) { |
while (i < n) { |
||
while (j > -1 and not(P[i] = P[j])) |
while (j > -1 and not(P[i] = P[j])) |
||
j |
j:= kmpNext[j]; |
||
i:= i+1; |
i:= i+1; |
||
j:= j+1; |
j:= j+1; |
||
if (P[i] = P[j]) |
if (P[i] = P[j]) |
||
kmpNext[i] |
kmpNext[i]:= kmpNext[j]; |
||
else |
else |
||
kmpNext[i] |
kmpNext[i]:= j; |
||
endif |
endif |
||
endwhile |
endwhile |
||
Dan berikut adalah pseudocode |
Dan berikut adalah pseudocode algoritme KMP pada fase pencarian: |
||
procedure KMPSearch( |
procedure KMPSearch( |
||
input m, n |
input m, n: integer, |
||
input P |
input P: array[0..n-1] of char, |
||
input T |
input T: array[0..m-1] of char, |
||
output ketemu |
output ketemu: array[0..m-1] of boolean |
||
) |
) |
||
Deklarasi: |
Deklarasi: |
||
i, j,next: integer |
i, j,next: integer |
||
kmpNext |
kmpNext: array[0..n] of interger |
||
Algoritme: |
|||
Algoritma: |
|||
preKMP(n, P, kmpNext) |
preKMP(n, P, kmpNext) |
||
i:=0 |
i:=0 |
||
Baris 68: | Baris 68: | ||
== Kompleksitas == |
== 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 == |
== Referensi == |
||
Baris 74: | Baris 74: | ||
== Lihat pula == |
== Lihat pula == |
||
* [[Daftar |
* [[Daftar algoritme]] |
||
* [[ |
* [[Algoritme pencarian string]] |
||
* [[ |
* [[Algoritme Boyer-Moore]] |
||
== Pranala luar == |
== Pranala luar == |
||
* [http://www-igm.univ-mlv.fr/~lecroq/string/node8.html Halaman berisi penjelasan tentang |
* [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}} |
{{DEFAULTSORT:Knuth-Morris-Pratt}} |
||
⚫ | |||
[[Kategori: |
[[Kategori:Algoritme string]] |
||
⚫ | |||
[[de:Knuth-Morris-Pratt-Algorithmus]] |
|||
[[en:Knuth–Morris–Pratt algorithm]] |
|||
[[es:Algoritmo Knuth-Morris-Pratt]] |
|||
[[fa:الگوریتم تطابق رشته با زمان خطی]] |
|||
[[fr:Algorithme de Knuth-Morris-Pratt]] |
|||
[[it:Algoritmo di Knuth-Morris-Pratt]] |
|||
[[ja:クヌース-モリス-プラット法]] |
|||
[[ko:크누스-모리스-프랫 알고리즘]] |
|||
[[pl:Algorytm Knutha-Morrisa-Pratta]] |
|||
[[pt:Knuth-Morris-Pratt]] |
|||
[[ru:Алгоритм Кнута — Морриса — Пратта]] |
|||
[[uk:Алгоритм Кнута-Моріса-Прата]] |
|||
[[vi:Thuật toán Knuth–Morris–Pratt]] |
|||
[[zh:克努斯-莫里斯-普拉特算法]] |
Revisi terkini sejak 8 Februari 2023 10.19
Algoritme Knuth-Morris-Pratt adalah salah satu algoritme pencarian string, dikembangkan secara terpisah oleh Donald E. Knuth pada tahun 1967 dan James H. Morris bersama Vaughan R. Pratt pada tahun 1966, tetapi keduanya mempublikasikannya secara bersamaan pada tahun 1977.
Jika kita melihat algoritme brute force lebih mendalam, kita mengetahui bahwa dengan mengingat beberapa perbandingan yang dilakukan sebelumnya kita dapat meningkatkan besar pergeseran yang dilakukan. Hal ini akan menghemat perbandingan, yang selanjutnya akan meningkatkan kecepatan pencarian.[1]
Cara kerja
[sunting | sunting sumber]Perhitungan penggeseran pada algoritme ini adalah sebagai berikut, bila terjadi ketidakcocokkan pada saat pattern sejajar dengan , kita bisa menganggap ketidakcocokan pertama terjadi di antara dan , dengan . Berarti, dan tidak sama dengan . Ketika kita menggeser, sangat beralasan bila ada sebuah awalan dari pattern akan sama dengan sebagian akhiran dari sebagian teks. Sehingga kita bisa menggeser pattern agar awalan tersebut sejajar dengan akhiran dari .
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- dari pattern. Tabel itu harus memuat yang merupakan posisi karakter setelah digeser, sehingga kita bisa menggeser pattern sebesar relatif terhadap teks.[2]
Secara sistematis, langkah-langkah yang dilakukan algoritme Knuth-Morris-Pratt pada saat mencocokkan string:
- Algoritme Knuth-Morris-Pratt mulai mencocokkan pattern pada awal teks.
- Dari kiri ke kanan, algoritme 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 algoritme akan memberitahukan penemuan di posisi ini.
- Algoritme kemudian menggeser pattern berdasarkan tabel next, lalu mengulangi langkah 2 sampai pattern berada di ujung teks.
Pseudocode
[sunting | sunting sumber]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
[sunting | sunting sumber]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
[sunting | sunting sumber]- ^ (Inggris)Lecroq, Thierry Charras, Christian. 2001. Handbook of Exact String Matching Algorithm. ISBN 0-9543006-4-5
- ^ (Inggris) Knuth, Donald E. Morris, James H. Pratt, Vaughan R. 1977. Fast Pattern Matching in Strings, SIAM Journal of Computing Vol 6 No.2.