LCP массив - LCP array
Эта статья включает в себя список общих Рекомендации, но он остается в основном непроверенным, потому что ему не хватает соответствующих встроенные цитаты.Сентябрь 2012 г.) (Узнайте, как и когда удалить этот шаблон сообщения) ( |
LCP массив | ||
---|---|---|
Тип | Множество | |
Изобретенный | Манбер и Майерс (1990) | |
Сложность времени и космическая сложность в нотация большой O | ||
Средний | Худший случай | |
Космос | ||
Строительство |
В Информатика, то самый длинный общий префиксный массив (LCP множество) является вспомогательным структура данных к массив суффиксов. Он хранит длины самых длинных общих префиксов (LCP) между всеми парами последовательных суффиксов в отсортированном массиве суффиксов.
Например, если А := [ааб, ab, abaab, б, бааб] - массив суффиксов, самый длинный общий префикс между А[1] = ааб и А[2] = ab является а который имеет длину 1, поэтому ЧАС[2] = 1 в массиве LCP ЧАС. Аналогичным образом, LCP А[2] = ab и А[3] = abaab является ab, так ЧАС[3] = 2.
Дополнение массива суффиксов массивом LCP позволяет эффективно моделировать нисходящий и восходящий обходы из суффиксное дерево,[1][2] ускоряет сопоставление с образцом в массиве суффиксов[3] и является предпосылкой для сжатых деревьев суффиксов.[4]
История
Массив LCP был представлен в 1993 г. Уди Манбер и Джин Майерс рядом с массивом суффиксов, чтобы улучшить время работы алгоритма поиска строки.[3]
Определение
Позволять быть массив суффиксов строки длины , куда это уникальное дозорное письмо, лексикографически меньше, чем любой другой персонаж. Позволять обозначают подстроку начиная с к . Таким образом, это th наименьший суффикс .
Позволять обозначают длину самого длинного общего префикса между двумя строками и . Тогда массив LCP представляет собой целочисленный массив размера такой, что не определено и для каждого . Таким образом хранит длину самого длинного общего префикса лексикографически -й наименьший суффикс и его предшественник в массиве суффиксов.
Разница между массивом LCP и массивом суффиксов:
- Массив суффиксов: представляет лексикографический ранг каждого суффикса массива.
- Массив LCP: содержит совпадение префикса максимальной длины между двумя последовательными суффиксами после их лексикографической сортировки.
Пример
Рассмотрим строку :
я | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
---|---|---|---|---|---|---|---|
S [i] | б | а | п | а | п | а | $ |
и соответствующий ему отсортированный массив суффиксов :
я | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
---|---|---|---|---|---|---|---|
A [i] | 7 | 6 | 4 | 2 | 1 | 5 | 3 |
Массив суффиксов с суффиксами, написанными под ним по вертикали:
я | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
---|---|---|---|---|---|---|---|
A [i] | 7 | 6 | 4 | 2 | 1 | 5 | 3 |
S [A [i], n] [1] | $ | а | а | а | б | п | п |
S [A [i], n] [2] | $ | п | п | а | а | а | |
S [A [i], n] [3] | а | а | п | $ | п | ||
S [A [i], n] [4] | $ | п | а | а | |||
S [A [i], n] [5] | а | п | $ | ||||
S [A [i], n] [6] | $ | а | |||||
S [A [i], n] [7] | $ |
Тогда массив LCP строится путем сравнения лексикографически последовательных суффиксов для определения их самого длинного общего префикса:
я | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
---|---|---|---|---|---|---|---|
Здравствуй] | неопределенный | 0 | 1 | 3 | 0 | 0 | 2 |
Так, например, это длина самого длинного общего префикса разделяются суффиксами и . Обратите внимание, что не определено, так как нет лексикографически меньшего суффикса.
Эффективные алгоритмы строительства
Алгоритмы построения массива LCP можно разделить на две разные категории: алгоритмы, которые вычисляют массив LCP как побочный продукт для массива суффиксов, и алгоритмы, которые используют уже построенный массив суффиксов для вычисления значений LCP.
Манбер и Майерс (1993) предоставить алгоритм для вычисления массива LCP вместе с массивом суффиксов в время. Кярккяйнен и Сандерс (2003) показать, что также можно изменить их алгоритм времени, так что он также вычисляет массив LCP. Kasai et al. (2001) представить первый временной алгоритм (FLAAP), который вычисляет массив LCP по тексту и массиву суффиксов.
Предполагая, что каждый текстовый символ занимает один байт, а каждая запись суффикса или массива LCP занимает 4 байта, основным недостатком их алгоритма является занимаемое пространство байтов, в то время как исходный вывод (текст, массив суффиксов, массив LCP) занимает только байты. Следовательно, Манзини (2004) создали доработанный вариант алгоритма Kasai et al. (2001) (lcp9) и уменьшил занимаемую площадь до байты. Кярккяйнен, Манзини и Пуглиси (2009) предоставить еще одно уточнение алгоритма Касаи (-алгоритм), что улучшает время работы. Вместо реального массива LCP, этот алгоритм строит переставлен LCP (PLCP) массив, в котором значения отображаются в текстовом, а не в лексикографическом порядке.
Гог и Охлебуш (2011) предоставляют два алгоритма, которые, хотя и являются теоретически медленными () на практике оказались быстрее, чем упомянутые выше алгоритмы.
По состоянию на 2012 год[Обновить], самый быстрый в настоящее время алгоритм построения массива LCP с линейным временем связан с Фишер (2011), который, в свою очередь, основан на одном из самых быстрых алгоритмов построения массива суффиксов (SA-IS) Нонг, Чжан и Чан (2009). Фишер и Курпиц (2017) на основе DivSufSort Юты Мори даже быстрее.
Приложения
Как отмечает Абуэльода, Курц и Охлебуш (2004) несколько проблем обработки строк можно решить с помощью следующих видов обходы деревьев:
- обход полного дерева суффиксов снизу вверх
- обход поддерева суффиксного дерева сверху вниз
- обход суффиксного дерева с использованием суффиксных ссылок.
Kasai et al. (2001) показать, как смоделировать обход снизу вверх суффиксное дерево используя только массив суффиксов и массив LCP. Абуэльода, Курц и Охлебуш (2004) дополните массив суффиксов массивом LCP и дополнительными структурами данных и опишите, как это расширенный массив суффиксов можно использовать для моделирования все три вида обходов суффиксного дерева. Фишер и Хойн (2007) уменьшить требования к пространству для расширенного массива суффиксов путем предварительной обработки массива LCP для минимальный диапазон запросов. Таким образом, каждый Проблема, которую можно решить с помощью алгоритмов суффиксного дерева, также может быть решена с помощью расширенный массив суффиксов.[2]
Решаем, если узор длины это подстрока строки длины берет время, если используется только массив суффиксов. Путем дополнительного использования информации LCP эту границу можно улучшить до время.[3] Абуэльода, Курц и Охлебуш (2004) покажите, как еще больше улучшить это время работы для достижения оптимального время. Таким образом, используя массив суффиксов и информацию о массиве LCP, на запрос решения можно ответить так же быстро, как с помощью суффиксное дерево.
Массив LCP также является неотъемлемой частью сжатых деревьев суффиксов, которые обеспечивают полную функциональность дерева суффиксов, такую как ссылки суффиксов и наименьший общий предок запросы.[5][6] Кроме того, его можно использовать вместе с массивом суффиксов для вычисления Лемпеля-Зива. LZ77 факторизация в время.[2][7][8][9]
В проблема с самой длинной повторяющейся подстрокой для строки длины можно решить в время, используя массив суффиксов и массив LCP. Достаточно провести линейное сканирование по массиву LCP, чтобы найти его максимальное значение и соответствующий индекс куда хранится. Самая длинная подстрока, встречающаяся не менее двух раз, тогда определяется как .
В оставшейся части этого раздела более подробно рассматриваются два применения массива LCP: как можно использовать массив суффиксов и массив LCP строки для построения соответствующего дерева суффиксов и как можно отвечать на запросы LCP для произвольных суффиксов с использованием диапазона минимум запросов к массиву LCP.
Найдите количество вхождений шаблона
Эта статья может требовать уборка встретиться с Википедией стандарты качества. Конкретная проблема: этот раздел является точной копией StackOverflow ответ так что это имеет форму ответа на вопрос. (Июнь 2016) (Узнайте, как и когда удалить этот шаблон сообщения) |
Чтобы найти количество вхождений данной строки (длина ) в тексте (длина ),[3]
- Мы используем двоичный поиск по суффиксному массиву чтобы найти начальную и конечную позиции всех вхождений .
- Теперь для ускорения поиска мы используем массив LCP, а именно специальную версию массива LCP (ниже LCP-LR).
Проблема с использованием стандартного двоичного поиска (без информации LCP) заключается в том, что в каждом из Чтобы выполнить сравнения, мы сравниваем P с текущей записью массива суффиксов, что означает полное сравнение строк длиной до m символов. Итак, сложность .
Массив LCP-LR помогает улучшить это до , следующим образом:
На любом этапе алгоритма двоичного поиска мы, как обычно, рассматриваем диапазон суффиксного массива и его центральной точки , и решим, будем ли мы продолжать поиск в левом поддиапазоне или в правом поддиапазоне . Чтобы принять решение, мы сравниваем к строке на . Если идентичен , наш поиск завершен. Но если нет, то мы уже сравнили первые персонажи а потом решил, будет ли лексикографически меньше или больше, чем . Предположим, результат таков, что больше чем . Итак, на следующем этапе мы рассмотрим и новая центральная точка в середине:
M ...... M '...... R | мы знаем: lcp (P, M) == k
Уловка теперь заключается в том, что LCP-LR предварительно вычисляется так, что -lookup сообщает нам самый длинный общий префикс и , .
Мы уже знаем (из предыдущего шага), что сам имеет префикс общие персонажи с : . Теперь есть три возможности:
- Случай 1: , т.е. имеет меньше префиксных символов, общих с M, чем M имеет общих с M '. Это означает, что (k + 1) -й символ M 'совпадает с символом M, и поскольку P лексикографически больше M, он также должен быть лексикографически больше M'. Итак, продолжаем в правой половине (М ', ..., R).
- Случай 2: , т.е. имеет больше символов префикса, общих с чем имеет общее с . Следовательно, если бы мы сравнили к , общий префикс будет меньше, чем , и будет лексикографически больше, чем , поэтому, фактически не делая сравнения, продолжаем в левой половине .
- Случай 3: . Итак, M и M 'идентичны во-первых символы. Чтобы решить, продолжаем ли мы левую или правую половину, достаточно сравнить к начиная с й персонаж.
- Продолжаем рекурсивно.
Общий эффект заключается в том, что ни один персонаж сравнивается с любым символом текста более одного раза. Общее количество сравнений символов ограничено , поэтому общая сложность действительно .
Нам все еще нужно предварительно вычислить LCP-LR, чтобы он мог сказать нам время lcp между любыми двумя записями массива суффиксов. Мы знаем, что стандартный массив LCP дает нам lcp только последовательных записей, т.е. для любого . Тем не мение, и в приведенном выше описании не обязательно являются последовательными записями.
Ключ к этому - понять, что только определенные диапазоны никогда не произойдет во время двоичного поиска: он всегда начинается с и делит это в центре, а затем продолжает влево или вправо и снова делит эту половину и так далее. Другой способ взглянуть на это: каждая запись массива суффиксов возникает как центральная точка ровно одного возможного диапазона во время двоичного поиска. Таким образом, существует ровно N различных диапазонов что может сыграть роль во время двоичного поиска, и достаточно предварительно вычислить и для тех возможные диапазоны. Так что это различные предварительно вычисленные значения, поэтому LCP-LR по размеру.
Более того, существует простой рекурсивный алгоритм для вычисления значения LCP-LR в время из стандартного массива LCP.
Подводить итоги:
- Можно вычислить LCP-LR в время и пространство из ЛКП.
- Использование LCP-LR во время двоичного поиска помогает ускорить процедуру поиска с к .
- Мы можем использовать два бинарных поиска, чтобы определить левый и правый конец диапазона соответствия для , а длина диапазона совпадений соответствует количеству вхождений для P.
Построение суффиксного дерева
Учитывая массив суффиксов и массив LCP строки длины , его суффиксное дерево может быть построен в time на основе следующей идеи: начните с частичного дерева суффиксов для лексикографически наименьшего суффикса и несколько раз вставляйте другие суффиксы в порядке, заданном массивом суффиксов.
Позволять быть частичным суффиксным деревом для . Далее пусть быть длиной конкатенации всех меток пути от корня узел .
Начать с , дерево, состоящее только из корня. Вставить в , иди вверх по крайний правый путь, начинающийся с недавно вставленного листа к корню, до самого глубокого узла с достигнуто.
Нам нужно различать два случая:
- : Это означает, что объединение меток на корне- путь равен самому длинному общему префиксу суффиксов и .
В этом случае вставьте как новый лист узла и обозначьте край с . Таким образом, метка края состоит из оставшихся символов суффикса которые еще не представлены конкатенацией меток корня к дорожка.
Это создает частичное дерево суффиксов . - : Это означает, что объединение меток на корне- path отображает меньше символов, чем самый длинный общий префикс суффиксов и и отсутствующий символы содержатся в метке края с крайний правый край. Следовательно, мы должны разделить этот край следующим образом:
Позволять быть ребенком на крайний правый путь.
- Удалить край .
- Добавить новый внутренний узел и новый край с этикеткой . Новая этикетка состоит из отсутствующий символы самого длинного общего префикса и . Таким образом, конкатенация меток корня к путь теперь отображает самый длинный общий префикс и .
- Соединять к вновь созданному внутреннему узлу по краю что помечено . Новая этикетка состоит из осталось символы удаленного края которые не использовались в качестве метки края .
- Добавлять как новый лист и подключите его к новому внутреннему узлу по краю что помечено . Таким образом, метка края состоит из оставшихся символов суффикса которые еще не представлены конкатенацией меток корня к дорожка.
- Это создает частичное дерево суффиксов .
Простой аргумент амортизации показывает, что время работы этого алгоритма ограничено :
Узлы, которые проходят на шаге поднявшись по крайний правый путь (кроме последнего узла ) удалены из крайний правый путь, когда добавляется к дереву как новый лист. Эти узлы больше никогда не будут пройдены на всех последующих этапах. . Следовательно, самое большее узлы будут пройдены полностью.
LCP запросы для произвольных суффиксов
Массив LCP содержит только длину самого длинного общего префикса каждой пары последовательных суффиксов в массиве суффиксов . Однако с помощью массива обратных суффиксов (, т.е. суффикс что начинается с позиции в хранится в позиции в ) и постоянного времени минимальный диапазон запросов на , можно определить длину самого длинного общего префикса произвольных суффиксов в время.
Из-за лексикографического порядка массива суффиксов каждый общий префикс суффиксов и должен быть общим префиксом для всех суффиксов между позиция в массиве суффиксов и позиция в массиве суффиксов . Следовательно, длина самого длинного префикса, который разделяет все из этих суффиксов - минимальное значение в интервале . Это значение можно найти в постоянное время, если предварительно обрабатывается для запросов с минимальным диапазоном.
Таким образом, данная строка длины и две произвольные позиции в строке с , длина самого длинного общего префикса суффиксов и можно вычислить следующим образом: .
Примечания
Рекомендации
- Абуэльода, Мохамед Ибрагим; Курц, Стефан; Охлебуш, Энно (2004). «Замена деревьев суффиксов расширенными массивами суффиксов». Журнал дискретных алгоритмов. 2: 53–86. Дои:10.1016 / S1570-8667 (03) 00065-0.CS1 maint: ref = harv (связь)
- Манбер, Уди; Майерс, Джин (1993). «Суффиксные массивы: новый метод поиска строк в сети». SIAM Журнал по вычислениям. 22 (5): 935. CiteSeerX 10.1.1.105.6571. Дои:10.1137/0222058.CS1 maint: ref = harv (связь)
- Kasai, T .; Lee, G .; Arimura, H .; Arikawa, S .; Парк, К. (2001). Линейное вычисление наибольшего общего префикса в суффиксных массивах и его приложения. Труды 12-го ежегодного симпозиума по комбинаторному сопоставлению с образцом. Конспект лекций по информатике. 2089. С. 181–192. Дои:10.1007 / 3-540-48194-X_17. ISBN 978-3-540-42271-6.CS1 maint: ref = harv (связь)
- Охлебуш, Энно; Фишер, Йоханнес; Гог, Саймон (2010). CST ++. Обработка строк и поиск информации. Конспект лекций по информатике. 6393. п. 322. Дои:10.1007/978-3-642-16321-0_34. ISBN 978-3-642-16320-3.CS1 maint: ref = harv (связь)
- Кярккяйнен, Юха; Сандерс, Питер (2003). Простое построение линейного массива рабочих суффиксов. Материалы 30-й международной конференции по автоматам, языкам и программированию. стр. 943–955. Получено 2012-08-28.CS1 maint: ref = harv (связь)
- Фишер, Йоханнес (2011). Индукция LCP-Array. Алгоритмы и структуры данных. Конспект лекций по информатике. 6844. С. 374–385. arXiv:1101.3448. Дои:10.1007/978-3-642-22300-6_32. ISBN 978-3-642-22299-3.CS1 maint: ref = harv (связь)
- Манзини, Джованни (2004). Два приема экономии места для вычисления массива LCP с линейным временем. Теория алгоритмов - SWAT 2004. Конспект лекций по информатике. 3111. п. 372. Дои:10.1007/978-3-540-27810-8_32. ISBN 978-3-540-22339-9.CS1 maint: ref = harv (связь)
- Кярккяйнен, Юха; Манзини, Джованни; Пуглиси, Саймон Дж. (2009). Переставленный массив самого длинного общего префикса. Комбинаторное сопоставление с образцом. Конспект лекций по информатике. 5577. п. 181. Дои:10.1007/978-3-642-02441-2_17. ISBN 978-3-642-02440-5.CS1 maint: ref = harv (связь)
- Puglisi, Simon J .; Терпин, Эндрю (2008). Пространственно-временные компромиссы для вычисления массива с самым длинным общим префиксом. Алгоритмы и вычисления. Конспект лекций по информатике. 5369. п. 124. Дои:10.1007/978-3-540-92182-0_14. ISBN 978-3-540-92181-3.CS1 maint: ref = harv (связь)
- Гог, Саймон; Охлебуш, Энно (2011). Быстрые и легкие алгоритмы построения LCP-массива (PDF). Труды семинара по разработке алгоритмов и экспериментам, ALENEX 2011. С. 25–34.. Получено 2012-08-28.CS1 maint: ref = harv (связь)
- Нонг, Ге; Чжан, Сен; Чан, Вай Хун (2009). Построение линейного массива суффиксов с помощью почти чистой индуцированной сортировки. Конференция по сжатию данных 2009 г. п. 193. Дои:10.1109 / DCC.2009.42. ISBN 978-0-7695-3592-0.CS1 maint: ref = harv (связь)
- Фишер, Йоханнес; Хойн, Волкер (2007). Новое краткое представление RMQ-информации и улучшения в расширенном массиве суффиксов. Комбинаторика, алгоритмы, вероятностные и экспериментальные методологии. Конспект лекций по информатике. 4614. п. 459. Дои:10.1007/978-3-540-74450-4_41. ISBN 978-3-540-74449-8.CS1 maint: ref = harv (связь)
- Chen, G .; Puglisi, S.J .; Смит, В. Ф. (2008). "Факторизация Лемпеля – Зива с использованием меньшего количества времени и пространства". Математика в информатике. 1 (4): 605. Дои:10.1007 / s11786-007-0024-4.CS1 maint: ref = harv (связь)
- Crochemore, M .; Илие, Л. (2008). «Вычисление самого длинного предыдущего фактора в линейное время и приложения». Письма об обработке информации. 106 (2): 75. CiteSeerX 10.1.1.70.5720. Дои:10.1016 / j.ipl.2007.10.006.CS1 maint: ref = harv (связь)
- Crochemore, M .; Ilie, L .; Смит, В. Ф. (2008). Простой алгоритм вычисления факторизации Лемпеля Зива. Конференция по сжатию данных (DC 2008). п. 482. Дои:10.1109 / DCC.2008.36. HDL:20.500.11937/5907. ISBN 978-0-7695-3121-2.CS1 maint: ref = harv (связь)
- Садакане, К. (2007). «Сжатые деревья суффиксов с полной функциональностью». Теория вычислительных систем. 41 (4): 589–607. CiteSeerX 10.1.1.224.4152. Дои:10.1007 / s00224-006-1198-х.CS1 maint: ref = harv (связь)
- Фишер, Йоханнес; Мякинен, Вели; Наварро, Гонсало (2009). «Более быстрые сжатые суффиксные деревья с ограниченной энтропией». Теоретическая информатика. 410 (51): 5354. Дои:10.1016 / j.tcs.2009.09.012.CS1 maint: ref = harv (связь)
- Фишер, Йоханнес; Курпиц, Флориан (5 октября 2017 г.). «Разборка DivSufSort». Труды Пражской Стрингологической конференции 2017 г.. arXiv:1710.01896.CS1 maint: ref = harv (связь)
внешняя ссылка
- Зеркало ad-hoc-реализации кода описано в Фишер (2011)
- SDSL: краткая библиотека структур данных - предоставляет различные реализации массивов LCP, структуры поддержки запроса минимального диапазона (RMQ) и многие другие краткие структуры данных
- Обход дерева суффиксов снизу вверх, эмулируемый с использованием массива суффиксов и массива LCP (Java)
- Проект индексирования текста (построение суффиксных деревьев, массивов суффиксов, массива LCP и Преобразование Барроуза-Уиллера )