加快Boyer-Moore-Horspool字符串搜索的实施

时间:2013-01-16 19:22:56

标签: c++ algorithm implementation string-search boyer-moore

我在C ++中实现BMH算法时遇到了一些麻烦。

以下是代码:

#define Nm 2000005
int D[256];
char To[Nm],P[Nm],*T;
int Tl,Pl;
int cont;
void initialize_Lenght()
{
    Tl=strlen(To);
    Pl=strlen(P);
    T=To;
}
void compute_D()
{
    for(int i=0;i<256;i++)
        D[i]=Pl;
    for(int i=0;i<Pl;i++)
        D[P[i]]=Pl-i;
}
void Boyer_Moore()
{
    int i;

    while ( Tl>=Pl )    
    {
        for(i=Pl-1;T[i]==P[i]&&i>=0;i--)
            if(i==0)
            {
                if(cont<1000)
                    v[cont]=(T-To); // I also have to store the first 1000 values 
                cont++;
            }
            Tl -= D[T[i+1]];
            T += D[T[i+1]];
    }
}

它适用于大多数示例,但有些示例不起作用(到目前为止我发现的只是从不同来源下载的大量测试)。

我想知道我在哪里/做错了什么(我真的不想要代码)。

修改:由于评论

你是否知道如何在不实施完整的Boyer-Moore版本的情况下让这个算法运行得更快?

1 个答案:

答案 0 :(得分:1)

中的测试顺序
for(i=Pl-1;T[i]==P[i]&&i>=0;i--)

错了。完成匹配后,您需要先将T[-1]P[-1]进行比较,然后再检查索引是否可以接受。

如果最后一个模式字符出现不匹配,

Tl -= D[T[i+1]];
T += D[T[i+1]];

根据不存在的字符跳过(如果图案末尾与文本末尾对齐)。