Jump to content

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

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

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

Суффиксные массивы были представлены Манбером и Майерсом (1990) как простая и экономичная альтернатива суффиксным деревьям . Они были независимо открыты Гастоном Гонне в 1987 году под названием массив PAT ( Gonnet, Baeza-Yates & Snider 1992 ).

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

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

Определение

[ редактировать ]

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

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

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

Рассмотрим текст = banana$ индексироваться:

я 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

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

я = 1 2 3 4 5 6 7
= 7 6 4 2 1 5 3
1 $ а а а б н н
2 $ н н а а а
3 а а н $ н
4 $ н а а
5 а н $
6 $ а
7 $

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

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

[ редактировать ]

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

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

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

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

[ редактировать ]

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

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

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

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

[ редактировать ]

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

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

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

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

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

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

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

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

Хорошо известным рекурсивным алгоритмом для целочисленных алфавитов является DC3/skew алгоритм Kärkkäinen & Sanders (2003) . Он работает в линейном времени и успешно используется в качестве основы для параллельных вычислений. [10] и внешняя память [11] Алгоритмы построения суффиксных массивов.

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

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

Обобщенный массив суффиксов

[ редактировать ]

Понятие суффиксного массива можно распространить на более чем одну строку. Это называется обобщенным массивом суффиксов (или GSA), массивом суффиксов, который содержит все суффиксы для набора строк (например, и лексикографически сортируется со всеми суффиксами каждой строки. [16]

Приложения

[ редактировать ]

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

n = len(S)
def search(P: str) -> Tuple[int, int]:
    """
    Return indices (s, r) such that the interval A[s:r] (including the end
    index) represents all suffixes of S that start with the pattern P.
    """
    # Find starting position of interval
    l = 0  # in Python, arrays are indexed starting at 0
    r = n
    while l < r:
        mid = (l + r) // 2  # division rounding down to nearest integer
        # suffixAt(A[i]) is the ith smallest suffix
        if P > suffixAt(A[mid]):
            l = mid + 1
        else:
            r = mid
    s = l
    
    # Find ending position of interval
    r = n
    while l < r:
        mid = (l + r) // 2
        if suffixAt(A[mid]).startswith(P):
            l = mid + 1
        else:
            r = mid
    return (s, r)

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

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

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

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

Расширенные массивы суффиксов

[ редактировать ]

Суффиксные деревья — это мощные структуры данных, которые имеют широкое применение в областях сопоставления шаблонов и строк, индексации и текстовой статистики. Однако он занимает значительный объем места и, следовательно, имеет недостаток во многих приложениях реального времени, требующих обработки значительно больших объемов данных, таких как анализ генома. Чтобы преодолеть этот недостаток, были разработаны расширенные суффиксные массивы, которые представляют собой структуры данных, состоящие из суффиксных массивов и дополнительной таблицы, называемой дочерней таблицей, которая содержит информацию об отношениях родитель-потомок между узлами суффиксного дерева. Структура данных ветвления узлов для этого дерева представляет собой связанный список. Расширенные массивы суффиксов превосходят как с точки зрения эффективности использования пространства, так и с точки зрения временной сложности, и их легко реализовать. Более того, их можно применять к любому алгоритму, использующему суффиксное дерево, используя абстрактную концепцию lcp-интервальных деревьев. Временная сложность поиска шаблона в расширенном массиве суффиксов равна O(m|Σ|).

Массив суффиксов строки представляет собой массив из n целых чисел в диапазоне от 0 до n, который представляет n+1 суффиксов строки, включая специальный символ #.

Массив суффиксов состоит из двух массивов:

  1. pos массив pos[1,...n]: представляет собой отсортированный список всех суффиксов S. В массиве сохраняются только начальные позиции суффиксов, чтобы уменьшить сложность пространства, поскольку суффиксы слишком велики.
  2. lcp array lcp[1,...n]: это массив из n целых чисел, который поддерживает длины самого длинного общего префикса двух последовательных суффиксов, хранящихся в массиве pos.

Построение lcp-интервала

[ редактировать ]

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

Интервал [i,..j], 0 ≤ i ≤ j ≤ n является lcp-интервалом lcp-значения, если

1. lcptab[i] < l,

2. lcptab[k] ≥ l для всех i + 1 ≤ k ≤ j,

3. lcptab[k] = l для некоторого i + 1 ⩽ k ⩽ j, если i ≠ j, и l = n − i + 1, если i = j,

4. lcptab[j + 1] < l.

Длина самого длинного общего префикса pos[i − 1] и pos[i] хранится в lcp[i], где 2 ≤ i ≤ n. lcp-интервал отображает те же отношения родитель-потомок, что и между связанными узлами в суффиксном дереве S. Это показывает, что если соответствующий узел [i..j] является дочерним элементом соответствующего узла [k.. l], lcp-интервал [i..j] является дочерним интервалом другого lcp-интервала [k..l]. Если [k..l] является дочерним интервалом [i..j], lcp-интервал [i..j] является родительским интервалом lcp-интервала [k..l].

Создание дочерней таблицы

[ редактировать ]

Дочерняя таблица cldtab состоит из трех n массивов: up , down и nextlIndex . Информация о ребрах соответствующего суффиксного дерева хранится и поддерживается массивами up и down . Массив nextlIndex хранит ссылки в связанном списке, используемом для узлов ветвления суффиксного дерева.

Массив up , down и nextlIndex определяются следующим образом:

  1. Элемент up[i] записывает начальный индекс дочернего интервала самого длинного lcp-секундного интервала, который заканчивается индексом i-1 .
  2. Начальный индекс второго дочернего интервала самого длинного lcp-интервала, начиная с индекса i, хранится в элементе down[i] .
  3. Если и только если интервал не является ни первым дочерним, ни последним дочерним элементом своего родителя, элемент nextlIndex[i] содержит первый индекс следующего одноуровневого интервала самого длинного lcp-интервала, начиная с индекса i .

Выполняя обход lcp-интервала дерева снизу вверх, дочернюю таблицу можно построить за линейное время. Значения вверх/вниз и значения nextlIndex можно вычислить отдельно, используя два разных алгоритма.

[ редактировать ]

Суффиксные ссылки для расширенного массива суффиксов можно вычислить путем создания интервала суффиксных ссылок [ 1,..,r ] для каждого интервала [i,..j] во время предварительной обработки. Левый и правый элементы l и r интервала сохраняются в первом индексе [i,..,j]. Таблица для этого интервала находится в диапазоне от 0 до n. Таблица суффиксных ссылок создается путем обхода дерева lcp-интервалов слева направо в ширину. Каждый раз, когда вычисляется l -интервал, он добавляется в список l-интервалов, который называется l-списком. Когда значение lcp > 0, для каждого l -интервала[i,..,j] в списке вычисляется link[i]. Интервал [ l ,.., r ] вычисляется посредством двоичного поиска в списке ( l -1), где l — наибольшая левая граница среди всех l -1 интервалов. Интервал суффиксной ссылки [i,..j] представлен этим интервалом [ l,..,r ]. Значения l и r в конечном итоге сохраняются в первом индексе [i,..,j].

Примечания

[ редактировать ]
  1. ^ Jump up to: Перейти обратно: а б Абуэльхода, Курц и Олебуш, 2004 г.
  2. ^ Я, Кярккяйнен и Кемпа 2014 .
  3. ^ Гаврыховский и Коцюмака 2017 .
  4. ^ Абуэльхода, Курц и Олебуш 2002 .
  5. ^ Курц 1999 .
  6. ^ Jump up to: Перейти обратно: а б Пуглиси, Смит и Терпин 2007 .
  7. ^ Фишер 2011 .
  8. ^ Мори, Юта. «саис» . Архивировано из оригинала 9 марта 2023 года . Проверено 31 августа 2023 г.
  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 г.). «Демонтаж ДивСуфСорта». Материалы Пражской конференции по стрингологии 2017 . arXiv : 1710.01896 .
  14. ^ «Новая библиотека saca и bwt (libsais)» . encode.su . Проверено 3 октября 2021 г.
  15. ^ Гребнов, Илья (22 сентября 2021 г.), libsais , получено 2 октября 2021 г.
  16. ^ Он 1996 .
[ редактировать ]
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: 7a4297ec6a8d67bb0821fc2e61d618d5__1715681520
URL1:https://arc.ask3.ru/arc/aa/7a/d5/7a4297ec6a8d67bb0821fc2e61d618d5.html
Заголовок, (Title) документа по адресу, URL1:
Suffix array - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)