Вам бонус- начислено 1 монета за дневную активность. Сейчас у вас 1 монета

Суффструктуры- Суффиксный массив, суффиксное дерево NP-трудные задачи

Лекция



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

суффструктуры

Суффструктуры - это структуры представления суффиксов строк, примерами таких структур являются суффиксерк дерево и суффиксны массив, Используются в алгоритмах поиска подстроки в строке, определении схожести строк и других.

Рассмотрим эти структуры подробнее.

суффиксное дерево

Суффиксное дерево — бор, содержащий все суффиксы некоторой строки (и только их). Позволяет выяснять, входит ли строка w в исходную строку t, за время O(|w|), где |w| — длина строки w.

Основные определения и описание структуры

Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи — непустое конечное множество символов, называемое алфавитом. Последовательность символов (возможно, пустая) из алфавита обозначается буквами r, s и t.Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи представляет собой перевернутую строку. Отдельные символы обозначаются буквами x, y или z. Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи — пустая строка. Символами из алфавита являются буквы a, b, …. Пока размер алфавита принимается постоянным. |t| обозначает длину строки t. Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи — все строки длины m, Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи и Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи.

Префикс w строки t — строка такая, что wv = t для некоторой (возможно, пустой) строки v. Префикс называется собственным, если |v| Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи 0.

Суффикс w строки t — строка такая, что vw = t для некоторой (возможно, пустой) строки v. Суффикс называется собственным, если |v| Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи 0. Например, для строки «substring» подстрока «sub» является собственным префиксом, «ring» — собственным суффиксом.

Подстрока w строки t называется правым ветвлением, если t может быть представлена как Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи и Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи для некоторых строк Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи и Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи, а также букв x Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи y. Левое ветвление определяется аналогично. Например, для «eabceeabcd» подстрока «abc» является правым ветвлением, так как в обоих ее вхождениях в t справа от нее стоят различные символы, зато та же подстрока не является левым ветвлением, потому что слева от нее в обоих вхождениях стоит одинаковый символ «e».

Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи-дерево T — корневое дерево с ребрами, помеченными последовательностями из Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи. Для каждого символа a из алфавита каждый узел в дереве T имеет не более одного ребра, метка которого начинается c символа a. Ребро от t до s с меткой v мы будем обозначать Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи.

Пусть k — узел Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи-дерева T, тогда path(k) — строка, которая представляет собой конкатенацию всех меток ребер от корня до k. Мы назовем Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи местоположением w, для которого path(Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи) = w.

Так как каждая ветвь уникальна, если path(t) = w, мы можем обозначить узел t за Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи. Поддерево узла Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи обозначаетсяСуффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи.

Слова, которые представлены в Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи-дереве T, задаются множеством, которое обозначается words(T). Слово w входит во множество words(T) тогда и только тогда, когда существует строка v (возможно, пустая) такая, что Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи — узел дерева T.

Если строка w входит в words(T), w = uv, Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи — узел дерева T, пару Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи будем называть ссылочной парой w по отношению к дереву T. Если u — наидлиннейший префикс такой, что Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи — ссылочная пара, мы будем называть Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи канонической ссылочной парой. Тогда мы будем писать Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи. Местоположение Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи называется явным, если |v| = 0, и неявным в противном случае.

Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи-дерево T, в котором каждое ребро помечено одиночным символом, называется атомарным (для него каждое местоположение является явным). Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи-дерево T, в котором каждый узел является либо корнем, либо листом или узлом ветвления, называется компактным.

Атомарное Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи-дерево также называют Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи (луч). Атомарное и компактное Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи-дерево однозначно определены словами, которые они содержат.

Суффиксное дерево для строки t — это Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи-дерево такое, что words(T) = {w| w — подслово t}. Для строки t атомарное суффиксное дерево обозначается ast(t), компактное суффиксное дерево обозначается cst(t).

Обратное префиксное дерево строки t — это суффиксное дерево для строки Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи.

Вложенный суффикс — суффикс, который входит в строку t где-нибудь еще. Наидлиннейший вложенный суффикс называется активным суффиксом строки t.

Свойства суффиксных деревьев

Лемма. Местоположение w явно в компактном суффиксном дереве тогда и только тогда, когда w является не вложенным суффиксом t или w — правое ветвление.

Доказательство. Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи. Если Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи явно, то это может быть либо лист, либо вершина ветвления или корень (в этом случае Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи и w — вложенный суффикс t).

Если Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи — лист, тогда также является и суффиксом t. Значит, это должен быть не вложенный суффикс, так как иначе он появился бы где-нибудь еще в строке t: Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи v — суффикс t такой, что w — префикс v. Этот узел не может быть листом.

Если Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи — узел ветвления, тогда должны существовать, по меньшей мере, два выходящих ребра из Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи с различными метками. Это означает, что существуют два различных суффикса u, v, что w — префикс u и w — префикс v, где v = wxs, u = Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи, x Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи. Следовательно, w — правое ветвление.

Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи. Если w является не вложенным суффиксом t, это должен быть лист. Если w — правое ветвление, то имеются два суффикса u и v, u = wxs, v = Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи, x Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи, тогда w является узлом ветвления. Лемма доказана.

Теперь легко видеть, почему ответ на вопрос, входит ли слово w в строку t, может быть найден за время O(|w|): нужно только проверить, является ли w местоположением (явным или неявным) в cst(t).

Метки ребер должны представлять собой указатели на положение в строке, чтобы суффиксное дерево расходовало память размером O(n). Метка (p, q) ребра означает подстроку Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи или пустую строку, если p > q.

Укконен вводит название открытые ребра для ребер, заканчивающихся в листьях. Пометки открытых ребер записывают как (p, Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи) вместо (p, |t|), где Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи — длина, всегда большая, чем |t|.

Пусть TСуффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи-дерево. ПустьСуффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи — узел T, v — наидлиннейший суффикс w такой, что Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи — также узел T. Непомеченное ребро от Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи до Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи называется суффиксным звеном. Если v = w, оно называется атомарным.

Утверждение. В ast(t) и cst(t$), где $ Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи t, все суффиксные звенья являются атомарными.

Доказательство. Символ $ называется символом-стражем. Первая часть (для ast(t)) следует из определения, так как местоположения являются явными. Для доказательства второй (случай cst(t)) части мы должны показать, что для каждого узла Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи также является узлом cst(t). Если Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи — узел cst(t), то является либо листом, либо узлом ветвления. Если является листом, тогда aw — не вложенный суффикс t. Благодаря символу-стражу, из леммы следует, что все суффиксы (включая корень, пустой суффикс) являются явными, так как только корень — вложенный суффикс. Поэтому w является листом или корнем. Если Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи — узел ветвления, тогда aw — правое ветвление, как и w. Следовательно, местоположение Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи явно по лемме. Утверждение доказано.

Как следует из этого доказательства, символ-страж гарантирует существование листьев для всех суффиксов. С таким символом не может быть вложенных суффиксов, кроме пустого. Если мы опустим символ-страж, некоторые суффиксы могут стать вложенными, и их местоположения станут неявными.

Требования суффиксного дерева к памяти

Утверждение. Компактное суффиксное дерево может быть представлено в виде, требующем O(n) памяти.

Доказательство. Суффиксное дерево содержит не более одного листа на каждый суффикс (в точности один с символом-стражем). Каждый внутренний узел должен быть узлом ветвления, следовательно, внутренний узел имеет по меньшей мере двух потомков. Каждое ветвление увеличивает число листьев по меньшей мере на единицу, поэтому мы имеем не более n внутренних узлов и не более n листьев.

Для представления строк, являющихся метками ребер, мы используем индексацию в исходной строке, как описано выше. Каждый узел имеет не более одного предка и, таким образом, общее число ребер не превышает 2n.

Аналогично, каждый узел имеет не более одного суффиксного звена, тогда общее число суффиксных звеньев также ограничено числом 2n. Утверждение доказано.

Как пример суффиксного дерева с 2n-1 вершинами можно рассмотреть дерево для слова Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи. Размер атомарного суффиксного дерева для строки t составляет O(Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи).

Построение дерева за линейное время. Алгоритм mcc. (McCreight’s Algorithm)

Алгоритм mcc начинает работу с пустого дерева и добавляет суффиксы начиная с самого длинного. Алгоритм mcc не является on-line алгоритмом, то есть для его работы необходима вся строка целиком. Об этом говорит сайт https://intellect.icu . Для корректной работы требуется, чтобы строка завершалась специальным символом, отличным от других, так, чтобы ни один суффикс не являлся префиксом другого суффикса. Каждому суффиксу в дереве будет соответствовать лист. Для алгоритма мы определимСуффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи — текущий суффикс (на шаге Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи), Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи (голова) — наибольший префикс суффикса Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи, который является также префиксом другого суффикса Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи, где Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи. Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи (хвост) определим какСуффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи.

Ключевой идеей алгоритма mcc является соотношение между Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи и Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи.

Лемма. ЕслиСуффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи где Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи — буква алфавита, Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи — строка (может быть пустая), тогда Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи — префикс Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи.

Доказательство. Пусть Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи. Тогда существуетСуффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи, Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи, такой, что Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи является как префиксом Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи, так и префиксом Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи. Тогда Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи — префикс Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи и Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи, следовательно,Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи является префиксом головы Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи. Лемма доказана.

Мы знаем местоположение Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи, и если мы будем иметь суффиксное звено, то можем быстро перейти к местоположениюСуффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи — префикса головы Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи без необходимости находить путь от корня дерева. Но местоположение }Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи могло бы не являться явным (если местоположение Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи не было явным на предыдущем шаге) и суффиксное звено могло бы быть еще не установлено для узлаСуффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи. Решение, данное МакКреем, находит узел Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи за два шага: «повторное сканирование» («rescanning») и «сканирование» («scanning»). Мы проходим дерево наверх от узла Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи пока не найдем суффиксное звено, следуем по нему и затем применяем повторное сканирование пути до местоположенияСуффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи (которое является простым, потому что мы знаем длину Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи и это местоположение существует, так что мы не должны читать полные метки ребер, двигаясь вниз по дереву, мы можем просто проверять только начальные буквы и длину слов).

Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи

Рисунок демонстрирует эту идею. Вместо попытки найти путь от корня до узла Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи, алгоритм переходит до Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи, следует суффиксному звену до Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи, проводит повторное сканирование пути до (возможно неявного) местоположения Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи и остается найти путь до Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи, проходя посимвольно.

Алгоритм состоит из трех частей.

1. Сначала он определяет структуру предыдущей головы, находит следующее доступное суффиксное звено и следует по нему.

2. Затем он повторно сканирует часть предыдущей головы, для которой длина является известной (эта часть названа Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи).

3. Наконец алгоритм устанавливает суффиксное звено для Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи, сканирует оставшуюся часть Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи (названнуюСуффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи) и добавляет новый лист для Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи.

Узел ветвления создается во второй фазе повторного сканирования, если не существует местоположения Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи. В этом случае сканирование не является необходимым, потому что если Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи была бы длиннее чем Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи, тогда Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи являлось бы правым ветвлением, но по лемме }Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи является также правым ветвлением, так узел Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи уже должен существовать. Узел создается в третьей фазе, если местоположение Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи еще не явно.

 Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи

Обратите внимание, что если Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи тогда Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи и узнается одинаково быстро, как следуя суффиксному звену согласно строке 7 алгоритма.

Процедура Rescan ищет местоположение Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи. Если местоположение Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи еще не явно, добавляется новый узел. Этот случай имеет место, когда голова ( Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи) просмотрена целиком: если голова длиннее (и узел уже определен), }Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи должно являться префиксом более чем двух суффиксов и также является левым ветвлением Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи. Местоположение Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи может являться только явным, если этот узел уже является узлом ветвления, и если Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи не было левым ветвлением тогда Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи, должно быть, был длиннее, потому что встретился более длинный префикс.

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

 Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи

Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи

Построение дерева за линейное время. Алгоритм ukk.

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

Для алгоритма Укконена нам потребуются

1) Неявные суффиксные деревья 
2) Общее описание алгоритма
3) Оптимизация алгоритма

Неявные суффиксные деревья.

Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи

Суффиксное дерево для строки xabxa$

Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи

Неявное суффиксное дерево для строки xabxa$

Алгоритм Укконена строит последовательность неявных суффиксных деревьев, последнее из которых преобразуется в настоящее суффиксное дерево строки S.

Неявное суффиксное дерево строки S — это дерево, полученное из суффиксного дерева S$ удалением всех вхождений терминального символа $ из меток дуг дерева, удалением после этого дуг без меток и удалением затем вершин, имеющих меньше двух детей. Неявное суффиксное дерево префикса S[l..i] строки S аналогично получается из суффиксного дерева для S[l..i]$ удалением символов $, дуг и вершин, как описано выше.

Неявное суффиксное дерево для любой строки S будет иметь меньше листьев, чем суффиксное дерево для строки S$, в том и только том случае, если хотя бы один из суффиксов S является префиксом другого суффикса. Терминальный символ $ был добавлен к концу S как раз во избежание этой ситуации. В определении настоящего суффиксного дерева это очень важный момент. Однако если S заканчивается символом, который больше нигде в S не появляется, то неявное суффиксное дерево для S будет иметь лист для каждого суффикса и, следовательно, будет настоящим суффиксным деревом.

Хотя неявное суффиксное дерево может иметь листья не для всех суффиксов, в нем закодированы все суффиксы S — каждый произносится символами какого-либо пути от корня этого неявного суффиксного дерева. Однако если этот путь не кончается листом, то не будет маркера, обозначающего конец пути. Таким образом, неявные суффиксные деревья сами по себе несколько менее информативны, чем настоящие. Мы будем использовать их только как вспомогательное средство в алгоритме Укконена, чтобы получить настоящее суффиксное дерево для S.

Общее описание алгоритма.

 Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи

Алгоритм Укконена строит неявное суффиксное дерево Ti для каждого префикса S[l..i] строки S, начиная с T1 и увеличивая i на единицу, пока не будет построено Tm. Настоящее суффиксное дерево для S получается из Tm, и вся работа требует времени О(m). Мы объясним алгоритм Укконена, представив сначала метод, с помощью которого все деревья строятся за время O(m³), а затем оптимизируем реализацию этого метода так, что будет достигнута заявленная скорость.

Три правила продолжения суффикса.

Чтобы превратить это общее описание в алгоритм, мы должны точно указать, как выполнять продолжение суффикса. Пусть S[j..i] = β — суффикс S[1..i]. В продолжении j, когда алгоритм находит конец β в текущем дереве, он продолжает β, чтобы обеспечить присутствие суффикса βS(i + 1) в дереве. Алгоритм действует по одному из следующих трех правил.

Правило 1. В текущем дереве путь β кончается в листе. Это значит, что путь от корня с меткой β доходит до конца некоторой «листовой» дуги (дуги, входящей в лист). При изменении дерева нужно добавить к концу метки этой листовой дуги символ S(i + 1).

Правило 2. Ни один путь из конца строки β не начинается символом S(i + 1), но по крайней мере один начинающийся оттуда путь имеется. В этом случае должна быть создана новая листовая дуга, начинающаяся в конце β, помеченная символом S(i + 1). При этом, если β кончается внутри дуги, должна быть создана новая вершина. Листу в конце новой листовой дуги сопоставляется номер j. Таким образом, в правиле 2 возможно два случая.

Правило 3. Некоторый путь из конца строки β начинается символом S(i + 1). В этом случае строка βS(i + 1) уже имеется в текущем дереве, так что ничего не надо делать (в неявном суффиксном дереве конец суффикса не нужно помечать явно).

суффиксный массив

Суффиксный массив — лексикографически отсортированный массив всех суффиксов строки. Эта структура данных была разработана Джином Майерсом и Уди Манбером как более экономная альтернатива суффиксному дереву с точки зрения необходимой памяти. Она часто применяется там, где необходим быстрый поиск подстрок, например в преобразовании Барроуза — Уилера (BWT), а также в качестве структуры данных в поисковом индексе.

Дана строка Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи длины Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи.

Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи-ым суффиксом строки называется подстрока Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи, Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи.

Тогда суффиксным массивом строки Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи называется перестановка индексов суффиксов Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи, Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи, которая задает порядок суффиксов в порядке лексикографической сортировки. Иными словами, нужно выполнить сортировку всех суффиксов заданной строки.

Например, для строки Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи суффиксный массив будет равен:

Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи

История

В 1989 году Манбер и Майерс опубликовали статью, в которой описали такую структуру данных, как суффиксный массив, и как ее применять для поиска подстрок. Суффиксный массив — это массив лексикографически отсортированных суффиксов строк (если терминология незнакома, то можно глянуть раздел «постановка задачи» в этой статье). Вообще говоря, хранить сами суффиксы смысла нет, достаточно хранить позицию начала данного суффикса, но определение массива так легче воспринимается. Вот пример для строки «mississippi»:

Пример

Рассмотрим строку «abracadabra» длиной 11 символов.

Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи

  

Отсортированный список ее суффиксов:

Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи

  

Суффиксный массив этой строки — {11,8,1,4,6,9,2,5,7,10,3}, потому что суффикс «a» начинается с 11-го знака, суффикс «abra» — с 8-го, и так далее, вплоть до последнего суффикса «racadabra», который начинается с третьего символа исходного слова.

Теперь с помощью этого массива можно легко найти все подстроки. Например, если нужно найти подстроку «ab», достаточно найти все суффиксы, которые начинаются на «ab». За счет сортировки по алфавиту, они находятся рядом друг с другом. Используя бинарный поиск, мы находим 2-й и 3-й суффиксы «abra» и «abracadabra», которым соответствуют 2-й и 3-й элемент суффиксного массива (8 и 1). Это означает, что искомая подстрока «ab» встречается на первом и восьмом символе в исходном слове.

Применения суффструктур

Нахождение наименьшего циклического сдвига строки

Вышеописанный алгоритм производит сортировку циклических сдвигов (если к строке не приписывать доллар), а потому Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи даст искомую позицию наименьшего циклического сдвига. Время работы — Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи.

Поиск подстроки в строке

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

Сравнение двух подстрок строки

Требуется по заданной строке Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи, произведя некоторый ее препроцессинг, научиться за Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи отвечать на запросы сравнения двух произвольных подстрок (т.е. проверка, что первая подстрока равна/меньше/больше второй).

Построим суффиксный массив за Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи, при этом сохраним промежуточные результаты: нам понадобятся массивы Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи от каждой фазы. Поэтому памяти потребуется тоже Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи.

Используя эту информацию, мы можем за Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи сравнивать любые две подстроки длины, равной степени двойки: для этого достаточно сравнить номера классов эквивалентности из соответствующей фазы. Теперь надо обобщить этот способ на подстроки произвольной длины.

Пусть теперь поступил очередной запрос сравнения двух подстрок длины Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи с началами в индексах Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи и Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи. Найдем наибольшую длину блока, помещающегося внутри подстроки такой длины, т.е. наибольшее Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи такое, что Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи. Тогда сравнение двух подстрок можно заменить сравнением двух пар перекрывающихся блоков длины Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи: сначала надо сравнить два блока, начинающихся в позициях Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи и Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи, а при равенстве — сравнить два блока, заканчивающихся в позициях Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи и Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи:

Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи
Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи

Таким образом, реализация получается примерно такой (здесь считается, что вызывающая процедура сама вычисляет Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи, поскольку сделать это за константное время не так легко (по-видимому, быстрее всего — предпосчетом), но в любом случае это не имеет отношения к применению суффиксного массива):

 Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи

Наибольший общий префикс двух подстрок: способ с дополнительной памятью

Требуется по заданной строке Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи, произведя некоторый ее препроцессинг, научиться за Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи отвечать на запросы наибольшего общего префикса (longest common prefix, lcp) для двух произвольных суффиксов с позициями Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи и Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи.

Способ, описываемый здесь, требует Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи дополнительной памяти; другой способ, использующий линейный объем памяти, но неконстантное время ответа на запрос, описан в следующем разделе.

Построим суффиксный массив за Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи, при этом сохраним промежуточные результаты: нам понадобятся массивы Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи от каждой фазы. Поэтому памяти потребуется тоже Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи.

Пусть теперь поступил очередной запрос: пара индексов Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи и Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи. Воспользуемся тем, что мы можем за Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи сравнивать любые две подстроки длины, являющейся степенью двойки. Для этого будем перебирать степень двойки (от большей к меньшей), и для текущей степени проверять: если подстроки такой длины совпадают, то к ответу прибавить эту степень двойки, а наибольший общий префикс продолжим искать справа от одинаковой части, т.е. к Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи и Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи надо прибавить текущую степень двойки.

Реализация:

 Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи

Здесь через Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи обозначена константа, равная логарифму Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи по основанию 2, округленному вниз.

Наибольший общий префикс двух подстрок: способ без дополнительной памяти. Наибольший общий префикс двух соседних суффиксов

Требуется по заданной строке Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи, произведя некоторый ее препроцессинг, научиться отвечать на запросы наибольшего общего префикса (longest common prefix, lcp) для двух произвольных суффиксов с позициями Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи и Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи.

В отличие от предыдущего метода, описываемый здесь будет выполнять препроцессинг строки за Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи времени с Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи памяти. Результатом этого препроцессинга будет являться массив (который сам по себе является важным источником информации о строке, и потому использоваться для решения других задач). Ответы же на запрос будут производиться как результат выполнения запроса RMQ (минимум на отрезке, range minimum query) в этом массиве, поэтому при разных реализациях можно получить как логарифмическое, так и константное времена работы.

Базой для этого алгоритма является следующая идея: найдем каким-нибудь образом наибольшие общие префиксы для каждой соседней в порядке сортировки пары суффиксов. Иными словами, построим массив Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи, где Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи равен наибольшему общему префиксу суффиксов Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи и Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи. Этот массив даст нам ответ для любых двух соседних суффиксов строки. Тогда ответ для любых двух суффиксов, не обязательно соседних, можно получить по этому массиву. В самом деле, пусть поступил запрос с некоторыми номерами суффиксов Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи и Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи. Найдем эти индексы в суффиксном массиве, т.е. пусть Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи и Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи — их позиции в массиве Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи (упорядочим их, т.е. пусть Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи). Тогда ответом на данный запрос будет минимум в массиве Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи, взятый на отрезке Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи. В самом деле, переход от суффикса Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи к суффиксу Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи можно заменить целой цепочкой переходов, начинающейся с суффикса Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи и заканчивающейся в суффиксе Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи, но включающей в себя все промежуточные суффиксы, находящиеся в порядке сортировки между ними.

Таким образом, если мы имеем такой массив Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи, то ответ на любой запрос наибольшего общего префикса сводится к запросу минимума на отрезке массива Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи. Эта классическая задача минимума на отрезке (range minimum query, RMQ) имеет множество решений с различными асимптотиками, описанные здесь.

Итак, основная наша задача — построение этого массива Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи. Строить его мы будем по ходу алгоритма построения суффиксного массива: на каждой текущей итерации будем строить массив Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи для циклических подстрок текущей длины.

После нулевой итерации массив Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи, очевидно, должен быть нулевым.

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

Итак, пусть на текущей итерации алгоритм вычисления суффиксного массива выполнил свою работу, нашел новое значение перестановки Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи подстрок. Будем теперь идти по этому массиву и смотреть пары соседних подстрок: Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи и Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи, Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи. Разбивая каждую подстроку пополам, мы получаем две различных ситуации: 1) первые половинки подстрок в позициях Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи и Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи различаются, и 2) первые половинки совпадают (напомним, такое сравнение можно легко производить, просто сравнивая номера классов Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи с предыдущей итерации). Рассмотрим каждый из этих случаев отдельно.

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

2) Первые половинки совпадали. Тогда вторые половинки могли как совпадать, так и различаться; при этом, если они различаются, то они совсем не обязательно должны были быть соседними на предыдущей итерации. Поэтому в этом случае нет простого способа определить Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи. Для его определения надо поступить так же, как мы и собираемся потом вычислять наибольший общий префикс для любых двух суффиксов: надо выполнить запрос минимума (RMQ) на соответствующем отрезке массива Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи.

Оценим асимптотику такого алгоритма. Как мы видели при разборе этих двух случаев, только второй случай дает увеличение числа классов эквивалентности. Иными словами, можно говорить о том, что каждый новый класс эквивалентности появляется вместе с одним запросом RMQ. Поскольку всего классов эквивалентности может быть до Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи, то и искать минимум мы должны за асимптотику Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи. А для этого надо использовать уже какую-то структуру данных для минимума на отрезке; эту структуру данных надо будет строить заново на каждой итерации (которых всего Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи). Хорошим вариантом структуры данных будет Дерево отрезков: его можно построить за Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи, а потом выполнять запросы за Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи, что как раз и дает нам итоговую асимптотику Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи.

Реализация:

Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи

Здесь помимо массива Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи вводится временный массив Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи с его новым значением. Также поддерживается массив Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи, который для каждой подстроки хранит ее позицию в перестановке Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи. Функция Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи — некоторая функция, строящая структуру данных для минимума по массиву-первому аргументу, размер его передается вторым аргументом. Функция Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи возвращает минимум на отрезке: с первого аргумента по второй включительно.

Из самого алгоритма построения суффиксного массива пришлось только вынести копирование массива Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи, поскольку во время вычисления Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи нам понадобятся старые значения этого массива.

Стоит отметить, что наша реализация находит длину общего префикса для циклических подстрок, в то время как на практике чаще бывает нужной длина общего префикса для суффиксов в их обычном понимании. В этом случае надо просто ограничить значения Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи по окончании работы алгоритма:

 Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи

Для любых двух суффиксов длину их наибольшего общего префикса теперь можно найти как минимум на соответствующем отрезке массива Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи:

 Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи

Количество различных подстрок

Выполним препроцессинг, описанный в предыдущем разделе: за Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи времени и Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи памяти мы для каждой пары соседних в порядке сортировки суффиксов найдем длину их наибольшего общего префикса. Найдем теперь по этой информации количество различных подстрок в строке.

Для этого будем рассматривать, какие новые подстроки начинаются в позиции Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи, затем в позиции Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи, и т.д. Фактически, мы берем очередной в порядке сортировки суффикс и смотрим, какие его префиксы дают новые подстроки. Тем самым мы, очевидно, не упустим из виду никакие из подстрок.

Пользуясь тем, что суффиксы у нас уже отсортированы, нетрудно понять, что текущий суффикс Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи даст в качестве новых подстрок все свои префиксы, кроме совпадающих с префиксами суффикса Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи. Т.е. все его префиксы, кроме Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи первых, дадут новые подстроки. Поскольку длина текущего суффикса равна Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи, то окончательно получаем, что текущий суффикс Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи дает Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи новых подстрок. Суммируя это по всем суффиксам (для самого первого, Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи, отнимать нечего — прибавится просто Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи), получаем ответ на задачу:

Суффструктуры- Суффиксный массив, суффиксное дерево  NP-трудные задачи

Вау!! 😲 Ты еще не читал? Это зря!

  • Суффиксный автомат
  • Алгоритм Касаи построения массива наибольших общих префиксов.
  • Обобщенное суффиксное дерево

А как ты думаешь, при улучшении суффструктуры, будет лучше нам? Надеюсь, что теперь ты понял что такое суффструктуры, суффиксный массив, суффиксное дерево и для чего все это нужно, а если не понял, или есть замечания, то не стесняйся, пиши или спрашивай в комментариях, с удовольствием отвечу. Для того чтобы глубже понять настоятельно рекомендую изучить всю информацию из категории Структуры данных

создано: 2014-08-18
обновлено: 2021-03-13
132532



Рейтиг 9 of 10. count vote: 2
Вы довольны ?:


Поделиться:

Найди готовое или заработай

С нашими удобными сервисами без комиссии*

Как это работает? | Узнать цену?

Найти исполнителя
$0 / весь год.
  • У вас есть задание, но нет времени его делать
  • Вы хотите найти профессионала для выплнения задания
  • Возможно примерение функции гаранта на сделку
  • Приорететная поддержка
  • идеально подходит для студентов, у которых нет времени для решения заданий
Готовое решение
$0 / весь год.
  • Вы можите продать(исполнителем) или купить(заказчиком) готовое решение
  • Вам предоставят готовое решение
  • Будет предоставлено в минимальные сроки т.к. задание уже готовое
  • Вы получите базовую гарантию 8 дней
  • Вы можете заработать на материалах
  • подходит как для студентов так и для преподавателей
Я исполнитель
$0 / весь год.
  • Вы профессионал своего дела
  • У вас есть опыт и желание зарабатывать
  • Вы хотите помочь в решении задач или написании работ
  • Возможно примерение функции гаранта на сделку
  • подходит для опытных студентов так и для преподавателей



Комментарии


Оставить комментарий
Если у вас есть какое-либо предложение, идея, благодарность или комментарий, не стесняйтесь писать. Мы очень ценим отзывы и рады услышать ваше мнение.
To reply

Структуры данных

Термины: Структуры данных