2009-05-08 1 views
4

Для алгоритма Бойера-Мура, который должен быть наихудшим линейным, вычисление таблицы неверного соответствия должно быть O (m). Тем не менее, наивная реализация будет проходить через все суффиксы O (m) и все позиции в том, что суффикс может пойти и проверить равенство ... что равно O (m)!Вычисление второй таблицы с неверным совпадением в алгоритме поиска строк Бойер-Мура

Ниже представлена ​​наивная реализация table building algorithm. Итак, этот вопрос становится следующим: Как я могу улучшить время выполнения этого алгоритма до O (m)?

def find(s, sub, no): 
    n = len(s) 
    m = len(sub) 

    for i in range(n, 0, -1): 
     if s[max(i-m, 0): i] == sub[max(0, m-i):] and \ 
      (i-m < 1 or s[i-m-1] != no): 
      return n-i 

    return n 

def table(s): 
    m = len(s) 
    b = [0]*m 

    for i in range(m): 
     b[i] = find(s, s[m-i:], s[m-i-1]) 

    return b 

print(table('anpanman')) 

Чтобы умы в состоянии покоя, это не домашнее задание. Я добавлю изменения, когда кто-нибудь опубликует идеи для улучшений.

+0

Для начала используйте xrange (n, 0, -1) и xrange (m) вместо диапазона() ... он сохраняет бит памяти –

+0

Фактически, код выше - Python 3. См. Http://docs.python.org/dev/py3k/library/functions.html?highlight=range#range – 2009-05-08 19:32:58

+0

Как насчет выполнения реализации из LiteratePrograms? Похоже, он делает меньше предварительной обработки, но я не эксперт Бойер-Мура. http://en.literateprograms.org/Boyer-Moore_string_search_algorithm_(Python) – hao

ответ

1

Код в разделе «Предварительная обработка для эвристики хорошего суффикса» на this page строит таблицу хорошего суффикса в O (n) времени. Он также объясняет, как работает код.

+0

Спасибо. Миссия выполнена. – 2009-05-09 20:03:41

Смежные вопросы