Boyer Moore AlgorithmBoyer Moore Algorithm is one of the fastest patte การแปล - Boyer Moore AlgorithmBoyer Moore Algorithm is one of the fastest patte ไทย วิธีการพูด

Boyer Moore AlgorithmBoyer Moore Al

Boyer Moore Algorithm
Boyer Moore Algorithm is one of the fastest pattern searching algorithm based on two techniques:

Techniques Used
1. The looking glass technique where you find a pattern P in text T by moving backwards through P, starting at it’s end.
2. The character jump heuristic when a mismatch occurs between the characters at position Text[t] = c

Three cases are checked in the order for calculating the character jump. Before moving on to understand the individual cases, let us understand the computation of last occurrence position in the pattern string

Computing last occurrence
The compute last occurrence method assumes that all the characters under the consideration are ASCII characters. The function computes last occurrences of all the characters present in the Pattern P starting from the left. The rest of the ASCII chars return -1

Consider the ASCII character set {a, b, c, d, …, y, z} then the last occurrence function would be computed as shown in the figure below


The function f(x) points to the last occurrence of character in the pattern P

computeBmpLast(const std::string &pattern){
const size_t NUM_ASCII_CHARS = 128;
vector bmpLast(NUM_ASCII_CHARS);

for(size_t i = 0; i < NUM_ASCII_CHARS; i++){
bmpLast[i] = -1;
}

for(size_t i = 0; i < pattern.size(); i++){
bmpLast[pattern[i]] = i;
}
return bmpLast;
}


Character Jump Heuristics

Case 1:
The character mismatch occurs at the location T[t] = ‘x’ and the character ‘x’ is found to the left of the character P[p] = ‘c’ OR 1 + f(T[t]) p. In this scenario alignment is not possible by moving the pattern to the right on the basis of last occurrence. Here we shift the pattern by 1 so that P[p] = c aligns with T[t+1] = a


tnew = t + length of pattern – p
pnew = length of pattern – 1

Case 3:
If the case 1 and case 2 cannot be applied, that means the character T[t] is not found in the pattern P. In this case, we move the pattern P so that P[0] = x aligns itself with T[t+1] = a


tnew = t + length of pattern
pnew = length of pattern – 1

//Character Jump Heuristics
int lastOccur = bmpLast[text[tIdx]];
if(lastOccur != -1){
if(pIdx > lastOccur){// Case 1: last occurrence of char is to left or equal to the mismatch point
tIdx = tIdx + patternSize - (1 + lastOccur);
pIdx = patternSize - 1;
}
else{// Case 2: last occurrence of char is to right of the mismatch point
tIdx = tIdx + patternSize - (pIdx);
pIdx = patternSize - 1;
}
}
else{// Case 3: character is not found in the pattern string
tIdx = tIdx + patternSize;
pIdx = patternSize - 1;
}
Merging Case 1 and Case 2 in the above code

//Character Jump Heuristics
int lastOccur = bmpLast[text[tIdx]];
if(lastOccur != -1){
tIdx = tIdx + patternSize - min(pIdx, 1 + lastOccur);
}
else{// Case 3: character is not found in the pattern string
tIdx = tIdx + patternSize;
}
pIdx = patternSize - 1;
In our case as computeBmpLast() function stores -1 for characters not found in the search pattern. We can safely merge the Case 3 in the above code to look as

//Character Jump Heuristics
int lastOccur = bmpLast[text[tIdx]];
tIdx = tIdx + patternSize - min(pIdx, 1 + lastOccur);
pIdx = patternSize - 1;

Example:



Complete Code Example

#ifndef _PatternMatcher_H_
#define _PatternMatcher_H_
#include
#include
#include
using namespace std;
class PatternMatcher{
public:
static int bmpSearch(const string& text, const string& pattern);

private:
static vector computeBmpLast(const string& pattern);

PatternMatcher();
PatternMatcher(const PatternMatcher&);
const PatternMatcher& operator=(const PatternMatcher&);
};
#endif //_PatternMatcher_H_
#include "PatternMatcher.h"
#include

using namespace std;

int PatternMatcher::bmpSearch(const std::string &text, const std::string &pattern){
size_t textSize = text.size();
size_t patternSize = pattern.size();
if(textSize == 0 || patternSize == 0){
return -1;
}
if(patternSize > textSize){
return -1;
}

vector bmpLast = computeBmpLast(pattern);
size_t tIdx = patternSize - 1;
size_t pIdx = patternSize - 1;
while(tIdx < textSize){
if(pattern[pIdx] == text[tIdx]){
if(pIdx == 0){ //found a match
return tIdx;
}
tIdx--;
pIdx--;
}
else {
//Character Jump Heuristics
int lastOccur = bmpLast[text[tIdx]];
tIdx = tIdx + patternSize - min(pIdx, 1 + lastOccur);
pIdx = patternSize - 1;
}
}
return - 1;
}

vector PatternMatcher::computeBmpLast(const std::string &pattern){
const size_t NUM_ASCII_CHARS = 128;
vector bmpLast(NUM_ASCII_CHARS);
for(size_t i = 0; i < NUM_ASCII_CHARS; i++){
bmpLast[i] = -1;
}
for(size_t i = 0; i < pattern.size(); i++){
bmpLast[pattern[i]] = i;
}
return bmpLast;
}
#include "PatternMatcher.h"

int main(){
cout
0/5000
จาก: -
เป็น: -
ผลลัพธ์ (ไทย) 1: [สำเนา]
คัดลอก!
อัลกอริทึม boyer มัวร์Boyer มัวร์อัลกอริทึมจะค้นอัลกอริทึมตามเทคนิคสองรูปแบบที่เร็วที่สุดอย่างใดอย่างหนึ่ง:เทคนิคที่ใช้1.เทคนิคแก้วกำลังมองหาที่คุณค้นหารูปแบบ P ในข้อความ T โดยย้ายย้อนหลังผ่าน P ราคาเริ่มต้นที่จุดสิ้นสุดของมัน2. อักขระข้าม heuristic เมื่อไม่ตรงกันเกิดขึ้นระหว่างตัวที่ตำแหน่งข้อความ [t] = cกรณีที่ 3 มีการตรวจสอบในใบสั่งสำหรับการคำนวณข้ามอักขระ ก่อนที่จะย้ายในกรณีบุคคลเข้าใจ ให้เราเข้าใจการคำนวณตำแหน่งเหตุการณ์สุดท้ายในสตริงที่รูปแบบคำนวณเหตุการณ์ล่าสุดวิธีคำนวณล่าสุดเหตุการณ์สมมติอักขระทั้งหมดภายใต้การพิจารณาอักขระ ASCII ฟังก์ชันการคำนวณครั้งสุดท้ายของทุกตัวใน P รูปแบบเริ่มต้นจากด้านซ้าย ส่วนเหลือของข้อมูลอักขระ ASCII กลับ -1พิจารณาชุดอักขระ ASCII { a, b, c, d,..., y, z } แล้วจะคำนวณฟังก์ชันเกิดขึ้นสุดท้ายเหมือนในรูปด้านล่างF(x) ฟังก์ชันจุดสุดท้ายของอักขระในรูปแบบ PcomputeBmpLast (ค่า const std::string และรูปแบบ) { ค่า const size_t NUM_ASCII_CHARS = 128 bmpLast(NUM_ASCII_CHARS) เวกเตอร์ สำหรับ (size_t ฉัน = 0 ฉัน < NUM_ASCII_CHARS; i ++) { bmpLast [i] = -1 } สำหรับ (size_t ฉัน = 0 ฉัน < pattern.size(); i ++) { bmpLast [รูปแบบ [i]] =ฉัน } bmpLast กลับ}ลองผิดลองถูกข้ามอักขระกรณีที่ 1:อักขระที่ไม่ตรงกันเกิดขึ้นที่ตำแหน่ง T [t] = 'x' และอักขระ 'x' อยู่ทางซ้ายของอักขระ P [p] = 'c' หรือ 1 + f(T[t]) p ในสถานการณ์สมมตินี้ การจัดตำแหน่งไม่ได้ ด้วยรูปแบบทางขวาตามเหตุการณ์ล่าสุด นี่เรากะรูปที่ 1 ดังนั้น P [p] = c จัดด้วย [t + 1] =เป็นtnew =ความยาวของรูป – p + tpnew =ความยาวของรูป-1กรณีที่ 3:ถ้าไม่ใช้ กรณี 1 และ 2 กรณีนั่นหมายความว่า ไม่พบอักขระ T [t] ในรูปแบบพี ในกรณีนี้ เราย้ายรูป P ดังนั้น P [0] = x จัดเองด้วย [t + 1] =เป็นtnew = t + ความยาวของรูปpnew =ความยาวของรูป-1ลองผิดลองถูกข้ามอักขระint lastOccur = bmpLast [ข้อความ [tIdx]];ถ้า (lastOccur ! = -1) { if(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 กรณีในโค้ดข้างต้นรวมลองผิดลองถูกข้ามอักขระint lastOccur = bmpLast [ข้อความ [tIdx]];ถ้า (lastOccur ! = -1) { tIdx = tIdx + patternSize - นาที (pIdx, 1 + lastOccur);}อื่น { / / กรณี 3: ไม่พบอักขระในสายอักขระลวดลาย tIdx = tIdx + patternSize}pIdx = patternSize - 1ในกรณีของเราเป็น computeBmpLast() ฟังก์ชันเก็บ -1 สำหรับอักขระที่ไม่พบในรูปแบบการค้นหา เราสามารถรวม 3 กรณีในโค้ดข้างต้นดูเป็นได้อย่างปลอดภัยลองผิดลองถูกข้ามอักขระint lastOccur = bmpLast [ข้อความ [tIdx]];tIdx = tIdx + patternSize - นาที (pIdx, 1 + lastOccur);pIdx = patternSize - 1ตัวอย่าง:ตัวอย่างรหัสที่สมบูรณ์#ifndef _PatternMatcher_H_#define _PatternMatcher_H_#include #include #include ใช้ namespace มาตรฐานคลาส PatternMatcher {สาธารณะ: int คง bmpSearch (สายอักขระค่า const และข้อความ สายอักขระค่า const และรูป);ส่วนตัว: เวกเตอร์คง computeBmpLast (สายอักขระค่า const และรูป); PatternMatcher() PatternMatcher(const PatternMatcher&) PatternMatcher ค่า const และดำเนิน =(const PatternMatcher&)};#endif //_PatternMatcher_H_#include "PatternMatcher.h"#include ใช้ namespace มาตรฐานint PatternMatcher::bmpSearch (ค่า const std::string และข้อความ ค่า const std::string และรูปแบบ) { size_t textSize = text.size() size_t patternSize = pattern.size() ถ้า (textSize == 0 || patternSize == 0) { กลับ -1 } if(patternSize > textSize) { กลับ -1 } เวกเตอร์ bmpLast = computeBmpLast(pattern) size_t tIdx = patternSize - 1 size_t pIdx = patternSize - 1 while(tIdx < textSize) { ถ้า (ลาย [pIdx] == text[tIdx]) { if(pIdx == 0) {//found ตรงกัน tIdx กลับ } tIdx- pIdx- } {อื่น ลองผิดลองถูกข้ามอักขระ int lastOccur = bmpLast [ข้อความ [tIdx]]; tIdx = tIdx + patternSize - นาที (pIdx, 1 + lastOccur); pIdx = patternSize - 1 } } เที่ยวกลับ - 1}เวกเตอร์ PatternMatcher::computeBmpLast (ค่า const std::string และรูปแบบ) { ค่า const size_t NUM_ASCII_CHARS = 128 bmpLast(NUM_ASCII_CHARS) เวกเตอร์ สำหรับ (size_t ฉัน = 0 ฉัน < NUM_ASCII_CHARS; i ++) { bmpLast [i] = -1 } สำหรับ (size_t ฉัน = 0 ฉัน < pattern.size(); i ++) { bmpLast [รูปแบบ [i]] =ฉัน } bmpLast กลับ}#include "PatternMatcher.h"int main() { cout
การแปล กรุณารอสักครู่..
ผลลัพธ์ (ไทย) 2:[สำเนา]
คัดลอก!
บอยเยอร์มัวร์อัลกอริทึม
บอยเยอร์อัลกอริทึมมัวร์เป็นหนึ่งในรูปแบบที่เร็วที่สุดในการค้นหาขั้นตอนวิธีการขึ้นอยู่กับสองเทคนิค: เทคนิคการใช้1 เทคนิคกระจกมองที่คุณพบว่ารูปแบบ P ในข้อความ T โดยการย้ายไปข้างหลังผ่าน P เริ่มต้นที่จะเป็นจุดสิ้นสุด. 2 ตัวละครของฮิวริสติกระโดดเมื่อไม่ตรงกันเกิดขึ้นระหว่างตัวละครที่ข้อความตำแหน่ง [t] = c สามกรณีมีการตรวจสอบในการสั่งซื้อสำหรับการคำนวณกระโดดตัวอักษร ก่อนจะย้ายไปเข้าใจแต่ละกรณีให้เราเข้าใจการคำนวณตำแหน่งที่เกิดขึ้นครั้งล่าสุดในสตริงรูปแบบคอมพิวเตอร์เกิดขึ้นครั้งล่าสุดคำนวณวิธีการเกิดขึ้นครั้งล่าสุดอนุมานว่าตัวอักษรทั้งหมดภายใต้การพิจารณาเป็นอักขระ ASCII ฟังก์ชั่นการคำนวณที่เกิดขึ้นที่ผ่านมาของตัวละครทั้งหมดที่มีอยู่ในรูปแบบ P เริ่มจากด้านซ้าย ส่วนที่เหลือของตัวอักษร ASCII -1 กลับพิจารณาอักขระ ASCII ชุด {A, B, C, D, ... , y, z} แล้วฟังก์ชั่นเกิดขึ้นครั้งล่าสุดจะได้รับการคำนวณดังแสดงในรูปด้านล่างฟังก์ชัน f (x) จุด ที่จะเกิดขึ้นครั้งล่าสุดของตัวละครในรูปแบบ P computeBmpLast (const มาตรฐาน :: สตริงและรูปแบบ) { const size_t NUM_ASCII_CHARS = 128; เวกเตอร์ bmpLast (NUM_ASCII_CHARS); for (size_t i = 0; i <NUM_ASCII_CHARS; i ++) { bmpLast [i] = -1; } สำหรับ (size_t i = 0; i <pattern.size (); i ++) { bmpLast [รูปแบบ [i]] = ฉัน; } กลับ bmpLast; } ตัวละครกระโดด Heuristics กรณีที่ 1: ไม่ตรงกันตัวละครที่เกิดขึ้นใน สถานที่ตั้ง T [t] = 'x' และตัวอักษร 'X' พบว่าด้านซ้ายของตัวอักษร P [p] = 'C' หรือ 1 + f (T [t]) P ในการจัดตำแหน่งสถานการณ์นี้เป็นไปไม่ได้โดยการย้ายรูปแบบไปทางขวาบนพื้นฐานของการเกิดขึ้นครั้งล่าสุด ที่นี่เราเปลี่ยนรูปแบบที่ 1 เพื่อให้ P [p] = c สอดคล้องกับ T [t + 1] = tnew = t + ความยาวของรูปแบบ p - Pnew ความยาวของรูปแบบ = - 1 กรณีที่ 3: ถ้ากรณีที่ 1 และกรณีที่ 2 ไม่สามารถนำมาใช้นั่นหมายความว่าตัวอักษร T [t] ไม่พบในรูปแบบพีในกรณีนี้เราย้ายรูปแบบ 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 - นาที (pIdx, 1 + lastOccur); } อื่น {/ / กรณีที่ 3: ตัวละครที่ไม่พบในรูปแบบสตริงtIdx = tIdx + patternSize; } pIdx = patternSize - 1; ในกรณีของเราเป็น computeBmpLast () ฟังก์ชั่นร้านค้า -1 สำหรับตัวอักษรที่ไม่พบในรูปแบบการค้นหา เราได้อย่างปลอดภัยสามารถผสานกรณีที่ 3 ในรหัสข้างต้นเพื่อดูราวกับ// กระโดดตัวอักษร Heuristics int lastOccur = bmpLast [ข้อความ [tIdx]]; tIdx = tIdx + patternSize - นาที (pIdx, 1 + lastOccur); pIdx = patternSize - 1 ; ตัวอย่าง: รหัส Complete ตัวอย่าง#ifndef _PatternMatcher_H_ #define _PatternMatcher_H_ #include #include #include ใช้ STD namespace; ชั้น PatternMatcher { สาธารณะ: int คง bmpSearch (สตริง const & ข้อความสตริง const และรูปแบบ); ส่วนตัว: คงเวกเตอร์ computeBmpLast (สตริง const และรูปแบบ) ; PatternMatcher (); PatternMatcher (const PatternMatcher &); const PatternMatcher ดำเนินการ = (const PatternMatcher &); }; #endif // _ PatternMatcher_H_ #include "PatternMatcher.h" #include ใช้ STD namespace; int PatternMatcher :: bmpSearch (STD const :: สตริงและข้อความ const มาตรฐาน :: สตริงและรูปแบบ) { size_t Textsize = text.size (); size_t patternSize = pattern.size (); ถ้า (Textsize == 0 || patternSize == 0) { -1 กลับ; } ถ้า ( patternSize> Textsize) { -1 กลับ; } เวกเตอร์ bmpLast = computeBmpLast (รูปแบบ); size_t tIdx = patternSize - 1; size_t pIdx = patternSize - 1; ในขณะที่ (tIdx <Textsize) { ถ้า (รูปแบบ [pIdx] ข้อความ == [tIdx ]) { ถ้า (pIdx == 0) {// พบการแข่งขันผลตอบแทน tIdx; } tIdx--; pIdx--; } อื่น { // ตัวละครกระโดด Heuristics int lastOccur = bmpLast [ข้อความ [tIdx]]; tIdx = tIdx + patternSize - นาที (pIdx, 1 + lastOccur); pIdx = patternSize - 1; } } ผลตอบแทน - 1; } เวกเตอร์ PatternMatcher :: computeBmpLast (STD const :: สตริงและรูปแบบ) { const size_t NUM_ASCII_CHARS = 128; เวกเตอร์ bmpLast (NUM_ASCII_CHARS) ; for (size_t i = 0; i <NUM_ASCII_CHARS; i ++) { bmpLast [i] = -1; } สำหรับ (size_t i = 0; i <pattern.size (); i ++) { bmpLast [รูปแบบ [i]] = ฉัน; } กลับ bmpLast; } # include "PatternMatcher h " int main () { ศาล


























































































































































การแปล กรุณารอสักครู่..
ผลลัพธ์ (ไทย) 3:[สำเนา]
คัดลอก!
ขั้นตอนวิธีอัลกอริทึม
Boyer Boyer มัวร์มัวร์เป็นหนึ่งในที่เร็วที่สุดในรูปแบบการค้นหาขั้นตอนวิธีขึ้นอยู่กับสองเทคนิคที่ใช้เทคนิค :


1 กระจกแบบที่คุณหารูปแบบ P ในข้อความทีขยับถอยหลังผ่าน P , เริ่มต้นที่จุดสิ้นสุดของมัน .
2 ตัวกระโดดแบบเมื่อไม่ตรงกันเกิดขึ้นระหว่างตัวอักษรที่ตำแหน่งข้อความ [ T ] = c

สามกรณีจะตรวจสอบในการสั่งซื้อสำหรับการคำนวณตัวกระโดด ก่อนที่จะย้ายในการเข้าใจแต่ละกรณี ให้เราเข้าใจการคำนวณการเกิดตำแหน่งสุดท้ายในรูปแบบ String


สุดท้ายคอมพิวเตอร์ล่าสุดที่เกิดขึ้นจากการเกิดวิธีอนุมานว่าตัวละครทั้งหมดภายใต้การพิจารณาเป็น ASCII อักขระฟังก์ชันคำนวณเหตุการณ์สุดท้ายของตัวละครทั้งหมด นำเสนอในรูปแบบ P เริ่มจากซ้าย ส่วนที่เหลือของตัวอักษร ASCII ส่งกลับ - 1

พิจารณาอักขระ ASCII เซต { A , B , C , D , . . . , Y , Z } ล่าสุดที่เกิดขึ้นฟังก์ชันจะคำนวณตามที่แสดงในรูปด้านล่าง


ฟังก์ชัน f ( x ) จุดสุดท้ายที่เกิดขึ้นของตัวอักษรในรูปแบบ P

computebmplast ( Const std : :รูปแบบสตริง& ) {
Const size_t num_ascii_chars = 128 ;
เวกเตอร์ bmplast ( num_ascii_chars ) ;

( size_t ฉัน = 0 ; i < num_ascii_chars ; I ) {
bmplast [ i ] = - 1 ;
}

( size_t ฉัน = 0 ; i < รูปแบบ size() ; I ) {
bmplast [ รูปแบบ [ I ] ] = I ;
}
กลับ bmplast ;
}


ตัวละครกระโดดฮิวริสติกกรณี 1 :

ตัวอักษรที่ไม่ตรงกันเกิดขึ้นที่สถานที่ที่ t [ t ] = ' x ' ตัว ' X ' พบด้านซ้ายของตัวอักษร P [ P ] = ' C ' หรือ 1 F ( t [ t ] ) หน้าในแนวสถานการณ์นี้ไม่ได้ โดยการย้ายรูปแบบที่เหมาะสมบนพื้นฐาน สุดท้ายที่เกิดขึ้น ตรงนี้เราเปลี่ยนแบบแผนโดย 1 ดังนั้น P [ P ] = C ลูกค้าด้วย T [ ] T 1 =


ทีนิว = ความยาวของ P
t รูปแบบจำกัดpnew = ความยาวของรูปแบบ และกรณีที่ 3 1


ถ้าเป็นกรณีที่ 1 และกรณีที่ 2 ไม่สามารถใช้ นั่นหมายความว่า ตัว t [ t ] ไม่พบในรูปแบบหน้า ในกรณีนี้เราย้ายรูปแบบ P เพื่อให้ p [ 0 ] = x จัดเองด้วย T [ ] T 1 =

= ความยาวของรูปแบบทีนิว T
pnew = ความยาวของรูปแบบ– 1

/ / ตัวละครกระโดดฮิวริสติก
Int lastoccur = bmplast [ ข้อความ [ tidx ] ] ;
( ถ้า lastoccur ! 1 ) {
= -ถ้า ( pidx > lastoccur ) { / / กรณีที่ 1 : เหตุการณ์สุดท้ายของ char คือซ้ายหรือเท่ากับตรงกันจุด
tidx = tidx patternsize ( 1 lastoccur ) ;
pidx patternsize = - 1 ; } อื่น { / /

กรณีที่ 2 เหตุการณ์สุดท้ายของ char คือด้านขวาของจุดที่ไม่ตรงกัน
tidx = tidx patternsize - ( pidx ) ;
pidx patternsize = - 1 ;
} {

} อื่นๆ / / กรณีที่ 3 ตัวละครที่ไม่พบในรูปแบบ String
tidx = tidx patternsize ;
pidx patternsize = - 1 ;
}
รวมกรณีที่ 1 และกรณีที่ 2 ในข้างต้นรหัส

/ / ตัวละครกระโดดฮิวริสติก
Int lastoccur = bmplast [ ข้อความ [ tidx ] ] ;
( ถ้า lastoccur ! = - 1 ) {
tidx = tidx patternsize - มิน ( pidx 1 lastoccur ) ; } อื่น { / /

กรณีที่ 3 ตัวละครที่ไม่พบในรูปแบบ String
tidx = tidx patternsize ;
}

patternsize pidx = - 1 ;ในกรณีของเราเป็นร้านค้าฟังก์ชัน computebmplast() - 1 สำหรับตัวอักษรที่ไม่พบในรูปแบบการค้นหา . เราสามารถรวมกรณี 3 ในข้างต้นรหัสดู

/ / ตัวละครกระโดดฮิวริสติก
Int lastoccur = bmplast [ ข้อความ [ tidx ] ] ;
tidx = tidx patternsize - มิน ( pidx 1 lastoccur ) ;
pidx patternsize = - 1 ; ตัวอย่าง

:



เสร็จรหัส ตัวอย่าง

# ifndef _patternmatcher_h_

_patternmatcher_h_ #กําหนด#รวม
#รวมถึง#รวมถึงใช้ namespace std

;
ชั้น patternmatcher {

bmpsearch int สาธารณะคงที่ ( & Const สตริงข้อความสตริงรูปแบบ Const & ) ;

ส่วนตัว :
computebmplast เวกเตอร์คงที่ ( Const สตริง&รูปแบบ ) ;

patternmatcher() ;
patternmatcher ( Const patternmatcher
& ) Const patternmatcher &โอเปอเรเตอร์ = ( Const patternmatcher & ) ;
} ;
/ /
#จบถ้า _patternmatcher_h_ #รวมถึง " patternmatcher . H "
#รวม

ใช้ namespace std ;
1 patternmatcher : : bmpsearch ( Const std : : &สตริงข้อความ , Const std : : สาย&รูปแบบ ) {
size_t textsize = ข้อความ size() ;
รูปแบบ size_t patternsize = . size() ;
( ถ้า textsize = = 0 | | patternsize = = 0 ) {
กลับ - 1 ;
}
ถ้า ( patternsize > textsize ) {

} กลับ - 1 ;

เวกเตอร์ bmplast = computebmplast ( รูปแบบ ) ;
size_t patternsize tidx = - 1 ;
size_t patternsize pidx = - 1 ;
ในขณะที่ ( tidx < textsize ) {
ถ้า ( รูปแบบ [ pidx ] = = ข้อความ [ tidx ] ) {
ถ้า ( pidx = = 0 ) { / / หาคู่
กลับ tidx ;
}

pidx tidx -- ; -- ;
} {

อีก / / อักขระอักษร
Int lastoccur กระโดด = bmplast [ ข้อความ [ tidx ] ] ;
tidx = tidx patternsize - มิน ( pidx 1 lastoccur ) ;
pidx patternsize = - 1 ;
}
}
กลับ - 1 ;
}

เวกเตอร์ patternmatcher : : computebmplast ( Const std : : สาย&รูปแบบ ) {
Const size_t num_ascii_chars = 128 ;
เวกเตอร์ bmplast ( num_ascii_chars ) ;
( size_t ฉัน = 0 ; i < num_ascii_chars ; I ) {
bmplast [ i ] = - 1 ;
}
( size_t ฉัน = 0 ; i < รูปแบบ size() ; I ) {
bmplast [ รูปแบบ [ I ] ] = I ;
}
กลับ bmplast ;
}
#รวมถึง " patternmatcher . H "

! {
main() เคาท์
การแปล กรุณารอสักครู่..
 
ภาษาอื่น ๆ
การสนับสนุนเครื่องมือแปลภาษา: กรีก, กันนาดา, กาลิเชียน, คลิงออน, คอร์สิกา, คาซัค, คาตาลัน, คินยารวันดา, คีร์กิซ, คุชราต, จอร์เจีย, จีน, จีนดั้งเดิม, ชวา, ชิเชวา, ซามัว, ซีบัวโน, ซุนดา, ซูลู, ญี่ปุ่น, ดัตช์, ตรวจหาภาษา, ตุรกี, ทมิฬ, ทาจิก, ทาทาร์, นอร์เวย์, บอสเนีย, บัลแกเรีย, บาสก์, ปัญจาป, ฝรั่งเศส, พาชตู, ฟริเชียน, ฟินแลนด์, ฟิลิปปินส์, ภาษาอินโดนีเซี, มองโกเลีย, มัลทีส, มาซีโดเนีย, มาราฐี, มาลากาซี, มาลายาลัม, มาเลย์, ม้ง, ยิดดิช, ยูเครน, รัสเซีย, ละติน, ลักเซมเบิร์ก, ลัตเวีย, ลาว, ลิทัวเนีย, สวาฮิลี, สวีเดน, สิงหล, สินธี, สเปน, สโลวัก, สโลวีเนีย, อังกฤษ, อัมฮาริก, อาร์เซอร์ไบจัน, อาร์เมเนีย, อาหรับ, อิกโบ, อิตาลี, อุยกูร์, อุสเบกิสถาน, อูรดู, ฮังการี, ฮัวซา, ฮาวาย, ฮินดี, ฮีบรู, เกลิกสกอต, เกาหลี, เขมร, เคิร์ด, เช็ก, เซอร์เบียน, เซโซโท, เดนมาร์ก, เตลูกู, เติร์กเมน, เนปาล, เบงกอล, เบลารุส, เปอร์เซีย, เมารี, เมียนมา (พม่า), เยอรมัน, เวลส์, เวียดนาม, เอสเปอแรนโต, เอสโทเนีย, เฮติครีโอล, แอฟริกา, แอลเบเนีย, โคซา, โครเอเชีย, โชนา, โซมาลี, โปรตุเกส, โปแลนด์, โยรูบา, โรมาเนีย, โอเดีย (โอริยา), ไทย, ไอซ์แลนด์, ไอร์แลนด์, การแปลภาษา.

Copyright ©2024 I Love Translation. All reserved.

E-mail: