Скачиваний:
0
Добавлен:
02.11.2025
Размер:
88.69 Кб
Скачать

ФЕДЕРАЛЬНОЕ АГЕНТСТВО СВЯЗИ

ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ОБРАЗОВАНИЯ

«САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ ТЕЛЕКОММУНИКАЦИЙ ИМ. ПРОФ. М.А. БОНЧ-БРУЕВИЧА»

(СПбГУТ)

Факультет инфокоммуникационных Сетей и систем (иксс)

кафедра программной инженерии и вычислительной техники (пиивт)

Лабораторная работа №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. Совпадение, подстрока найдена.