Поиск назад с Бойер-Мур-Хорспул - PullRequest
0 голосов
/ 09 мая 2018

Я реализовал алгоритм поиска Бойера-Мура-Хорспула, и он отлично работает, когда я хочу искать вперед в моем тексте. Я пытаюсь адаптировать его для работы в обратном направлении, и, похоже, не могу понять это правильно.

Есть ли пример поиска в обратном направлении с использованием BMH?

Для справки вот мой код:

POSITION_T cDocument::FindNext(std::string needle, POSITION_T start)
{
    size_t buffersize = mBuffer.GetByteSize() ;
    size_t needlesize = needle.length() ;
    vector<int> badchars(256, -1) ;

    BadCharHueristic(needle, badchars) ;

    size_t s = mBuffer.ConvertPositionToByte(start) ;
    while(s <= (buffersize - needlesize))
    {
        ssize_t j = needlesize - 1 ;

        while(j >= 0 && needle[j] == mBuffer.GetByte(s + j))
        {
            j-- ;
        }

        if(j < 0)
        {
            // s holds our position in bytes
            return mBuffer.ConvertByteToPosition(s) ;
        }
        else
        {
            ssize_t b = j - badchars[mBuffer.GetByte(s + j)] ;
            s += Max(1, b) ;
        }
    }

    return GetTextSize() ;
}
...