C++ 我的Boyer-Moore算法只搜索文本文件中的前3000个字符

C++ 我的Boyer-Moore算法只搜索文本文件中的前3000个字符,c++,text-files,boyer-moore,C++,Text Files,Boyer Moore,我正在尝试实现一个Boyer-Moore字符串搜索算法。在某种程度上,搜索算法本身似乎运行良好。它打印出所有出现的内容,直到到达3300个字符的区域,然后不再进一步搜索。 我不确定这是否与文本文件太大而无法放入字符串有关,或者与其他完全不同的内容有关。当我尝试打印包含文本文件的字符串时,它也会删除前185122个字符。作为参考,文本文件是指环王:指环团契-长度为1016844个字符。 以下是我的代码供参考: #include <fstream> #include <iostre

我正在尝试实现一个Boyer-Moore字符串搜索算法。在某种程度上,搜索算法本身似乎运行良好。它打印出所有出现的内容,直到到达3300个字符的区域,然后不再进一步搜索。 我不确定这是否与文本文件太大而无法放入字符串有关,或者与其他完全不同的内容有关。当我尝试打印包含文本文件的字符串时,它也会删除前185122个字符。作为参考,文本文件是指环王:指环团契-长度为1016844个字符。 以下是我的代码供参考:

#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
编译将是一个很好的下一步。