
Тема 3 (семестр 3).pptx
- Количество слайдов: 23
Лекция 3 А. Ф. ЗУБАИРОВ
Поиск подстрок
Поиск подстрок Если образец p встречается в тексте t со сдвигом s, s – допустимый сдвиг. Задача поиска подстрок – поиск всех допустимых сдвигов. Текст t Образец p a b c a b a c
Линейный (прямой) поиск образца a c a s=0 a a b a c a a b s=2 a b c a s=3 a a a s=1 c b c a a b
Линейный (прямой) поиск образца Алгоритм установить длины n и m, s = 0. пока s < n-m если p[1. . m] == t[s+1. . s+m] s – допустимый сдвиг конец если конец пока Данный алгоритм является неэффективным, т. к. информация о тексте, полученная для одного значения s, полностью игнорируется при рассмотрении других значений s.
Алгоритм Рабина-Карпа В основе алгоритма Рабина-Карпа лежит линейный поиск (последовательно проверяются подстроки с s=0 до n-m). Однако Для сравнения строк используются не символы, их составляющие, а сигнатуры строк. Сигнатура – определенное «замещающее» представление строки, удовлетворяющее следующим требованиям: должна быть малая вероятность того, разные строки имеют одинаковую сигнатуру (малая вероятность возникновения коллизий); сигнатуру можно эффективно вычислить; сигнатуру можно вычислить на основе другой сигнатуры. В случае, если значения сигнатуры образца и подстроки текста совпадают, осуществляется посимвольное сравнение подстрок (возможны коллизии).
Алгоритм Рабина-Карпа Сигнатуры – целочисленная хеш-функция, вычисленная на основе букв строки. Целью является уменьшение времени вычисления хеш-функции, т. к. вычисление после каждого сдвига хеш-суммы для символов s+1. . s+m. Кольцевой хеш— хеш-функция, обрабатывающая вход в рамках некоторого окна. Для пересчета значения при сдвигании окна требуется знать лишь предыдущее значение хеша; значение входных данных, которые остались за пределами окна; значение данных, которые попали в окно.
Кольцевой хеш a b r a c a d a b r a
Кольцевой хеш
Алгоритм Рабина-Карпа Алгоритм установить длины n и m, s = 0. вычислить hp = h(p[1. . m]) пока s < n-m вычислить ht = h(t[s+1. . s+m]) если hp == ht если p[1. . m] == t[s+1. . s+m] s – допустимый сдвиг конец если конец пока Данный алгоритм уступает более совершенным алгоритмам поиска при поиске одиночного образца. Однако при поиске множества образцов имеет хорошее быстродействие.
Алгоритм Кнута-Морриса-Пратта Основная идея алгоритма КМП заключается в последовательном сдвиге образца p вдоль текста t и в сравнении его с просматриваемым участком текста. Однако сдвиг осуществляется не на 1 позицию, а на число позиций, среди которых гарантированно отсутствует допустимый сдвиг s.
Префиксная функция для образца Текст t b a c b a a b a Образец p a c b a b a c a a b c b a a b a c a Текст t Образец p b a c a b
Префиксная функция для образца pq (p 5) pk (p 3) a b a
Префиксная функция для образца 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 a b c d a b s c a b c d a b i a 0 0 1 2 3 4 5 6 0 1
Префиксная функция для образца
Алгоритм КМП
Алгоритм Бойера-Мура
Алгоритм Бойера-Мура
Алгоритм Бойера-Мура установить длины n и m, s = 0. вычислить delta 1 вычислить delta 2 пока s < n-m j = m пока j > 0 и p[j] = t[s + j] j = j – 1 конец пока если j = 0, тогда s – допустимый сдвиг s = s + delta[0] иначе s = s + max(delta 2[j], j – delta 1[t[s + j]]) конеч если конец пока
Стоп-символ, соответствующий данному сдвигу образца – первый справа символ в тексте, отличный от соответствующего символа в образце. Эвристика стоп-символа предлагает попробовать новое значение сдвига, исходя из того, где в образце встречается стоп-символ. Текст t b a c a Образец p a c a d a a b c b a
В случае, если при поиске обнаружилось совпадение фрагмента, являющего суффиксом образца, эвристика безопасного суффикса определяет, какой сдвиг можно выполнить, чтобы не пропустить возможные допустимые сдвиги. Эвристика безопасного суффикса схожа по смысле с использованием префикс-функции в алгоритме КМП. Текст t g f n j r j k Образец p r j k j r j k b a
Алгоритм вычислить префикс-функцию pi для образца p вычислить префикс-функцию pi_inv для инвертированного образца p установить m для j от 0 до m delta 2[j] = m – pi[m] конец для l от 1 до m j = m – pi_inv[l] если delta 2[j] > l – pi_inv[l], тогда delta 2[j] = l – pi_inv[l] конец для
Тема 3 (семестр 3).pptx