LCP-массив
Эта статья включает список общих ссылок , но в ней отсутствуют достаточные соответствующие встроенные цитаты . ( сентябрь 2012 г. ) |
LCP-массив | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|
Тип | Множество | |||||||||
Изобретён | Манбер и Майерс (1993) | |||||||||
Временная сложность и пространственная сложность в большой записи O | ||||||||||
|
В информатике самый длинный общий массив префиксов ( LCP массив ) представляет собой вспомогательную структуру данных по отношению к массиву суффиксов . Он хранит длины самых длинных общих префиксов (LCP) между всеми парами последовательных суффиксов в отсортированном массиве суффиксов.
Например, если A := [ Эбб , аб , отец , б , малыш ] — массив суффиксов, самый длинный общий префикс между A [1] = Эбб и А [2] = аб является а который имеет длину 1, поэтому H [2] = 1 в массиве LCP H . Аналогично, ЛКП A [2] = аб и А [3] = отец является аб , поэтому H [3] = 2.
Дополнение массива суффиксов массивом LCP позволяет эффективно моделировать обходы суффиксного дерева сверху вниз и снизу вверх . [ 1 ] [ 2 ] ускоряет сопоставление с образцом в массиве суффиксов [ 3 ] и является обязательным условием для сжатых суффиксных деревьев. [ 4 ]
История
[ редактировать ]Массив LCP был представлен в 1993 году Уди Манбером и Джином Майерсом вместе с массивом суффиксов, чтобы улучшить время работы их алгоритма поиска строк. [ 3 ]
Определение
[ редактировать ]Позволять быть суффиксным массивом строки длины , где — это сторожевая буква, которая уникальна и лексикографически меньше любого другого символа. Позволять обозначаем подстроку начиная от к . Таким образом, это самый маленький суффикс .
Позволять обозначают длину самого длинного общего префикса между двумя строками и . Тогда массив LCP представляет собой целочисленный массив размера такой, что является неопределенным и для каждого . Таким образом хранит длину самого длинного общего префикса лексикографически наименьший суффикс и его предшественник в массиве суффиксов.
Разница между массивом LCP и массивом суффиксов:
- Массив суффиксов: представляет лексикографический ранг каждого суффикса массива.
- Массив LCP: содержит совпадение префиксов максимальной длины между двумя последовательными суффиксами после их лексикографической сортировки.
Пример
[ редактировать ]Рассмотрим строку :
я | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
---|---|---|---|---|---|---|---|
С [я] | б | а | н | а | н | а | $ |
и соответствующий ему отсортированный массив суффиксов :
я | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
---|---|---|---|---|---|---|---|
А[я] | 7 | 6 | 4 | 2 | 1 | 5 | 3 |
Массив суффиксов с суффиксами, написанными внизу вертикально:
я | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
---|---|---|---|---|---|---|---|
А[я] | 7 | 6 | 4 | 2 | 1 | 5 | 3 |
С[А[i], n][1] | $ | а | а | а | б | н | н |
С[А[i], n][2] | $ | н | н | а | а | а | |
С[А[i], n][3] | а | а | н | $ | н | ||
С[А[i], n][4] | $ | н | а | а | |||
С[А[i], n][5] | а | н | $ | ||||
С[А[и], п][6] | $ | а | |||||
С[А[и], п][7] | $ |
Тогда массив LCP строится путем сравнения лексикографически последовательных суффиксов для определения их самого длинного общего префикса:
я | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
---|---|---|---|---|---|---|---|
Привет] | неопределенный | 0 | 1 | 3 | 0 | 0 | 2 |
Так, например, длина самого длинного общего префикса разделяется суффиксами и . Обратите внимание, что не определено, поскольку не существует лексикографически меньшего суффикса.
Эффективные алгоритмы строительства
[ редактировать ]Алгоритмы построения массива LCP можно разделить на две разные категории: алгоритмы, которые вычисляют массив LCP как побочный продукт массива суффиксов, и алгоритмы, которые используют уже созданный массив суффиксов для вычисления значений LCP.
Манбер и Майерс (1993) предлагают алгоритм для вычисления массива LCP вместе с массивом суффиксов в время. Кярккяйнен и Сандерс (2003) показывают, что их также можно изменить. временной алгоритм, позволяющий также вычислять массив LCP. Касаи и др. (2001) представляют первый алгоритм времени (FLAAP), который вычисляет массив LCP по тексту и массиву суффиксов.
Если предположить, что каждый текстовый символ занимает один байт, а каждая запись суффикса или массива LCP — 4 байта, то основным недостатком их алгоритма является большой объем занимаемого пространства. байт, в то время как исходный вывод (текст, массив суффиксов, массив LCP) занимает только байты. Поэтому Манзини (2004) создал усовершенствованную версию алгоритма Касаи и др. (2001) (lcp9) и сократили занимаемую площадь до байты. Кярккяйнен, Манзини и Пуглиси (2009) предлагают еще одно усовершенствование алгоритма Касаи ( -алгоритм), который улучшает время работы. Вместо фактического массива LCP этот алгоритм создает перестановочный массив LCP (PLCP), в котором значения отображаются в текстовом, а не в лексикографическом порядке.
Gog & Ohlebusch (2011) предлагают два алгоритма, которые теоретически медленны ( ) на практике оказались быстрее, чем вышеупомянутые алгоритмы.
По состоянию на 2012 год [update]Самый быстрый на данный момент алгоритм построения массива LCP с линейным временем принадлежит Фишеру (2011) , который, в свою очередь, основан на одном из самых быстрых алгоритмов построения суффиксного массива (SA-IS) Нонга, Чжана и Чана (2009) . Fischer & Kurpicz (2017), основанный на DivSufSort Юты Мори, работает еще быстрее.
Приложения
[ редактировать ]Как отметили Абуэльхода, Курц и Олебуш (2004), некоторые проблемы обработки строк можно решить с помощью следующих видов обхода дерева :
- обход всего суффиксного дерева снизу вверх
- обход поддерева суффиксного дерева сверху вниз
- обход суффиксного дерева с использованием суффиксных ссылок.
Касаи и др. (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 | we know: lcp(P,M)==k
Хитрость теперь в том, что LCP-LR заранее вычисляется так, что -lookup сообщает нам самый длинный общий префикс и , .
Мы уже знаем (из предыдущего шага), что сам имеет префикс общие персонажи с : . Теперь есть три возможности:
- Случай 1: , то есть имеет меньше префиксных символов, общих с M, чем M общего с M'. Это означает, что (k+1)-й символ M' такой же, как и у M, и поскольку P лексикографически больше, чем M, он также должен быть лексикографически больше, чем M'. Итак, продолжаем в правой половине (M',...,R).
- Случай 2: , то есть имеет больше префиксных символов, общих с чем имеет общее с . Следовательно, если бы мы сравнивали к , общий префикс будет меньше, чем , и будет лексикографически больше, чем , поэтому, фактически не производя сравнения, мы продолжаем в левой половине .
- Случай 3: . Итак, М и М' тождественны в первом персонажи. Чтобы решить, продолжим ли мы в левой или правой половине, достаточно сравнить к начиная с й персонаж.
- Продолжаем рекурсивно.
Общий эффект заключается в том, что никакой характер сравнивается с любым символом текста более одного раза (подробнее см. [ 3 ] ). Общее количество сравнений символов ограничено , поэтому общая сложность действительно .
Нам все еще нужно предварительно вычислить LCP-LR, чтобы он мог сообщить нам время lcp между любыми двумя записями массива суффиксов. Мы знаем, что стандартный массив LCP дает нам lcp только последовательных записей, т.е. для любого . Однако, и в описании выше не обязательно являются последовательными записями.
Ключом к этому является понимание того, что только определенные диапазоны когда-либо произойдет во время бинарного поиска: он всегда начинается с и делит это в центре, а затем продолжает либо влево, либо вправо, снова делит эту половину и так далее. Другой способ взглянуть на это таков: каждая запись массива суффиксов встречается как центральная точка ровно одного возможного диапазона во время двоичного поиска. Итак, существует ровно N различных диапазонов. это может сыграть роль при двоичном поиске, и достаточно предварительно вычислить и для тех возможные диапазоны. Так что это отдельные заранее вычисленные значения, следовательно, LCP-LR по размеру.
Более того, существует простой рекурсивный алгоритм для вычисления значения LCP-LR в время из стандартного массива LCP.
Подводить итоги:
- LCP-LR можно вычислить в время и пространство от ЛКП.
- Использование LCP-LR во время двоичного поиска помогает ускорить процедуру поиска с к .
- Мы можем использовать два двоичных поиска, чтобы определить левый и правый конец диапазона совпадений для , а длина диапазона соответствия соответствует количеству вхождений P.
Построение суффиксного дерева
[ редактировать ]Учитывая массив суффиксов и массив LCP веревки длины , его суффиксное дерево может быть построен в time основан на следующей идее: начните с частичного суффиксного дерева для лексикографически наименьшего суффикса и повторно вставляйте другие суффиксы в порядке, заданном массивом суффиксов.
Позволять быть частичным суффиксным деревом для . Дальше пусть быть длиной конкатенации всех меток пути от корня узел .
Начните с , дерево, состоящее только из корня. Чтобы вставить в , пройдите по крайнему правому пути, начиная с недавно вставленного листа до корня, до самого глубокого узла с достигается.
Нам нужно различать два случая:
- : Это означает, что объединение меток от корня к путь равен самому длинному общему префиксу суффиксов и .
В этом случае вставьте как новый лист узла и обозначим край с . Таким образом, метка края состоит из оставшихся символов суффикса. которые еще не представлены конкатенацией меток корня к путь.
Это создает частичное суффиксное дерево. . - : Это означает, что объединение меток от корня к путь отображает меньше символов, чем самый длинный общий префикс суффиксов и а недостающие символы содержатся в метке края самый правый край. Поэтому нам нужно разделить это ребро следующим образом:
Позволять быть ребенком на самый правый путь.
- Удалить край .
- Добавить новый внутренний узел и новый край с этикеткой . Новая метка состоит из недостающих символов самого длинного общего префикса. и . Таким образом, конкатенация меток корня в путь теперь отображает самый длинный общий префикс и .
- Соединять к вновь созданному внутреннему узлу по краю это помечено . Новая метка состоит из оставшихся символов удаленного края. которые не использовались в качестве метки края .
- Добавлять как новый лист и подключим его к новому внутреннему узлу по краю это помечено . Таким образом, метка края состоит из оставшихся символов суффикса. которые еще не представлены конкатенацией меток корня к путь.
- Это создает частичное суффиксное дерево. .
Простой аргумент амортизации показывает, что время работы этого алгоритма ограничено :
Узлы, которые проходятся на шаге идя по крайнему правому пути (кроме последнего узла ) удаляются из крайнего правого пути, когда добавляется к дереву как новый лист. Эти узлы никогда больше не будут пересекаться на всех последующих шагах. . Следовательно, максимум узлы будут пройдены в общей сложности.
LCP-запросы для произвольных суффиксов
[ редактировать ]Массив LCP содержит только длину самого длинного общего префикса каждой пары последовательных суффиксов в массиве суффиксов . Однако с помощью обратного суффиксного массива ( , то есть суффикс это начинается с позиции в хранится в положении в постоянного времени ) и запросы минимального диапазона на , можно определить длину самого длинного общего префикса произвольных суффиксов в время.
Из-за лексикографического порядка суффиксного массива каждый общий префикс суффиксов и должен быть общим префиксом для всех суффиксов между позиция в массиве суффиксов и позиция в массиве суффиксов . Следовательно, длина самого длинного префикса, общего для всех этих суффиксов, представляет собой минимальное значение в интервале . Это значение можно найти за постоянное время, если предварительно обрабатывается для запросов с минимальным диапазоном.
Таким образом, учитывая строку длины и две произвольные позиции в строке с , длина самого длинного общего префикса суффиксов и можно вычислить следующим образом: .
Примечания
[ редактировать ]Ссылки
[ редактировать ]- Абуэльхода, Мохамед Ибрагим; Курц, Стефан; Олебуш, Энно (2004). «Замена суффиксных деревьев расширенными суффиксными массивами» . Журнал дискретных алгоритмов . 2 : 53–86. дои : 10.1016/S1570-8667(03)00065-0 .
- Манбер, Уди; Майерс, Джин (1993). «Суффиксные массивы: новый метод поиска строк в Интернете». SIAM Journal по вычислительной технике . 22 (5): 935. CiteSeerX 10.1.1.105.6571 . дои : 10.1137/0222058 . S2CID 5074629 .
- Касаи, Т.; Ли, Г.; Аримура, Х.; Арикава, С.; Парк, К. (2001). Вычисление самого длинного общего префикса в суффиксных массивах за линейное время и его приложения . Материалы 12-го ежегодного симпозиума по комбинаторному сопоставлению с образцом. Конспекты лекций по информатике. Том. 2089. стр. 181–192. дои : 10.1007/3-540-48194-X_17 . ISBN 978-3-540-42271-6 .
- Олебуш, Энно; Фишер, Йоханнес; Гог, Саймон (2010). КСТ++ . Обработка строк и поиск информации. Конспекты лекций по информатике. Том. 6393. с. 322. дои : 10.1007/978-3-642-16321-0_34 . ISBN 978-3-642-16320-3 .
- Кярккяйнен, Юха; Сандерс, Питер (2003). Простое построение массива суффиксов линейной работы . Материалы 30-й международной конференции «Автоматы, языки и программирование». стр. 943–955 . Проверено 28 августа 2012 г.
- Фишер, Йоханнес (2011). Стимуляция LCP-массива . Алгоритмы и структуры данных. Конспекты лекций по информатике. Том. 6844. стр. 374–385. arXiv : 1101.3448 . дои : 10.1007/978-3-642-22300-6_32 . ISBN 978-3-642-22299-3 .
- Манзини, Джованни (2004). Два приема экономии места при вычислении массива LCP за линейное время . Теория алгоритмов - SWAT 2004. Конспекты лекций по информатике. Том. 3111. с. 372. дои : 10.1007/978-3-540-27810-8_32 . ISBN 978-3-540-22339-9 .
- Кярккяйнен, Юха; Манзини, Джованни; Пуглиси, Саймон Дж. (2009). Перестановочный массив самых длинных общих префиксов . Комбинаторное сопоставление с образцом. Конспекты лекций по информатике. Том. 5577. с. 181. дои : 10.1007/978-3-642-02441-2_17 . ISBN 978-3-642-02440-5 .
- Пуглиси, Саймон Дж.; Терпин, Эндрю (2008). Компромиссы пространства и времени для вычисления массива с самым длинным общим префиксом . Алгоритмы и вычисления. Конспекты лекций по информатике. Том. 5369. с. 124. дои : 10.1007/978-3-540-92182-0_14 . ISBN 978-3-540-92181-3 .
- Гог, Саймон; Олебуш, Энно (2011). Быстрые и легкие алгоритмы построения LCP-массива (PDF) . Материалы семинара по алгоритмической разработке и экспериментам, ALENEX 2011. С. 25–34 . Проверено 28 августа 2012 г.
- Нонг, Ге; Чжан, Сен; Чан, Вай Хун (2009). Построение линейного суффиксного массива с помощью почти чистой индуцированной сортировки . Конференция по сжатию данных 2009 г. п. 193. дои : 10.1109/DCC.2009.42 . ISBN 978-0-7695-3592-0 .
- Фишер, Йоханнес; Хойн, Волкер (2007). Новое краткое представление RMQ-информации и улучшения расширенного массива суффиксов . Комбинаторика, алгоритмы, вероятностные и экспериментальные методологии. Конспекты лекций по информатике. Том. 4614. с. 459. дои : 10.1007/978-3-540-74450-4_41 . ISBN 978-3-540-74449-8 .
- Чен, Г.; Пуглиси, С.Дж.; Смит, ВФ (2008). «Факторизация Лемпеля – Зива с использованием меньшего времени и пространства». Математика в информатике . 1 (4): 605. дои : 10.1007/s11786-007-0024-4 . S2CID 1721891 .
- Крочемор, М.; Илие, Л. (2008). «Вычисление самого длинного предыдущего фактора в линейном времени и приложениях». Письма об обработке информации . 106 (2): 75. CiteSeerX 10.1.1.70.5720 . дои : 10.1016/j.ipl.2007.10.006 . S2CID 5492217 .
- Крочемор, М.; Илие, Л.; Смит, ВФ (2008). Простой алгоритм вычисления факторизации Лемпеля-Зива . Конференция по сжатию данных (dcc, 2008 г.). п. 482. дои : 10.1109/DCC.2008.36 . hdl : 20.500.11937/5907 . ISBN 978-0-7695-3121-2 .
- Садакане, К. (2007). «Сжатые суффиксные деревья с полной функциональностью». Теория вычислительных систем . 41 (4): 589–607. CiteSeerX 10.1.1.224.4152 . дои : 10.1007/s00224-006-1198-x . S2CID 263130 .
- Фишер, Йоханнес; Мякинен, Вели; Наварро, Гонсало (2009). «Быстрые сжатые суффиксные деревья, ограниченные энтропией» . Теоретическая информатика . 410 (51): 5354. doi : 10.1016/j.tcs.2009.09.012 .
- Фишер, Йоханнес; Курпиц, Флориан (5 октября 2017 г.). «Демонтаж ДивСуфСорта». Материалы Пражской конференции по стрингологии 2017 . arXiv : 1710.01896 .
Внешние ссылки
[ редактировать ]- Зеркало специальной реализации кода, описанного Фишером (2011).
- SDSL: библиотека кратких структур данных. Предоставляет различные реализации массивов LCP, структуры поддержки запроса минимального диапазона (RMQ) и многие другие краткие структуры данных.
- Обход суффиксного дерева снизу вверх, эмулируемый с использованием суффиксного массива и массива LCP (Java)
- Проект индексирования текста (построение суффиксных деревьев, суффиксных массивов, массива LCP и преобразования Берроуза – Уиллера в линейном времени )