同一图案多次出现的Horspool算法 我在C++中实现了HOOSPOL算法(依赖于由ANNEL列维京,第二版,第258页介绍的算法的设计和分析)来查找文本中所希望的模式的第一次出现的位置。但是,我想扩展该算法以查找相同模式的多个实例。不幸的是,我被后一种实现卡住了。您可以在下面看到我的代码:

同一图案多次出现的Horspool算法 我在C++中实现了HOOSPOL算法(依赖于由ANNEL列维京,第二版,第258页介绍的算法的设计和分析)来查找文本中所希望的模式的第一次出现的位置。但是,我想扩展该算法以查找相同模式的多个实例。不幸的是,我被后一种实现卡住了。您可以在下面看到我的代码:,c++,string,C++,String,该函数计算并返回所需图案在文本中第一次出现的位置。移位大小存储在移位表中,移位表由所需字母表的字符索引。此外,整数计数器用于计算模式字符和文本字符之间的总比较。计数器最初有一个零值。我如何扩展它以找到相同模式的多个事件 我尝试在main()函数的主体中执行以下操作,但它虽然有效,但效率不高。如果遇到第一次出现的图案,将打印其位置,并删除以第一次出现的图案结尾的文本部分。此外,程序将检查剩余文本的模式等 int counter=0; while ((position = Find(pattern,

该函数计算并返回所需图案在文本中第一次出现的位置。移位大小存储在移位表中,移位表由所需字母表的字符索引。此外,整数计数器用于计算模式字符和文本字符之间的总比较。计数器最初有一个零值。我如何扩展它以找到相同模式的多个事件

我尝试在main()函数的主体中执行以下操作,但它虽然有效,但效率不高。如果遇到第一次出现的图案,将打印其位置,并删除以第一次出现的图案结尾的文本部分。此外,程序将检查剩余文本的模式等

int counter=0;
while ((position = Find(pattern,text,ShiftTable,counter)) != -1) {
    cout << position << endl;
    text = text.erase(0,result+m);
}
int计数器=0;
while((位置=查找(模式、文本、可移位、计数器))!=-1){

cout当前您总是从最开始(
i=m-1
)开始。如果您想继续以前的搜索,只需从最后一个开始的位置通过即可

在下面的例子中,我删除了
计数器
变量–这有什么用

int Find(string pattern, string text, int *ShiftTable, int start = 0)
……还有

i = start + m - 1,
…只需按如下方式调用代码:

while ((position = Find(pattern,text,ShiftTable,position)) != -1)  {
    cout << position << endl;
    ++position;
}
while((位置=查找(模式、文本、移位表、位置))!=-1){

cout“我已经删除了计数器变量–这有什么用?”猜测:将真实的例子与理论上的最坏情况进行比较。这就是我使用它的目的。康拉德·鲁道夫:非常感谢你的帮助!它现在运行得很好。-)丹尼尔·菲舍尔:是的,我知道它可能看起来很琐碎,但它必须成为我的程序的一部分,以便记录一些统计结果。@Stavros,你误解了。我命令的第一部分nt是引用康拉德的回答。我猜你用计数器是为了-正确,似乎是:)。我也经常用计数器。哦,对不起。我完全误解了。:-@丹尼尔现在看起来很明显。是的。