Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Подготовка к экзамену.docx
Скачиваний:
1
Добавлен:
06.10.2025
Размер:
600.54 Кб
Скачать

3. Поиск подстроки в строке: основные понятия (постановка задачи, алфавит, цепочки). Простой поиск.

Поиск подстроки в строке (String searching algorithm) — класс алгоритмов над строками, которые позволяют найти паттерн (pattern) в тексте (text).

Формальный язык — множество конечных слов (строк, цепочек) над конечным алфавитом.

Алфавит формального языка — множество атомарных (неделимых) символов какого-либо формального языка (иногда их называют буквами по аналогии с алфавитами естественных языков или символами).

Простой поиск подстроки в строке. Суть алгоритма простого поиска состоит в последовательном переборе с последующим сравнением символов строки и образца.

Переменная i отвечает за сдвиг образца на один символ на каждой итерации. Внутренний цикл проверяет совпадение символа строки с индексом i + j и символа образца с индексом j. Если символы не совпадают, тогда внутренний цикл прекращает работу. Оговоримся, что если алгоритм отрабатывает все итерации, то переменная цикла будет равна значению правой границы указанного как N. В таком случае, если длина образца и переменной равны, то это будет означать, что внутренний цикл не нашёл разных символов, а значит подстрока найдена, а индексом начала подстроки является переменная i. В противном случае внешний цикл продолжает работу.

Сложность такого поиска будет O(N * M), где N — длина строки S, а M — образца P.

4. Поиск подстроки в строке: основные понятия (постановка задачи, алфавит, цепочки). Алгоритм Рабина-Карпа.

Поиск подстроки в строке (String searching algorithm) — класс алгоритмов над строками, которые позволяют найти паттерн (pattern) в тексте (text).

Формальный язык — множество конечных слов (строк, цепочек) над конечным алфавитом.

Алфавит формального языка — множество атомарных (неделимых) символов какого-либо формального языка (иногда их называют буквами по аналогии с алфавитами естественных языков или символами).

Алгоритм Рабина — Карпа старается уменьшить количество проверок во внутреннем цикле простого поиска за счёт использования хэш-функции. Хэш-функция в данном случае преобразовывает исходную строку в числовое значение. Само преобразование называется хэшированием и в общем может выполняться не только для строк, но и для произвольного массива данных, а выходным значением является битовый массив заданной длины.

При сдвиге образца на один символ значение хэш-функции для подстроки будет меняться как «минус предыдущий элемент, плюс следующий». Заранее посчитав значение хэш-функции для образца и пользуясь предложенной хэш-функцией при сдвиге образца, мы каждый раз сравниваем сами значения получаемых хэш-функций. Если они совпадают, то нам нужно уже проверить строки посимвольно и, если они полностью совпали, то ответ получен (сравнивать необходимо из-за возможности коллизий).

5. Поиск подстроки в строке. Алгоритм Кнута-Мориса-Пратта

Поиск подстроки в строке (String searching algorithm) — класс алгоритмов над строками, которые позволяют найти паттерн (pattern) в тексте (text).

Алгоритм Кнута, Морриса и Пратта (КМП-алгоритм) является самым эффективным, т.к. работает за линейное время. Основой алгоритма является определение префикс-функции. Префикс-функция π(S,i) вычисляет длину наибольшего собственного (т.е. не равного самой подстроке) префикса совпадающего с суффиксом этой подстроки.

Основным отличием алгоритма Кнута, Морриса и Пратта от алгоритма прямого поиска заключается в том, что сдвиг подстроки выполняется не на один символ на каждом шаге алгоритма, а на некоторое переменное количество символов. Следовательно, перед тем как осуществлять очередной сдвиг, необходимо определить величину сдвига. Для повышения эффективности алгоритма необходимо, чтобы сдвиг на каждом шаге был бы как можно большим.

Если для произвольной подстроки определить все ее начала, одновременно являющиеся ее концами, и выбрать из них самую длинную (не считая, конечно, саму строку), то такую процедуру принято называть префикс-функцией. В реализации алгоритма Кнута, Морриса и Пратта используется предобработка искомой подстроки, которая заключается в создании префикс-функции на ее основе. При этом используется следующая идея: если префикс (он же суффикс) строки длиной i длиннее одного символа, то он одновременно и префикс подстроки длиной i-1. Таким образом, проверяем префикс предыдущей подстроки, если же тот не подходит, то префикс ее префикса, и т.д. Действуя так, находим наибольший искомый префикс.

6. Поиск подстроки в строке. Алгоритм Бойера-Мура

Поиск подстроки в строке (String searching algorithm) — класс алгоритмов над строками, которые позволяют найти паттерн (pattern) в тексте (text).

Алгоритм Бойера-Мура. Идея этого алгоритма заключается в том, что строки можно сравнивать с конца. Это позволит пропускать не 1 символ как в наивном алгоритме, но зачастую сразу всю строку. Это возможно, поскольку в тот момент, когда обнаруживается несовпадающий символ между строкой и образцом, то образец необходимо сдвинуть вправо на столько символов, чтобы несовпадающий символ строки теперь совпал с символом образца. Если такого символа в образце нет, то строка сдвигается полностью.

Для составления таблицы используется следующее правило: значение для символа равно максимальному индексу этого элемента в образце (исключая последний символ, для него и всех других значение равно количеству символов в образце).

Эффективность поиска в таком алгоритме достигает O(N + M).

7. Линейные структуры данных. Списки. Динамический массив

Линейные структуры — это упорядоченные структуры, в которых адрес элемента однозначно определяется его номером.

Линейных структуры данных обладают следующими свойствами:

  • Каждый элемент имеет не более 1 предшественника

  • Два разных элемента не могут иметь одинакового последователя

К линейным структурам данным можно отнести:

  • Массивы

  • Динамические массивы

  • Связный список

  • Стек

  • Очередь

  • Дек

  • Хэш-таблица

Связный список – это разновидность линейных структур данных, представляющая собой последовательность элементов, обычно отсортированную в соответствии с заданным правилом. Последовательность может содержать любое количество элементов, поскольку при создании списка используется динамическое распределение памяти. Каждый элемент связного списка представляет собой отдельный объект, содержащий поле для хранения информации и указатель на следующий элемент списка (а в случае двусвязного списка в объекте хранится также указатель на предыдущий элемент).

добавлениеи удаление индекс

динамический массив

оценка времени

Массив – одна из простейших и наиболее широко применяемых в компьютерных программах линейных структур данных. В любом языке программирования массивы имеют несколько общих свойств:

+

  • Содержимое массива хранится в непрерывной области памяти.

  • Все элементы массива имеют одинаковый тип; поэтому массивы называют однородными структурами данных.

  • Существует прямой доступ к элементам массива.

Соседние файлы в предмете Алгоритмы и системы данных