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: [สำเนา]
คัดลอก!
ขั้นตอนวิธีการขั้นตอนวิธีการบอยเยอร์มัวร์
บอยเยอร์มัวร์เป็นหนึ่งในรูปแบบการค้นหาวิธีที่เร็วที่สุดที่ขึ้นอยู่กับสองเทคนิค:

เทคนิคที่ใช้
1 เทคนิคกระจกมองที่คุณพบว่ามีรูปแบบพีทีในข้อความโดยการย้ายไปข้างหลังด้วย p เริ่มต้นที่จะเป็นจุดสิ้นสุด.
2 ตัวละครของฮิวริสติกระโดดเมื่อไม่ตรงกันเกิดขึ้นระหว่างตัวละครที่ข้อความตำแหน่ง [t] = c

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

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

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


ฟังก์ชั่น f (x) จุดที่จะต้องเกิดขึ้นที่ผ่านมาของตัวละครในรูปแบบพี

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

for (size_t i = 0; ฉัน bmplast [i] = -1;}
​​

for (size_t i = 0; ฉัน bmplast [รูปแบบ [i]] = i;}

กลับ bmplast;}



วิเคราะห์พฤติกรรมตัวละครกระโดด

กรณีที่ 1:
ตัวละครที่ไม่ตรงกันเกิดขึ้นสถานที่ t [t] = 'x' และตัวอักษร 'x' จะพบว่าด้านซ้ายของหน้าตัวละคร [p] = 'c' หรือ 1 f (ที [t]) <= พี ในกรณีนี้รูปแบบการย้ายพีไปทางขวาเพื่อจัดเกิดขึ้นล่าสุดของ x ในพีด้วย x ในที

tnew = ความยาวของเสื้อลาย - (1 เกิดขึ้นล่าสุดของ 'x' ในรูปแบบ)
pNew = ความยาวของรูปแบบ - 1

กรณีที่ 2:
ตัวละครที่ไม่ตรงกันเกิดขึ้นสถานที่ t [t] = 'x' และตัวอักษร 'x' พบที่ด้านขวาของตัวละครพี [p] = 'c' หรือ 1 f (ที [t])> พี ในการจัดตำแหน่งสถานการณ์นี้เป็นไปไม่ได้โดยการย้ายรูปแบบไปทางด้านขวาบนพื้นฐานของการเกิดที่ผ่านมา ที่นี่เราเปลี่ยนรูปแบบ 1 เพื่อว่า p [p] c = สอดคล้องกับเสื้อ [t 1] = ความยาว


tnew t = รูปแบบ - พี
pNew = ความยาวของรูปแบบ - 1

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


tnew t = รูปแบบของ pNew
= ความยาวของรูปแบบ - 1

/ / ตัวละครกระโดด วิเคราะห์พฤติกรรม
int lastoccur = bmplast [ข้อความ [tidx]];
ถ้า (! lastoccur = -1) {
ถ้า (PIDX> lastoccur) {/ / กรณีที่ 1: การเกิดขึ้นล่าสุดของถ่านเป็นไปซ้ายหรือเท่ากับจุดที่ไม่ตรงกัน
tidx = tidx patternsize - (1 lastoccur);
PIDX = patternsize - 1;}
​​
else {/ / กรณีที่ 2: การเกิดขึ้นล่าสุดของถ่านจะอยู่ทางขวาของจุดที่ไม่ตรงกัน
tidx = patternsize tidx - (PIDX);
PIDX = patternsize - 1;}
​​

} else {/ / กรณีที่ 3: ตัวละครจะไม่พบในรูปแบบ สตริง
tidx = tidx patternsize;
PIDX = patternsize - 1;}
​​
รวมกรณีที่ 1 และกรณีที่ 2 ในรหัสดังกล่าววิเคราะห์พฤติกรรมกระโดด

/ / ตัวละคร
int lastoccur = bmplast [ข้อความ [tidx]];
ถ้า (lastoccur = -1) {
tidx = tidx patternsize - นาที (PIDX 1 lastoccur);}

else {/ / กรณีที่ 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_
#กำหนด _patternmatcher_h_

รวมถึง##รวมถึง

#รวมถึงการใช้ namespace std;
ชั้น patternmatcher {
สาธารณะ:
คง bmpsearch (ข้อความ const สตริง&, const สตริงรูปแบบ&) int;

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

patternmatcher ();
patternmatcher (const patternmatcher &);
const patternmatcher &ดำเนินการ = (const patternmatcher &);}

# endif / / _patternmatcher_h_
# ได้แก่ "patternmatcher.h"
#รวมถึง

โดยใช้ namespace std;

int patternmatcher :: bmpsearch (const std :: สตริง&ข้อความ const std :: สตริง&รูปแบบ) {
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 ถ้า (รูปแบบ [PIDX] == ข้อความ [tidx]) {
ถ้า (PIDX == 0) {/ / พบ การแข่งขัน
กลับ tidx;}

tidx -;
PIDX -;}

อื่น {
/ / ตัวละครกระโดดวิเคราะห์พฤติกรรม
int lastoccur = bmplast [ข้อความ [tidx]];
tidx = tidx patternsize - นาที (PIDX 1 lastoccur);
PIDX = patternsize - 1;}
​​

} กลับ - 1;}
​​

เวกเตอร์ patternmatcher :: computebmplast (const std :: สตริงรูปแบบ&) {
num_ascii_chars size_t const = 128;
เวกเตอร์ bmplast (num_ascii_chars);
for (size_t i = 0; ฉัน bmplast [i] = -1;}
​​
for (size_t i = 0; ฉัน bmplast [รูปแบบ [i]] = i;}

กลับ bmplast;}

# ได้แก่ "patternmatcher.h"

int หลัก () {ศาล <<
patternmatcher :: bmpsearch
("abacaabaccabacabaabb", "abacab")
<< endl; ศาล <<
patternmatcher :: bmpsearch
("abacaabaccabacabaabb", "baabb")
<< endl; ศาล <<
patternmatcher :: bmpsearch
("abacaabaccabacabaabb" "abacad")
<< endl; ศาล <<
patternmatcher :: bmpsearch
("abacaabaccabacabaabb", "abacaab")
<< endl; ศาล <<
patternmatcher :: bmpsearch
("abacaabaccabacabaabb", "abacab" )
<< endl; ศาล <<
patternmatcher ::bmpsearch
("abacaabaccabacabaabb", "aabaccaba")
<< endl; ศาล <<
patternmatcher :: bmpsearch
("abacaabaccabacabaabb", "abacaabaccabacabaabb")
<< endl; ศาล <<
patternmatcher :: bmpsearch
(" abacaabaccabacabaabb "," ")
<< endl; ศาล <<
patternmatcher :: bmpsearch
(" "," abacaabaccabacabaabb ")
<< endl; ศาล <<
patternmatcher :: bmpsearch
(" abacaabaccabacabaabb "," bacaabaccabacabaab " )
<< endl;
ศาล << patternmatcher :: bmpsearch
("abacaabaccabacabaabb", "abacaabac")
<< endl; ศาล <<
patternmatcher :: bmpsearch
("abacaabaccabacabaabb", "ccabacabaabb")
<< endl; ศาล <<
patternmatcher :: bmpsearch
("abacaabaccabacabaabb", "bacaabaccabacabaabb")
<< endl;

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

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

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

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

พิจารณาชุดอักขระ ASCII { a, b, c, d,..., y, z } แล้วจะคำนวณฟังก์ชันเกิดขึ้นสุดท้ายเหมือนในภาพด้านล่าง


f(x) ฟังก์ชันจุดสุดท้ายของอักขระในรูปแบบ P

computeBmpLast(const std::สตริ &pattern) {
ค่า const size_t NUM_ASCII_CHARS = 128;
เวกเตอร์ bmpLast(NUM_ASCII_CHARS);

สำหรับ (size_t ฉัน = 0 ฉัน < NUM_ASCII_CHARS ฉัน) {
bmpLast [i] = -1;
}

สำหรับ (size_t ฉัน = 0 ฉัน < pattern.size() ) {
bmpLast [รูปแบบ [i]] =ฉัน;
}
กลับ bmpLast;
}


รุกข้ามอักขระ

1 กรณี:
อักขระที่ไม่ตรงกันเกิดขึ้นที่ตำแหน่ง T [t] = 'x' และอักขระ 'x' อยู่ทางซ้ายของอักขระ P [p] = 1 หรือ f(T[t]) 'c' < = 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 [p] = c จัดด้วย [t 1] =เป็น


tnew = t ความยาวของรูป – p
pnew =ความยาวของรูป – 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 string& ข้อความ รูปแบบ string& ค่า const);

ส่วนตัว:
computeBmpLast เวกเตอร์คง < int > (ลาย string& ค่า const);

PatternMatcher();
PatternMatcher(const PatternMatcher&);
ค่า const PatternMatcher& ตัว =(const PatternMatcher&);
};
#endif //_PatternMatcher_H_
#include " PatternMatcher.h"
#include

ใช้ namespace มาตรฐาน;

int PatternMatcher::bmpSearch (ค่า const std::string &text, &pattern std::string ค่า const) {
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-;
}
อื่น {
//Character รุกข้าม
int lastOccur = bmpLast [ข้อความ [tIdx]];
tIdx = tIdx patternSize - นาที < int > (pIdx, 1 lastOccur);
pIdx = patternSize - 1;
}
}
คืน - 1;
}

เวกเตอร์ PatternMatcher::computeBmpLast (ค่า const std::string &pattern) {
ค่า const size_t NUM_ASCII_CHARS = 128;
เวกเตอร์ bmpLast(NUM_ASCII_CHARS);
สำหรับ (size_t ฉัน = 0 ฉัน < NUM_ASCII_CHARS ฉัน) {
bmpLast [i] = -1;
}
สำหรับ (size_t ฉัน = 0 ฉัน < pattern.size() ) {
bmpLast [รูปแบบ [i]] =ฉัน;
}
กลับ bmpLast;
}
#include " PatternMatcher.h"

int main() {
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;
}
การแปล กรุณารอสักครู่..
ผลลัพธ์ (ไทย) 3:[สำเนา]
คัดลอก!
อัลกอริธึม 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 ;
}
การแปล กรุณารอสักครู่..
 
ภาษาอื่น ๆ
การสนับสนุนเครื่องมือแปลภาษา: กรีก, กันนาดา, กาลิเชียน, คลิงออน, คอร์สิกา, คาซัค, คาตาลัน, คินยารวันดา, คีร์กิซ, คุชราต, จอร์เจีย, จีน, จีนดั้งเดิม, ชวา, ชิเชวา, ซามัว, ซีบัวโน, ซุนดา, ซูลู, ญี่ปุ่น, ดัตช์, ตรวจหาภาษา, ตุรกี, ทมิฬ, ทาจิก, ทาทาร์, นอร์เวย์, บอสเนีย, บัลแกเรีย, บาสก์, ปัญจาป, ฝรั่งเศส, พาชตู, ฟริเชียน, ฟินแลนด์, ฟิลิปปินส์, ภาษาอินโดนีเซี, มองโกเลีย, มัลทีส, มาซีโดเนีย, มาราฐี, มาลากาซี, มาลายาลัม, มาเลย์, ม้ง, ยิดดิช, ยูเครน, รัสเซีย, ละติน, ลักเซมเบิร์ก, ลัตเวีย, ลาว, ลิทัวเนีย, สวาฮิลี, สวีเดน, สิงหล, สินธี, สเปน, สโลวัก, สโลวีเนีย, อังกฤษ, อัมฮาริก, อาร์เซอร์ไบจัน, อาร์เมเนีย, อาหรับ, อิกโบ, อิตาลี, อุยกูร์, อุสเบกิสถาน, อูรดู, ฮังการี, ฮัวซา, ฮาวาย, ฮินดี, ฮีบรู, เกลิกสกอต, เกาหลี, เขมร, เคิร์ด, เช็ก, เซอร์เบียน, เซโซโท, เดนมาร์ก, เตลูกู, เติร์กเมน, เนปาล, เบงกอล, เบลารุส, เปอร์เซีย, เมารี, เมียนมา (พม่า), เยอรมัน, เวลส์, เวียดนาม, เอสเปอแรนโต, เอสโทเนีย, เฮติครีโอล, แอฟริกา, แอลเบเนีย, โคซา, โครเอเชีย, โชนา, โซมาลี, โปรตุเกส, โปแลนด์, โยรูบา, โรมาเนีย, โอเดีย (โอริยา), ไทย, ไอซ์แลนด์, ไอร์แลนด์, การแปลภาษา.

Copyright ©2024 I Love Translation. All reserved.

E-mail: