Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Data Structures and Algorithms in C++ 2e (На ру...docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
2.37 Mб
Скачать

Глава 12. Последовательности и динамическое программирование

Мы фактически представили упрощенную версию Boyer Moore (BM) al -

gorithm. Оригинальный алгоритм BM достигает продолжительности O (n + m +|S ) при помощи

альтернативное изменение, эвристическое к частично подобранной текстовой строке, каждый раз, когда это переходит

образец больше, чем эвристический скачок характера. Это альтернативное эвристическое изменение основано на применении главной идеи от Knuth-Morris-Pratt алгоритма соответствия образца, который мы обсуждаем затем.

12.3.3 Knuth-Morris-Pratt алгоритм

В изучении исполнения худшего случая «в лоб» и алгоритмов соответствия образца BM на определенных случаях проблемы, такой как тот данный в Примере 12.4, мы должны заметить главную неэффективность. Определенно, мы можем выполнить много compar-isons, проверяя потенциальное размещение образца против текста, все же если мы обнаруживаем характер образца, который не совпадает по тексту, тогда мы выбрасываем всю информацию, полученную этими сравнениями, и начинаем снова с нуля со следующего возрастающего размещения образца. Knuth-Morris-Pratt (или «KMP») алгоритм, обсужденный в этой секции, избегает этой траты информации и, в, так сделайте - луг, это достигает продолжительности O (n + m), который оптимален в худшем случае. Таким образом, в худшем случае любой алгоритм соответствия образца должен будет исследовать все знаки текста и все знаки образца, по крайней мере, однажды.

Функция неудачи

Главная идея алгоритма KMP состоит в том, чтобы предварительно обработать последовательность образца P, чтобы вычислить функцию неудачи, f, который указывает на надлежащее изменение P так, чтобы до самой большой возможной степени мы могли снова использовать ранее выполненные сравнения. Спец - ically, функция неудачи f (j) определена как длина самого длинного префикса P, который является суффиксом P [1.. j] (отмечают, что мы не помещали P [0.. j] здесь). Мы также используем соглашение что f (0) = 0. Позже, мы обсуждаем, как вычислить функцию неудачи эффективно. Важность этой функции неудачи состоит в том, что она «кодирует» повторенные подстроки в самом образце.

Пример 12.5: Полагайте, что образец натягивает P = «abacab» от Примера 12.4. Функция неудачи Knuth-Morris-Pratt (KMP), f (j), для последовательности P находится как показано в следующей таблице:

j

0

1

2

3

4

5

P [j]

a

b

a

c

a

b

f (j)

0

0

1

0

1

2

12.3. Алгоритмы соответствия образца 571

Алгоритм соответствия образца KMP, показанный в Кодовом Фрагменте 12.6, incre-

мысленно обрабатывает текстовую строку T сравнение, это к образцу натягивает P. Каждый раз есть матч, мы увеличиваем текущие индексы. С другой стороны, если есть несоответствие, и мы ранее сделали успехи в P, тогда мы консультируемся с функцией неудачи, чтобы определить новый индекс в P, где мы должны продолжить проверять P против T. Иначе (было несоответствие, и мы в начале P), мы просто увеличиваем индекс для T (и держим переменную индекса для P в начинающиеся - ning). Мы повторяем этот процесс, пока мы не находим матч P в T, или индекс для T достигает n, длины T (указание, что мы не находили образец P в T).

Алгоритм KMPMatch (T, P):

Вход: Последовательности T (текст) с n знаками и P (образец) с m Продукцией знаков: Стартовый индекс первой подстроки T соответствие P или признак

это P не является подстрокой T

f ¬ KMPFailureFunction(P)

i¬0 j¬0

в то время как я <n делаю

если P [j] = T [я] тогда

если j = m- 1 тогда

возвратитесь i- m + 1 я¬ i+1 j¬ j+1

строят функцию неудачи f для P

матч!

еще, если j> 0никакой матч, но мы продвинулись в P тогда

j¬ f (j- 1) j индексы сразу после префикса P, который должен соответствовать

еще

я¬ i+1

возвратитесь «Нет никакой подстроки T соответствия P.»

Кодовый Фрагмент 12.6: алгоритм соответствия образца KMP.

Главная часть алгоритма KMP, в то время как петля, которая выполняет com-баночку между характером в T и характером в P каждое повторение. В зависимости от результата этого сравнения, алгоритм или шаги следующим знакам в T и P, консультируется с функцией неудачи для нового характера кандидата в P или начинается со следующего индекса в T. Правильность этого алгоритма следует из определения функции неудачи. Любые сравнения, которые пропущены, являются ac-, tually ненужным, поскольку функция неудачи гарантирует, что все проигнорированные compar-isons избыточны - они включили бы сравнение тех же самых знаков соответствия снова.