Ускорьте реализацию поиска строк Бойера-Мура-Хорспула

У меня немного проблем с реализацией алгоритма 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]];
}
}

Это работает для большинства примеров, но есть некоторые примеры, которые не работают (только те, которые я нашел до сих пор, являются огромными тестами, загруженными из разных источников).

Я хотел бы знать, где / что я делаю неправильно (я действительно не хочу код).

Редактировать: Из-за комментариев

Есть ли у вас какие-либо идеи, как я мог бы заставить этот алгоритм работать быстрее, не реализуя его полную версию Бойера-Мура?

-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]];

пропускается в соответствии с символом, который не должен существовать (если конец шаблона выровнен с концом текста).

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]