อัลกอริธึม boyer มัวร์อัลกอริธึม
boyer มัวร์เป็นหนึ่งในอัลกอริธึมความเร็วรูปแบบการค้นหาที่ใช้ในสองเทคนิค:
เทคนิคที่ใช้
1 เทคนิคแก้วกำลังมองหาสถานที่ซึ่งท่านจะได้พบกับ P ลวดลายที่อยู่ในข้อความ T โดยการย้ายไปทางด้านหลังผ่าน P เริ่มต้นที่ปลาย
2 . อักขระที่กระโดด Heuristic เมื่อไม่ตรงกันที่เกิดขึ้นระหว่างตัวอักษรที่ตำแหน่งข้อความ[ T ]= C
สามกรณีที่ได้รับการตรวจสอบในการสั่งซื้อนี้สำหรับการคำนวณการกระโดดแบบอักษร ก่อนที่จะย้ายไปอยู่ในการทำความเข้าใจกรณีบุคคลที่ปล่อยให้เราทำความเข้าใจที่ถูกต้องของการเกิดขึ้นที่ผ่านมาในรูปแบบสตริง ที่
วิธีสุดท้ายเกิด
ซึ่งจะช่วยให้การประมวลผลการเกิดขึ้นครั้งสุดท้ายการใช้งานคอมพิวเตอร์จะถือว่าอักขระที่ทั้งหมดอยู่ ภายใต้ ข้อพิจารณาที่มีตัวอักขระ ASCIIฟังก์ชันที่ computes เหตุการณ์ที่เกิดซ้ำสุดท้ายของอักขระที่ทั้งหมดที่อยู่ในรูปแบบ P โดยเริ่มจากด้านซ้าย ส่วนที่เหลือของตัวอักขระ ASCII ที่กลับไป - 1
พิจารณาอักขระ ASCII ชุดอักขระ{, B , C , D ,........................, Y , Z }แล้วที่ผ่านมาการเกิดทำงานจะคำนวณได้ตามที่แสดงในรูปด้าน ล่าง
ที่ฟังก์ชัน F ( X )จุดในที่เกิดขึ้นสุดท้ายของตัวอักษรในรูปแบบ P
computebmplast ( const STD ::สตริง &pattern ){
const size_t num_ascii_chars = 128 ;
Initialization Vector < Int > bmplast ( num_ascii_chars );
สำหรับ( size_t I = 0 ; I < num_ascii_chars ; I ){
bmplast [ i ]= - 1 ;
}
สำหรับ( size_t I = 0 ; I <รูปแบบ.ขนาด(); I ){
bmplast [รูปแบบ[ i ]]=ฉัน;
กลับไป} bmplast ;
}
ตัวอักษรกระโดด Heuristics
กรณี 1 :
อักขระที่ไม่ตรงกันเกิดขึ้นที่ที่ตั้งที่ T [ T ]=' X 'และ' X 'จะพบว่าเป็นที่ด้านซ้ายของตัว P [ P ]=' C 'หรือ 1 F ( T [ T ])<= P .ในกรณีนี้ย้ายรูปแบบ P ไปทางขวาไปที่ตำแหน่งสุดท้ายเกิดของ X ใน P x ใน T
tnew = T ความยาวของรูปแบบ - ( 1 ครั้งล่าสุดเกิดของ' X 'ในรูปแบบ)
pnew =ความยาวของรูปแบบ - 1
กรณี 2 :
อักขระที่ไม่ตรงกันเกิดขึ้นที่ที่ตั้งที่ T [ T ]=' X 'และ' X 'จะพบว่าเป็นสิทธิของตัวอักษร P [ P ]=' C 'หรือ 1 F ( T [ T ])>, p .ในเหตุการณ์นี้การจัดไม่ได้เป็นไปได้โดยการย้ายที่รูปแบบเพื่ออยู่ทางด้านขวามือของที่เป็นพื้นฐานของการเกิดขึ้น. ที่นี่เราจะเปลี่ยนรูปแบบโดย 1 ดังนั้นที่ P [ T P ]= C สอดคล้องกับ T [ T 1 ]=
tnew =ความยาวของรูปแบบ - P
pnew =ความยาวของรูปแบบ - 1
กรณี 3 :
หากกรณี 1 และ 2 ไม่สามารถนำมาใช้ซึ่งหมายถึงที่ตัวอักษร T [ T ]ไม่พบในรูปแบบ p .ในกรณีนี้เราจะเดินทางไปที่รูปแบบ P ดังนั้นที่ P [ 0 ]= x สอดคล้องในตัวเองพร้อมด้วย T [ T 1 ]= ที่
tnew = t ความยาวของรูปแบบ
pnew =ความยาวของรูปแบบ - 1
//อักขระกระโดด Heuristics
Int lastoccur = bmplast [ข้อความ[ tidx ]];
หาก( lastoccur != - 1 ){
หาก( pidx > lastoccur ){//กรณี 1 :ครั้งล่าสุดเกิดขึ้นในคลอกเป็นไปทางด้านซ้ายหรือเท่ากับที่ไม่ตรงกันจุด
tidx = tidx patternsize - ( 1 lastoccur );
pidx = patternsize - 1 ;
อื่น}{// 2 :ครั้งล่าสุดเกิดขึ้นในคลอกเป็นไปทางด้านขวาของที่ไม่ตรงจุด
tidx = tidx patternsize - ( pidx );
pidx = patternsize - 1 ;
}}
อื่น{//กรณี 3 :ตัวอักษรไม่พบในรูปแบบสตริง
tidx = tidx patternsize ;
pidx = patternsize - 1 ;
}
การรวมกรณี 1 และ 2 ในที่สูงกว่า รหัส
//อักขระกระโดด Heuristics
Int lastoccur = bmplast [ข้อความ[ tidx ]];
หาก( lastoccur != - 1 ){
tidx = tidx patternsize - นาที< Int >( pidx , 1 lastoccur );
}
อื่น{//กรณี 3 :ตัวอักษรไม่พบในรูปแบบสตริง
tidx = tidx patternsize ;
}
pidx = patternsize - 1 ;
ในกรณีของเราเป็น computebmplast ()ฟังก์ชันร้านค้า 1 สำหรับตัวไม่พบในรูปแบบการค้นหา เราสามารถได้อย่าง ปลอดภัย รวมกรณี 3 ในที่สูงกว่ารหัสสำหรับการ ดู
//อักขระกระโดด Heuristics
Int lastoccur = bmplast [ข้อความ[ tidx ]];
tidx = tidx patternsize - นาที< Int >( pidx , 1 lastoccur );
pidx = patternsize - 1 ;
ยกตัวอย่างเช่น:
เสร็จสมบูรณ์ตัวอย่าง รหัส
#ifndef _patternmatcher_h_
#define _patternmatcher_h_ #include
#include #include
การใช้อยู่ใน Namespace เดียวกัน STD ;
Class patternmatcher {
สาธารณะ:
แบบสแตติก Int bmpsearch ( const string& ข้อความ, const string& รูปแบบ);
แบบส่วนตัว:
ไฟฟ้าสถิตย์เวกเตอร์< Int > computebmplast ( const string& รูปแบบ);
patternmatcher ();
patternmatcher ( const patternmatcher& );
const patternmatcher& ผู้ปฏิบัติงาน=( const patternmatcher& );
};
http // #endif _patternmatcher_h_
#include " patternmatcher . H "
#include
อยู่ใน Namespace เดียวกันโดยใช้มาตรฐาน;
Int patternmatcher :: bmpsearch ( const STD :::สตริง &text , const STD ::สตริง &pattern ){
size_t textsize =ข้อความ.ขนาด();
size_t patternsize =รูปแบบ.ขนาด();
หาก( textsize == 0 || patternsize == 0 ){
กลับไป - 1 ;
}
หาก( patternsize > textsize :{
กลับไป - 1 ;
}
เวกเตอร์< Int > bmplast = computebmplast (รูปแบบ);
size_t tidx = patternsize - 1 ;
size_t pidx = patternsize - 1 ;
ขณะที่( tidx < textsize ){
หาก(รูปแบบ[ pidx ]==ข้อความ[ tidx ]){
หาก( pidx == 0 ){ข้อผิดพลาด http //พบว่าตรงกับ
กลับ tidx ;
tidx }ซ้ำ;
pidx ซ้ำ;
}{
อื่นลักษณะ//กระโดด Heuristics
Int lastoccur = bmplast [ข้อความ[ tidx ]];
tidx = tidx patternsize - นาที< Int >( pidx , 1 lastoccur );
pidx = patternsize - 1 ;
}}
กลับไป - 1 ;
}
เวกเตอร์< Int > patternmatcher ::: computebmplast ( const STD :::สตริง &pattern ){
const size_t num_ascii_chars = 128 ;
Initialization Vector < Int > bmplast ( num_ascii_chars );
สำหรับ( size_t I = 0 ; I < num_ascii_chars ; I ){
bmplast [ i ]= - 1 ;
}
สำหรับ( size_t I = 0 ; I <รูปแบบ.ขนาด(); I ){
bmplast [รูปแบบ[ i ]]=ฉัน;
}
กลับไป bmplast ;
}
#include " patternmatcher . H "
Int หลัก(){
cout << patternmatcher :: bmpsearch
(" abacaabaccabacabaabb "," abacab ")
<< endl ;
cout << patternmatcher :: bmpsearch
(" abacaabaccabacabaabb "," baabb ")
<< endl ;
cout << patternmatcher :: bmpsearch
(" abacaabaccabacabaabb "," abacad ")
<< endl ;
cout << patternmatcher ::: bmpsearch
ตามมาตรฐาน(" abacaabaccabacabaabb "," abacaab ")
<< endl ;
cout << patternmatcher :: bmpsearch
ตามมาตรฐาน(" abacaabaccabacabaabb "," abacab ")
<< endl ;
cout << patternmatcher ::bmpsearch
(" abacaabaccabacabaabb "," aabaccaba ")
<< endl ;
cout << patternmatcher :: bmpsearch
(" abacaabaccabacabaabb "," abacaabaccabacabaabb ")
<< endl ;
cout << patternmatcher :: bmpsearch
(" abacaabaccabacabaabb ","")
<< endl ;
cout << patternmatcher ::: bmpsearch
ตามมาตรฐาน(""," abacaabaccabacabaabb ")
<< endl ;
cout << patternmatcher ::: bmpsearch
ตามมาตรฐาน(" abacaabaccabacabaabb "," bacaabaccabacabaab ")
<< endl ;
cout << patternmatcher :: bmpsearch
(" abacaabaccabacabaabb "," abacaabac ")
<< endl ;
cout << patternmatcher :: bmpsearch
(" abacaabaccabacabaabb "," ccabacabaabb ")
<< endl ;
cout << patternmatcher :: bmpsearch
ตามมาตรฐาน(" abacaabaccabacabaabb "," bacaabaccabacabaabb ")
<< endl ;
กลับไป 0 ;
}
การแปล กรุณารอสักครู่..