Скачать презентацию Алгоритмы на строках и их применение Склеил и Скачать презентацию Алгоритмы на строках и их применение Склеил и

алгоритмы на строках.pptx

  • Количество слайдов: 18

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

А точнее алгоритм Z-функция А точнее алгоритм Z-функция

Асимптотика алгоритма Весь алгоритм вычисления Z-функции выполняется за линейное время. Получаем сложность O(n) Асимптотика алгоритма Весь алгоритм вычисления Z-функции выполняется за линейное время. Получаем сложность O(n)

Z-функция строки и её вычисление Пусть дана строка длины. Тогда Z-функция ( Z-функция строки и её вычисление Пусть дана строка длины. Тогда Z-функция ("зетфункция") от этой строки — это массив длины , iый элемент которого равен наибольшему числу символов, начиная с позиции , совпадающих с первыми символами строки. Иными словами, — это наибольший общий префикс строки и её -го суффикса.

Примеры построения Z-функции “aaaaa” z={0; 4; 3; 2; 1} “aaabaab” z={0; 2; 1; 0} Примеры построения Z-функции “aaaaa” z={0; 4; 3; 2; 1} “aaabaab” z={0; 2; 1; 0} “abacaba” z={0; 0; 1; 0; 3; 0; 1}

Тривиальный алгоритм Слишком прост в реализации и обладает сложностью O(n^2). Тривиальный алгоритм Слишком прост в реализации и обладает сложностью O(n^2).

Эффективный алгоритм вычисления Z-функции Чтобы получить эффективный алгоритм, будем вычислять значения z[i] по очереди Эффективный алгоритм вычисления Z-функции Чтобы получить эффективный алгоритм, будем вычислять значения z[i] по очереди -от i =1 до n 1 , и при этом постараемся при вычислении очередного значения z[i] максимально использовать уже вычисленные значения.

 Назовём для краткости подстроку, совпадающую с префиксом строки s , отрезком совпадения. Например, Назовём для краткости подстроку, совпадающую с префиксом строки s , отрезком совпадения. Например, значение искомой Z-функции z[i]— это длиннейший отрезок совпадения, начинающийся в позиции i (и заканчиваться он будет в позиции i+z[i]-1 ).

 Для этого будем поддерживать координаты [l, r] самого правого отрезка совпадения, т. е. Для этого будем поддерживать координаты [l, r] самого правого отрезка совпадения, т. е. из всех обнаруженных отрезков будем хранить тот, который оканчивается правее всего. В некотором смысле, индекс r — это такая граница, до которой наша строка уже была просканирована алгоритмом, а всё остальное — пока ещё не известно.

Шаг 1 Разберем строку “aaabaca” Шаг 1 Разберем строку “aaabaca”

Шаг 2 Разберем строку “aaabaca” 0 2 1 0 0 Шаг 2 Разберем строку “aaabaca” 0 2 1 0 0

Шаг 3 Разберем строку “aaabaca” 0 2 1 0 0 Шаг 3 Разберем строку “aaabaca” 0 2 1 0 0

Шаг 4 Разберем строку “aaabaca” 0 2 1 0 0 Шаг 4 Разберем строку “aaabaca” 0 2 1 0 0

Шаг 5 Разберем строку “aaabaca” 0 2 1 0 0 Шаг 5 Разберем строку “aaabaca” 0 2 1 0 0

Шаг 5 Разберем строку “aaabaca” 0 2 1 0 1 Шаг 5 Разберем строку “aaabaca” 0 2 1 0 1

Реализация vector<int> z_function(string s) { int n = (int)s. length(); vector<int> z(n); for (int Реализация vector z_function(string s) { int n = (int)s. length(); vector z(n); for (int i = 1, l = 0, r = 0; i r) l = i, r = i + z[i] - 1; } return z; }

Применения Поиск подстроки в строке Количество различных подстрок в строке Сжатие строки Применения Поиск подстроки в строке Количество различных подстрок в строке Сжатие строки

Задачи в online judges Список задач, которые можно решить, используя Z-функцию: UVA #455 Задачи в online judges Список задач, которые можно решить, используя Z-функцию: UVA #455 "Periodic Strings" [сложность: средняя] UVA #11022 "String Factoring" [сложность: средняя]