C++ 我的Boyer-Moore算法只搜索文本文件中的前3000个字符
我正在尝试实现一个Boyer-Moore字符串搜索算法。在某种程度上,搜索算法本身似乎运行良好。它打印出所有出现的内容,直到到达3300个字符的区域,然后不再进一步搜索。 我不确定这是否与文本文件太大而无法放入字符串有关,或者与其他完全不同的内容有关。当我尝试打印包含文本文件的字符串时,它也会删除前185122个字符。作为参考,文本文件是指环王:指环团契-长度为1016844个字符。 以下是我的代码供参考:C++ 我的Boyer-Moore算法只搜索文本文件中的前3000个字符,c++,text-files,boyer-moore,C++,Text Files,Boyer Moore,我正在尝试实现一个Boyer-Moore字符串搜索算法。在某种程度上,搜索算法本身似乎运行良好。它打印出所有出现的内容,直到到达3300个字符的区域,然后不再进一步搜索。 我不确定这是否与文本文件太大而无法放入字符串有关,或者与其他完全不同的内容有关。当我尝试打印包含文本文件的字符串时,它也会删除前185122个字符。作为参考,文本文件是指环王:指环团契-长度为1016844个字符。 以下是我的代码供参考: #include <fstream> #include <iostre
#include <fstream>
#include <iostream>
#include <algorithm>
#include <vector>
#include <chrono>
using namespace std;
# define number_chars 256
typedef std::chrono::steady_clock clocktime;
void boyer_moore(string text, string pattern, int textlength, int patlength) {
clocktime::time_point start = clocktime::now();
vector<int> indexes;
int chars[number_chars];
for (int i = 0; i < number_chars; i++) {
chars[i] = -1;
}
for (int i = 0; i < patlength; i++) {
chars[(int)pattern[i]] = i;
}
int shift = 0;
while (shift <= (textlength - patlength)) {
int j = patlength - 1;
while (j >= 0 && pattern[j] == text[shift + j]) {
j--;
}
if (j < 0) {
indexes.push_back(shift);
if (shift + patlength < textlength) {
shift += patlength - chars[text[shift + patlength]];
}
else {
shift += 1;
}
}
else {
shift += max(1, j - chars[text[shift + j]]);
}
}
clocktime::time_point end = clocktime::now();
auto time_taken = chrono::duration_cast<chrono::milliseconds>(end - start).count();
for (int in : indexes) {
cout << in << endl;
}
}
int main() {
ifstream myFile;
//https://www.kaggle.com/ashishsinhaiitr/lord-of-the-rings-text/version/1#01%20-%20The%20Fellowship%20Of%20The%20Ring.txt
myFile.open("lotr.txt");
if (!myFile) {
cout << "no text file found";
}
string text((istreambuf_iterator<char>(myFile)), (istreambuf_iterator<char>()));
cout << text;
string pattern;
cin >> pattern;
int n = text.size();
int m = pattern.size();
boyer_moore(text, pattern, n, m);
}
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
#定义数字字符256
typedef std::chrono::稳定时钟时钟时间;
void boyer_moore(字符串文本、字符串模式、int textlength、int patlength){
时钟时间::时间点开始=时钟时间::现在();
向量索引;
整数字符[数字字符];
对于(int i=0;i 你能不能在调试器中一步一步地检查代码,特别注意shift
?@Shawn我现在看了一下-我注意到函数结束前的shift值是一个非常大的数字,但我不确定为什么,准确地说是85899651516。这可能与ASCII与Unicode有关吗?我倾向于作为第一个猜测,我们怀疑它被设置为某个随机值,例如,因为数组访问超出了边界。运行valgrind
或使用-fsanize=address
编译将是一个很好的下一步。