You are on page 1of 10

The searching algorithm compares the symbols of the

pattern from right to left with the text. After a complete match the
pattern is shifted according to how much its widest border allows.
After a mismatch the pattern is shifted by the maximum of the
values given by the good-suffix and the bad-character
heuristics(แก้ปัญหา).
อัลกอริทึมการค้นหา(Boyer
Moore)จะเปรียบเทียบสัญลักษณ์ของรูปแบบ(Pattern)จากขวาไปซ้าย
หลังการเปรียบเทียบรูปแบบที่ถูกเลื่อนไปแล้วตามขอบเขตที่กว้างที่สุด
และจะเลื่อนค่าสูงสุดที่ถูกกาหนดโดย Good-Suffix และ การแก้ปัญหา
Bad-Character

Analysis (วิเคราะห์)
If there are only a constant number of matches of the pattern
in the text, the Boyer-Moore searching algorithm perfoms O(n)
comparisons in the worst case. The proof of this is rather difficult.
ถ้ามีเลขคงที่แค่ตัวเดียวที่ได้จากการ match ของ pattern
ในข้อความ อัลกอริทึมการค้นหาแบบ Boyer-Moore
ก็จะดาเนินการเปรียบเทียบในกรณีที่แย่ที่สุด
ทาให้การพิสูจน์ค่อนข้างทาได้ยาก
In general Θ(n·m) comparisons are necessary, e.g. if the
pattern is am and the text an. By a slight modification of the
algorithm the number of comparisons can be bounded to O(n)
even in the general case.
โดยทั่วไปแล้วการเปรียบเทียบ Θ(n·m) นั้นสาคัญมาก ถ้า Pattern
คือ am และข้อความคือ an
โดยที่การเปลี่ยนแปลงเล็กน้อยของตัวเลขอัลกอริทึมของการเปรียบเทียบนั้
นสามารถกระโดดไป O(n) ได้แม้ว่าจะเป็นกรณีทั่วไป
If the alphabet is large compared to the length of the pattern,
the algorithm performs O(n/m) comparisons on the average. This
is because often a shift by m is possible due to the bad character
heuristics.

ในกรณีของตัวอักษรใหญ่ถูกเทียบกับความยาวของ Pattern
อัลกอริทึมจะดาเนินการโดยการเปรียบเทียบค่าเฉลี่ย
เป็นเพราะว่าบ่อยครั้งที่การเลื่อนโดย m
นั้นเป็นไปได้ที่จะเกิดการแก้ปัญหา Bad Character

Conclusions (สรุป)
The Boyer-Moore algorithm uses two different heuristics for
determining the maximum possible shift distance in case of a
mismatch: the "bad character" and the "good suffix" heuristics.
Both heuristics can lead to a shift distance of m. For the bad
character heuristics this is the case, if the first comparison causes
a mismatch and the corresponding text symbol does not occur in
the pattern at all. For the good suffix heuristics this is the case, if
only the first comparison was a match, but that symbol does not
occur elsewhere in the pattern.
อัลกอรึทึม Boyer Moore ใช้ 2
ความแตกต่างที่ไม่ตายตัว(heuristics)
สาหรับการกาหนดความเป็นไปได้สูงสุดที่ของระยะการเลื่อน(shift)
ในกรณีที่เกิดการเปรียบเทียบไม่ตรงกัน (mismatch)
หรือก็คือเกิดการแก้ปัญหา Bad character และ Good suffix
ซึ่งการแก้ปัญหาทั้งสองแบบนั้นสามารถนาไปสู่การเลื่อนระยะของ m ได้

สาหรับกรณีของการแก้ปัญหา Bad Character
ถ้าหากว่าการเปรียบเทียบครั้งแรกไม่สามารถจับคู่กันได้ และ
สัญลักษณ์ข้อความที่ตรงกันไม่ได้เกิดขึ้นใน Pattern ทั้งหมด
สาหรับกรณีของการแก้ปัญหา Good Suffix
ถ้าหากว่าการเปรียบเทียบเพียงแค่ครั้งแรกครั้งเดียวนั้นสามารถจับคู่ได้
แต่สัญลักษณ์ไม่ได้ปรากฎบนที่อื่นๆใน Pattern เลย
The preprocessing for the good suffix heuristics is rather
difficult to understand and to implement. Therefore, sometimes
versions of the Boyer-Moore algorithm are found in which the
good suffix heuristics is left away. The argument is that the bad
character heuristics would be sufficient and the good suffix
heuristics would not save many comparisons. However, this is not
true for small alphabets. If for simplicity one wants to restrict
oneself to the bad character heuristics, the Horspool algorithm
[Hor 80] or the Sunday algorithm[Sun 90] are suited better.
กระบวนการก่อนที่จะแก้ปัญหา Good Suffix
นั้นค่อนข้างทาความเข้าใจและดาเนินการยาก ดังนั้น อัลกอริทึม BoyerMoore บางรุ่นได้ตัดการแก้ปัญหา Good Suffix ออกไป
เหตุผลคือการแก้ปัญหา Bad Character
นั้นมีประสิทธิภาพกว่าและการแก้ปัญหา Good Suffix
จะเสียการเปรียบเทียบไปจานวนมาก

อย่างไรก็ตามในส่วนของการแก้ปัญหา Bad Character ของตัวอักษรเล็ก
Horspool Algorithm หรือ Sunday Algorithm จะเหมาะสมกว่า

The Boyer and Moore String Matching Method
(หลักการจับคูข
่ อง Boyer and Moore)
หลักการของ Boyer and Moore (BM)
ขึ้นอยู่กับลาดับการวิเคราะห์ของรูปแบบของคาถาม กระบวนการใช้
Boyer and Moore นั้นจาเป็นต้องสร้างตารางช่วยประกอบด้วย

ตาแหน่งใน Pattern สาหรับแต่ละตัวอักษร
ตลอดจนประกอบด้วยตัวอักษรใกล้เคียงมากกว่า 1 ตัว
พิจารณา input ตัวอย่าง

กาหนดให้ตัวเลขแสดงตาแหน่งต่างๆของตัวอักษรทั้งหมดใน
Pattern
วิเคราะห์ Pattern จะสังเกตุว่าตัว B อยู่ในตาแหน่งที่ 1 ตัว A
อยู่ในตาแหน่งที่ 2,4,6 ;
N อยู่ในตาแหน่งที่ 3 และ 5 ;
AN อยู่ในตาแหน่ง 2,3 และ 4,5; NA อยู่ในตาแหน่ง 3,4 และ 5,6 ;
ANA อยู่ในตาแหน่ง 2,3,4 และ 4,5,6
ข้อมูลตาแหน่งเหล่านี้จะใช้ในการกาหนดตาแหน่งการจับคู่ร่วมกับข้
อความที่ตรวจสอบ
กระบวนการอัลกอริทึม Boyer and Moore
เริ่มจากการเปรียบเทียบตัวอักษรด้านขวาใน Pattern ด้วยตัวอักษรใน
string ถ้าพบว่าตรงกันจะเลื่อนไปตรวจสอบตัวอักษรถัดไปด้านซ้ายของ
Pattern โดยการเลื่อนตัวชี้(pointer) ไปด้านซ้าย 1 ตาแหน่ง
เมื่อพบว่าตัวอักษรที่ตัวชี้ชี้อยู่นั้นไม่ตรงกัน
ตัวชี้จะเลื่อนไปทางขวาจนถึงตัวอักษรถัดไปที่ทาการเปรียบเทียบได้
ความซับซ้อนหลักในอัลกอริทึม Boyer and Moore

ประกอบด้วยการกาหนดตัวชี้เลื่อนอย่างแม่นยาเมื่อเกิดเหตุการณ์จับคู่ไม่ต
รงกัน
กฎหลัก 2 ข้อ
คือการใช้ตัวชี้เลื่อนเฉพาะเมื่อตรวจพบการจับคู่ตัวอักษรไม่ตรงกัน
1. เมื่อการเรียงอักษรที่ไม่ตรงกันถูกตรวจสอบ
จึงเกิดความพยายามเพื่อหาการเรียงอักษร ในรูปแบบอื่น ๆ
และเพื่อกาหนดรูปแบบการเรียงอักษรที่สาคัญเพื่อให้สอดคล้องกัน
(Known as . . . . ) ควรเรียงอักษรที่ไม่เกิดขึ้นในรูปแบบทั้งหมด
การเปลี่ยนแปลงตามความยาวทั้งหมดของรูปแบบอยู่ในลาดับ/คาสั่ง
??

2. เมื่อส่วนหนึ่งของรูปแบบที่ตรงกับภายใต้การเรียงอักษรในข้อความ
จึงเกิดความพยายามเพื่อหาการเกิดซ้าในรูปแบบของการจับคู่กับภา
ยใต้รูปแบบเดิม
การเปลี่ยนแปลงต้องการนารูปแบบเกิดขึ้นใหม่ของรูปแบบที่สอดคล้
องกับ matching substring

เพื่อตรวจสอบการจับคูท่ ี่สมบูรณ์แบบระหว่างแบบสอบถามและรูปแบบของการเรี ยงข้ อความ
เงื่อนไขนี ้ทาให้ เกิดการเปลี่ยนแปลง (shift ในที่นี ้ไม่ร้ ุจะแปลว่าไร )ที่ 1 และ 2
ทังสองรู

ปแบบต้ องมีความสอดคล้ องกัน เพราะการเรี ยงข้ อความที่ไม่ตรงกันนัน้
ในที่สดุ ก็จะต้ องหารูปแบบที่ทาให้ สอดคล้ องกัน (ดังเช่นการเปลี่ยนแปลง
1
)แล้ วการจับคูก่ บั ส่วนหนึง่ ของรูปแบบจะต้ องถูกจับคูอ่ ีกครัง้ ตาม a pointer shift operation
(ดังเช่นการเปลี่ยนแปลง 2 )

แต่ละจุดกระบวนการการจับคูเ่ ป็ นสิ่งที่เหมาะสมเพื่อดาเนินการเปลี่ยนแปลงที่เท่ากันถึงจุดสูงสุด ระหว่าง
และ 2
พิจารณา แบบสอบถามและรูปแบบของการเรี ยงข้ อความ ดังต่อไปนี ้

1

หลังจากการเปรี ยบเทียบระหว่างตาแหน่งลาดับที่ 9 ลาดับที่ 8 และลาดับที่ 7 ประสบผลสาเร็จ
ตาแหน่งที่ 6 เป็ นการจับคูท่ ี่ไม่ตรงกัน การเปลี่ยนแปลง 2 รูปแบบตรงจุดนี ้เป็ นไปไม่ได้ พิจารณา
การเปลี่ยนแปลง 1
ตัวแรก ตังแต่
้ การเรี ยงตัวอักษรที่ไม่ตรงกันที่ตวั f ไม่เกิดขึ ้นในรูปแบบ
สามารถย้ ายรูปแบบได้ ตลอดทางเกินกว่าตาแหน่งตัวอักษร F
ดังรูปแบบใหม่ดงั นี ้

การเปลี่ยนแปลง 2 จะถูกกาหนดโดยการค้ นหาการเกิดขึ ้นใหม่ของการจับคูภ่ ายใต้ รูปแบบ abc
ในตาแหน่งที่ 7 – 9 ตังแต่
้ ภายใต้ รูปแบบ abc ถูกซ ้าในตาแหน่งที่ 4 – 6 a shift of 3 ยังคงตรงกับ substring
จับคูเ่ ดิม

ตังแต่
้ การเปลี่ยนแปลงตัวชี ้ใหญ่ที่สดุ ที่เป็ นไปได้ เป็ นประโยชน์มากที่สดุ การเปลี่ยนแปลง 2
จะถูกดาเนินการในกรณีที่อยู่ภายใต้ การพิจารณา ตัวอย่างเต็มรูปแบบของกระบวนการ BM จะรวมอยูใ่ นรูป 826 [52.]
เป็ นเรื่ องง่ายที่จะเห็นว่าจานวนของตัวอักษรที่ต้องการจับคูก่ นั ระหว่างการเรี ยงข้ อมูลและรูปแบบอื่นๆ
จะลดลง ขณะที่ความแตกต่างระหว่างแบบสอบถามและรูปแบบของการเรี ยงข้ อความจะเพิ่มขึ ้น
(ที่เป็ นการเรี ยงตัวอักษรที่น้อยกว่าที่เกิดขึ ้นในรูปแบบ) และขณะที่รูปแบบการจัดแสดงส่วนที่ซ ้าน้ อยลง
โดยปกติจานวนตัวอักษรที่ไม่ตรงกันมีมากกว่าจานวนตัวอักษรที่ตรงกัน ในกรณีเช่น
จานวนของการเปรี ยบเทียบตัวอักษรจะมีนยั สาคัญน้ อยกว่าความยาวของการเรี ยงข้ อความ และกระบวนการ

Boyer and Moore จะพิสจู น์ได้ อย่างมีประสิทธิภาพ ข้ อเสียของกระบวนการ Boyer and Moore เป็ นที่ฝังตัว
"ไม่สนใจ" ตัวอักษรที่เกิดขึ ้นในช่วงกลางหรื อปลายสุดของรูปแบบสอบถามเป็ นเรื่ องยากที่จะจัดการ

(a)

T != A และ T ไม่ได้อยู่ใน Pattern : เลื่อนโดยความยาว

Pattern

(b)

L != A และ L ไม่ได้อยู่ใน Pattern : เลื่อนโดยความยาว

Pattern

(c) N != A แต่ N อยู่ใน Pattern; ขยับ N ให้ตรงกันโดยขยับไป 1
ตาแหน่ง

(d)

NA ตรงกับ NA แล้วแต่ - != A; ตัวถัดไปใน Pattern มี NA

อยู่ในตาแหน่งที่ 3 และ 4 จากนั้นขยับให้ NA ตาแหน่ง3และ4
ให้ตรงกับ NATURAL โดยขยับไป 2 ตาแหน่ง;

จนกระทั่งไม่มีตัวจับคู่ที่ตรงกันใน Pattern แล้ว สามารถเลื่อน
Pattern ให้พ้นสัญลักษณ์ – โดยการเลื่อน 4 ตาแหน่ง

(e)

A ตรงกับ A, แต่ R != N และ R ไม่ได้อยู่ใน Pattern;

ทาการเลื่อน 2 ตาแหน่งเพื่อให้ A ตัวถัดไปตรงกับ A และเลื่อนไป
5 ตาแหน่ง ให้พ้น R เพราะ R ไม่ได้อยู่ใน Pattern

(f) N != A, เลื่อน 1 ตาแหน่งให้ N ตรงกับ N ใน Pattern

(g) ANA = ANA แต่ B != N; ซึ่ง ANA
ต่อไปที่ปรากฏบนข้อความถัดไปอีก 2 ตาแหน่ง

(h)

ทาการจับคู่เสร็จสมบูรณ์