ผลต่างระหว่างรุ่นของ "Kmp"

จาก Theory Wiki
ไปยังการนำทาง ไปยังการค้นหา
(หน้าที่ถูกสร้างด้วย 'หน้านี้สำหรับอธิบายการทำงานของอัลกอริทึม [http://en.wik...')
 
แถว 1: แถว 1:
 
หน้านี้สำหรับอธิบายการทำงานของอัลกอริทึม [http://en.wikipedia.org/wiki/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm Knuth–Morris–Pratt string matching]
 
หน้านี้สำหรับอธิบายการทำงานของอัลกอริทึม [http://en.wikipedia.org/wiki/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm Knuth–Morris–Pratt string matching]
  
ส่วนที่ยุ่งยากที่สุดคือการคำนวน prefix function (<math>\pi</math>)
+
อัลกอริทึมรับ string '''P''' (pattern) และสตริง '''S''' จากนั้นหา '''P''' ใน '''S'''
 +
 
 +
อัลกอริทึมจะทยอย match '''P''' ใน '''S''' ไปเรื่อย ๆ เช่นถ้าเราต้องการหา <tt>ABABACA</tt> ใน <tt>ABABABACA</tt> อัลกอริทึมจะเริ่ม match ตั้งแต่ตำแหน่งแรก ดังด้านล่าง
 +
 
 +
<pre>
 +
S:ABABABACA
 +
P:A
 +
</pre>
 +
 
 +
<pre>
 +
S:ABABABACA
 +
P:AB
 +
</pre>
 +
 
 +
<pre>
 +
S:ABABABACA
 +
P:ABA
 +
</pre>
 +
 
 +
<pre>
 +
S:ABABABACA
 +
P:ABAB
 +
</pre>
 +
 
 +
<pre>
 +
S:ABABABACA
 +
P:ABABA
 +
</pre>
 +
 
 +
จนกระทั่ง match ไม่ได้
 +
<pre>
 +
S:ABABA*B*ACA
 +
P:ABABA*C*
 +
</pre>
 +
 
 +
ส่วนที่ยุ่งยากที่สุดคือการคำนวน prefix function (<math>\pi</math>, เพื่อความง่ายต่อไปจะเรียกว่า '''pi'''), ซึ่งมีนิยามดังนี้
 +
 
 +
* '''pi(j)''' เป็นความยาวของ prefix ของ '''P[1...(j-1)]''' ที่เป็น suffix ของ '''P[1...j]'''  ฟังก์ชันนี้จะใช้ในการกระโดดเมื่อเกิดการจับคู่ไม่ได้
 +
 
 +
ด้านล่างแสดงตัวอย่างของค่า '''pi(j)''' ต่าง ๆ ของสตริง <tt>ABABACA</tt>
 +
 
 +
<pre>
 +
A B A B A C A
 +
A B
 +
A B A
 +
A B A B
 +
A B A B A
 +
A B A B A C
 +
A B A B A C A
 +
</pre>

รุ่นแก้ไขเมื่อ 09:22, 13 กรกฎาคม 2557

หน้านี้สำหรับอธิบายการทำงานของอัลกอริทึม Knuth–Morris–Pratt string matching

อัลกอริทึมรับ string P (pattern) และสตริง S จากนั้นหา P ใน S

อัลกอริทึมจะทยอย match P ใน S ไปเรื่อย ๆ เช่นถ้าเราต้องการหา ABABACA ใน ABABABACA อัลกอริทึมจะเริ่ม match ตั้งแต่ตำแหน่งแรก ดังด้านล่าง

S:ABABABACA
P:A
S:ABABABACA
P:AB
S:ABABABACA
P:ABA
S:ABABABACA
P:ABAB
S:ABABABACA
P:ABABA

จนกระทั่ง match ไม่ได้

S:ABABA*B*ACA
P:ABABA*C*

ส่วนที่ยุ่งยากที่สุดคือการคำนวน prefix function (, เพื่อความง่ายต่อไปจะเรียกว่า pi), ซึ่งมีนิยามดังนี้

  • pi(j) เป็นความยาวของ prefix ของ P[1...(j-1)] ที่เป็น suffix ของ P[1...j] ฟังก์ชันนี้จะใช้ในการกระโดดเมื่อเกิดการจับคู่ไม่ได้

ด้านล่างแสดงตัวอย่างของค่า pi(j) ต่าง ๆ ของสตริง ABABACA

A B A B A C A
A B
A B A
A B A B 
A B A B A 
A B A B A C
A B A B A C A