Массив суффиксов - Suffix array

Массив суффиксов
ТипМассив
ИзобретенныйМанбер и Майерс (1990)
Сложность времени
в нотация большой O
СреднийХудший случай
Космос
строительство

В Информатика, а массив суффиксов это отсортированный массив из всех суффиксы из нить. Это структура данных, используемая, среди прочего, в полнотекстовых индексах, алгоритмах сжатия данных и в области библиометрия.

Массивы суффиксов были введены Манбер и Майерс (1990) как простая и компактная альтернатива суффиксные деревья. Они были независимо обнаружены Гастон Гонне в 1987 году под названием Массив PAT (Гоннет, Баеза-Йейтс и Снайдер 1992 ).

Ли, Ли и Хо (2016) дал первый на месте алгоритм построения массива суффиксов времени, оптимальный как во времени, так и в пространстве, где на месте означает, что алгоритму требуется только дополнительное пространство за входной строкой и массивом выходных суффиксов.

Расширенные массивы суффиксов (ESA) - это массивы суффиксов с дополнительными таблицами, которые воспроизводят полную функциональность суффиксных деревьев, сохраняя при этом то же время и сложность памяти.[1]Массив суффиксов для подмножества всех суффиксов строки называется разреженный массив суффиксов.[2] Было разработано несколько вероятностных алгоритмов, чтобы минимизировать использование дополнительной памяти, включая алгоритм оптимального времени и памяти.[3]

Определение

Позволять быть -string и пусть обозначают подстроку начиная с к .

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

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

пример

Рассмотрим текст =банан $ для индексации:

я1234567
бапапа$

Текст заканчивается специальным дозорным письмом. $ который уникален и лексикографически меньше любого другого символа. Текст имеет следующие суффиксы:

Суффикся
банан $1
анана $2
нана $3
ана $4
na $5
$6
$7

Эти суффиксы можно отсортировать в порядке возрастания:

Суффикся
$7
$6
ана $4
анана $2
банан $1
na $5
нана $3

Массив суффиксов содержит начальные позиции этих отсортированных суффиксов:

я =1234567
=7642153

Массив суффиксов с суффиксами, написанными вертикально внизу для ясности:

я =1234567
=7642153
1$ааабпп
2$ппааа
3аап$п
4$паа
5ап$
6$а
7$

Так, например, содержит значение 4 и, следовательно, относится к суффиксу, начинающемуся с позиции 4 внутри , который является суффиксом ана $.

Соответствие суффиксным деревьям

Массивы суффиксов тесно связаны с суффиксные деревья:

  • Массивы суффиксов можно построить, выполнив обход в глубину суффиксного дерева. Массив суффиксов соответствует листовым меткам, заданным в порядке их посещения во время обхода, если ребра посещаются в лексикографическом порядке их первого символа.
  • Суффиксное дерево можно построить за линейное время, используя комбинацию суффиксного массива и LCP массив. Описание алгоритма см. В соответствующий раздел в LCP массив статья.

Было показано, что каждый алгоритм дерева суффиксов может быть систематически заменен алгоритмом, который использует массив суффиксов, расширенный дополнительной информацией (например, LCP массив ) и решает ту же проблему при той же временной сложности.[4]Преимущества суффиксных массивов над суффиксными деревьями включают улучшенные требования к пространству, более простые алгоритмы построения линейного времени (например, по сравнению с Алгоритм Укконена ) и улучшенная локальность кеша.[5]

Эффективность использования пространства

Массивы суффиксов были введены Манбер и Майерс (1990) чтобы улучшить требования к пространству суффиксные деревья: Хранилище суффиксных массивов целые числа. Предполагая, что целое число требует байтов, массив суффиксов требует всего байтов. Это значительно меньше, чем байты, необходимые для тщательной реализации дерева суффиксов.[6]

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

Такие несоответствия мотивировали тенденцию к сжатые массивы суффиксов и BWT сжатые полнотекстовые индексы, такие как FM-индекс. Эти структуры данных требуют места в пределах размера текста или даже меньше.

Алгоритмы построения

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

Наивный подход к построению массива суффиксов - использовать алгоритм сортировки на основе сравнения. Эти алгоритмы требуют сравнения суффиксов, но сравнение суффиксов выполняется в время, поэтому общее время выполнения этого подхода .

Более продвинутые алгоритмы используют тот факт, что сортируемые суффиксы не являются произвольными строками, а связаны друг с другом. Эти алгоритмы стремятся достичь следующих целей:[7]

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

Одним из первых алгоритмов для достижения всех целей является алгоритм SA-IS. Нонг, Чжан и Чан (2009). Алгоритм также довольно прост (<100 LOC ) и может быть расширен для одновременного построения LCP массив.[8] Алгоритм SA-IS - один из самых быстрых известных алгоритмов построения массива суффиксов. Осторожный реализация Юта Мори превосходит большинство других линейных или суперлинейных подходов к построению.

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

Большинство алгоритмов построения суффиксных массивов основаны на одном из следующих подходов:[7]

  • Удвоение префикса алгоритмы основаны на стратегии Карп, Миллер и Розенберг (1972). Идея состоит в том, чтобы найти префиксы, учитывающие лексикографический порядок суффиксов. Оценка длины префикса удваивается на каждой итерации алгоритма до тех пор, пока префикс не станет уникальным и не обеспечит ранг соответствующего суффикса.
  • Рекурсивный алгоритмы следуют подходу алгоритма построения суффиксного дерева Фарач (1997) для рекурсивной сортировки подмножества суффиксов. Это подмножество затем используется для вывода массива суффиксов из оставшихся суффиксов. Затем оба этих массива суффиксов объединяются для вычисления окончательного массива суффиксов.
  • Вынужденное копирование Алгоритмы похожи на рекурсивные алгоритмы в том смысле, что они используют уже отсортированное подмножество для быстрой сортировки оставшихся суффиксов. Разница в том, что эти алгоритмы предпочитают итерацию рекурсии для сортировки выбранного подмножества суффиксов. Обзор этой разнообразной группы алгоритмов был составлен Пуглиси, Смит и Терпин (2007).

Хорошо известным рекурсивным алгоритмом для целочисленных алфавитов является DC3 / перекос алгоритм Кярккяйнен и Сандерс (2003). Он работает в линейном времени и успешно используется в качестве основы для параллельного[10] и внешняя память[11] алгоритмы построения суффиксных массивов.

Недавние работы Salson et al. (2010) предлагает алгоритм для обновления массива суффиксов отредактированного текста вместо восстановления нового массива суффиксов с нуля. Даже если теоретическая временная сложность наихудшего случая равна , похоже, он хорошо работает на практике: экспериментальные результаты авторов показали, что их реализация динамических массивов суффиксов, как правило, более эффективна, чем перестроение, если рассматривать возможность вставки разумного количества букв в исходный текст.

В практике Открытый исходный код work, обычно используемой процедурой для построения массива суффиксов была qsufsort, основанная на алгоритме Ларссона-Садакане 1999 года.[12] Эта процедура была заменена DivSufSort Юты Мори, «самым быстрым из известных алгоритмов сортировки суффиксов в основной памяти» по состоянию на 2017 год. Его также можно изменить для вычисления массива LCP. Он использует индуцированное копирование в сочетании с Ито-Танака.[13]

Приложения

Массив суффиксов строки может использоваться как показатель чтобы быстро найти каждое вхождение шаблона подстроки внутри строки . Поиск каждого вхождения шаблона эквивалентен поиску каждого суффикса, который начинается с подстроки. Благодаря лексикографическому упорядочению эти суффиксы будут сгруппированы вместе в массиве суффиксов, и их можно будет эффективно найти с помощью двух бинарный поиск. Первый поиск определяет начальную позицию интервала, а второй определяет конечную позицию:[нужна цитата ]

п = len(S)def поиск(п: ул) -> Кортеж[int, int]:    """    Возвращает индексы (s, r) такие, что интервал A [s: r] (включая конец    index) представляет все суффиксы S, начинающиеся с шаблона P.    """    # Найти начальную позицию интервала    л = 0  # в Python массивы индексируются начиная с 0    р = п    в то время как л < р:        середина = (л + р) // 2  # округление деления до ближайшего целого числа        # суффиксAt (A [i]) - i-й наименьший суффикс        если п > суффикс(А[середина]):            л = середина + 1        еще:            р = середина    s = л        # Найти конечную позицию интервала    р = п    в то время как л < р:        середина = (л + р) // 2        если суффикс(А[середина]).начинается с(п):            л = середина + 1        еще:            р = середина    вернуть (s, р)

Поиск шаблона подстроки длины в строке длины берет время, учитывая, что для сравнения одного суффикса необходимо символы. Манбер и Майерс (1990) опишите, как эту оценку можно улучшить до время используя LCP Информация. Идея состоит в том, что сравнение шаблонов не требует повторного сравнения определенных символов, когда уже известно, что они являются частью самого длинного общего префикса шаблона и текущего интервала поиска. Абуэльода, Курц и Охлебуш (2004) улучшить границу еще больше и добиться времени поиска как известно из суффиксные деревья.

Алгоритмы суффиксной сортировки могут использоваться для вычисления Преобразование Барроуза – Уиллера (BWT). В BWT требует сортировки всех циклических перестановок строки. Если эта строка заканчивается специальным символом конца строки, который лексикографически меньше, чем все остальные символы (например, $), то порядок сортировки с поворотом BWT матрица соответствует порядку суффиксов в массиве суффиксов. В BWT следовательно, можно вычислить за линейное время, сначала построив массив суффиксов текста, а затем выведя BWT нить: .

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

Многие дополнительные приложения массива суффиксов требуют LCP массив. Некоторые из них подробно описаны в раздел приложения последнего.

Примечания

  1. ^ Абуэльода, Мохамед Ибрагим; Курц, Стефан; Охлебуш, Энно (март 2004 г.). «Замена деревьев суффиксов расширенными массивами суффиксов». Журнал дискретных алгоритмов. 2 (1): 53–86. Дои:10.1016 / с1570-8667 (03) 00065-0. ISSN  1570-8667.
  2. ^ Кярккяйнен, Юха; Укконен, Эско (1996), "Редкие суффиксные деревья", Конспект лекций по информатике, Springer Berlin Heidelberg, стр. 219–230, Дои:10.1007/3-540-61332-3_155, ISBN  9783540613329
  3. ^ Гаврыховский, Павел; Коциумака, Томаш (январь 2017 г.). «Построение разреженного суффиксного дерева в оптимальное время и пространство». Материалы двадцать восьмого ежегодного симпозиума ACM-SIAM по дискретным алгоритмам. Филадельфия, Пенсильвания: Общество промышленной и прикладной математики: 425–439. arXiv:1608.00865. Дои:10.1137/1.9781611974782.27. ISBN  9781611974782. S2CID  6608776.
  4. ^ Абуэльода, Курц и Охлебуш 2004.
  5. ^ Абуэльода, Курц и Охлебуш, 2002 г..
  6. ^ Курц 1999.
  7. ^ а б Пуглиси, Смит и Терпин 2007.
  8. ^ Фишер 2011.
  9. ^ Буркхард и Кярккяйнен, 2003 г..
  10. ^ Кулла и Сандерс 2007.
  11. ^ Дементьев и др. 2008 г..
  12. ^ Ларссон, Н. Джеспер; Садакане, Кунихико (22 ноября 2007 г.). «Более быстрая сортировка суффиксов». Теоретическая информатика. 387 (3): 258–272. Дои:10.1016 / j.tcs.2007.07.017. ISSN  0304-3975.
  13. ^ Фишер, Йоханнес; Курпиц, Флориан (5 октября 2017 г.). «Разборка DivSufSort». Труды Пражской Стрингологической конференции 2017 г.. arXiv:1710.01896.

использованная литература

внешняя ссылка