У меня немного проблем с реализацией алгоритма BMH в C ++.
Вот код:
#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]];
}
}
Это работает для большинства примеров, но есть некоторые примеры, которые не работают (только те, которые я нашел до сих пор, являются огромными тестами, загруженными из разных источников).
Я хотел бы знать, где / что я делаю неправильно (я действительно не хочу код).
Редактировать: Из-за комментариев
Есть ли у вас какие-либо идеи, как я мог бы заставить этот алгоритм работать быстрее, не реализуя его полную версию Бойера-Мура?
Порядок испытаний в
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]];
пропускается в соответствии с символом, который не должен существовать (если конец шаблона выровнен с концом текста).
Других решений пока нет …