ФЕДЕРАЛЬНОЕ АГЕНТСТВО СВЯЗИ
ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ОБРАЗОВАНИЯ
«САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ ТЕЛЕКОММУНИКАЦИЙ ИМ. ПРОФ. М.А. БОНЧ-БРУЕВИЧА»
(СПбГУТ)
Факультет инфокоммуникационных Сетей и систем (иксс)
кафедра программной инженерии и вычислительной техники (пиивт)
Лабораторная работа №2.
«Методы поиска: поиск подстроки»
Дисциплина: «Алгоритмы и Структуры Данных»
Выполнили: Студент группы ИКПИ-32 Максим Яковлев
Принял: к.т.н., доцент кафедры ПИиВТ
Дагаев А.В.
Постановка задачи
Изучить и практически сравнить эффективность различных алгоритмов поиска подстроки. Целью является подтверждение теоретических оценок временной сложности алгоритмов и выявление их практических преимуществ.
Алгоритм Кнута-Морриса-Пратта
Алгоритм Кнута-Морриса-Пратта (в дальнейшем КМП) основывается на том, что после частичного совпадения начальной части подстроки с соответствующими символами строки фактически известна пройденная часть строки, и можно вычислить некоторые сведения, с помощью которых затем быстро продвинуться по строке. Сдвиг подстроки выполняется не на один символ на каждом шаге алгоритма, а на некоторое переменное количество символов, что вычисляется заранее префикс-функцией для подстроки. В процессе работы префикс-функции сравниваются префиксы и суффиксы подстроки, вычисляя необходимый сдвиг – максимальная длина совпадающих префикса и суффикса. Стоит отметить, что суффикс и префикс могут пересекаться. В процессе поиска и при обнаружении несовпадения, обращение происходит за индексом префикс-функции последнего совпавшего элемента подстроки.
Пример работы
Дана подстрока ABCABD. Вычислим для неё префикс-функцию, сравнивая префиксы и суффиксы, записывая полученные значения в отдельный целочисленный одномерный массив. Покажем на таблице 1.
Подстрока: АВСАВD |
|
|
|
|
Префикс-функция: |
"000120" |
|
|
|
Текст для поиска: |
ABCABCAABCABD |
|
|
|
Процесс поиска: |
Шаг 1 |
ABCABCAABCABD |
|
|
|
|
Шаг 2 |
ABCABCAABCABD |
|
|
|
Шаг 3 |
ABCABCAABCABD |
|
|
|
Шаг 4 |
ABCABCAABCABD |
|
|
|
|
|
|
Шаг |
Сравниваемые строки |
Несовпадение на элементе |
Значение префикс-функции предыдущего элемента |
Сдвиг подстроки |
1 |
ABCABD и ABCABC |
5 |
2 |
На 2 элемента влево |
2 |
ABCABD и ABCAAB |
4 |
1 |
На 1 элемент влево |
3 |
ABCABD и AABCAB |
1 |
0 |
Без сдвига |
4 |
ABCABD и ABCABD |
- |
- |
Подстрока найдена |
Таблица 1. Метод Кнута-Морриса-Пратта
Для 0 элемента подстроки значение всегда равно 0.
Для 1 элемента подстроки сравним префикс (желтый) и суффикс (зеленый). ABCABD – совпадения нет, значение равно 0.
Для 2 элемента подстроки: ABCABD. Не забываем, что префикс и суффикс могут пересекаться, однако, АB не равняется BC. Совпадения нет, значение = 0.
Для 3 элемента подстроки: ABCABD. Совпадение есть, сравнение дальше: ABCABD. Совпадения нет, при дальнейшем сравнении тоже, значение = 1.
Для 4 элемента подстроки: ABCABD. Не совпадает, сравнение дальше: ABCABD. Совпадают 2 элемента, при дальнейшем сравнении перемен не будет, значение = 2.
Для 5 элемента подстроки: ABCABD. Совпадения нет, при дальнейшем сравнении тоже, значение = 0.
В итоге, для ABCABD массив значений префикс-функции выглядит следующим образом: 000120.
После этого осуществляется сам поиск подстроки в строке ABCABCAABCABD. На первом шаге сравнивается ABCABD и ABCABC. Не совпадает элемент 5. Значение префикс-функции для предыдущего элемента = 2. Переносим всю подстроку вправо так, что она будет начинаться на 2 элемента левее места несовпадения, т.е., сдвигая на 2 элемента влево.
На втором шаге сравнивается ABCABD и ABCAAB. Не совпадает элемент 4. Значение префикс-функции для предыдущего элемента = 1. Переносим всю строку вправо так, что она будет начинаться на 1 элемент левее места несовпадения, т.е., сдвигая на 1 элемент влево.
На третьем шаге сравнивается ABCABD и AABCAB. Несовпадение на элементе 1. Значение префикс-функции для предыдущего элемента = 0. Переносим всю строку вправо так, что она будет начинаться на месте несовпадения, т.е., без сдвига.
На четвертом шаге сравнивается ABCABD и ABCABD. Совпадение, подстрока найдена.
