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

редактировать
Дерево суффиксов для текста BANANA. Каждая подстрока заканчивается специальным символом $. Шесть путей от корня к листьям (показаны в виде прямоугольников) соответствуют шести суффиксов A$, NA$, ANA$, NANA$, ANANA$ и BANANA$. Цифры на листьях указывают начальную позицию соответствующего суффикса. При построении используются суффиксные ссылки, нарисованные пунктиром.

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

Построение такого дерева для струны требует времени и пространства линейно по длине. После построения можно быстро выполнить несколько операций, например, поиск подстроки в, поиск подстроки, если допустимо определенное количество ошибок, поиск совпадений для шаблона регулярного выражения и т. Д. Суффиксные деревья также предоставляют одно из первых решений для линейного времени. для самой длинной общей проблемы с подстрокой. За это ускорение приходится платить: для хранения дерева суффиксов строки обычно требуется значительно больше места, чем для хранения самой строки. S {\ displaystyle S} S {\ displaystyle S} S {\ displaystyle S}

СОДЕРЖАНИЕ
  • 1 Определение
  • 2 История
  • 3 Функциональность
  • 4 Приложения
  • 5 Реализация
  • 6 Параллельная конструкция
  • 7 Внешняя конструкция
  • 8 См. Также
  • 9 Примечания
  • 10 Ссылки
  • 11 Внешние ссылки
Определение

Дерево суффиксов для строки длины определяется как дерево, такое что: S {\ displaystyle S} п {\ displaystyle n}

  • На дереве ровно n листьев, пронумерованных от до. 1 {\ displaystyle 1} п {\ displaystyle n}
  • За исключением корня, каждый внутренний узел имеет не менее двух дочерних узлов.
  • Каждое ребро помечено непустой подстрокой. S {\ displaystyle S}
  • Никакие два ребра, начинающиеся из узла, не могут иметь строковые метки, начинающиеся с одного и того же символа.
  • Строка, полученная путем объединения всех строковых меток, найденных на пути от корня до листа, обозначает суффикс для от до. я {\ displaystyle i} S [ я . . п ] {\ displaystyle S [i..n]} я {\ displaystyle i} 1 {\ displaystyle 1} п {\ displaystyle n}

Поскольку такое дерево существует не для всех строк, оно дополняется терминальным символом, который не отображается в строке (обычно обозначается). Это гарантирует, что ни один суффикс не является префиксом другого, и что будут листовые узлы, по одному для каждого из суффиксов. Поскольку все внутренние некорневые узлы являются ветвящимися,  таких узлов может быть не более n - 1, а всего n  + ( n  - 1) + 1 = 2 n узлов ( n листьев, n  - 1 внутренних некорневых узлов, 1 корень). S {\ displaystyle S}$ п {\ displaystyle n} п {\ displaystyle n} S {\ displaystyle S}

Суффиксные ссылки являются ключевой особенностью старых алгоритмов построения линейного времени, хотя в большинстве новых алгоритмов, основанных на алгоритме Фараха, суффиксные ссылки отсутствуют. В полном суффиксном дереве все внутренние некорневые узлы имеют суффиксную ссылку на другой внутренний узел. Если путь от корня к узлу представляет собой строку, где - одиночный символ, а является строкой (возможно, пустой), он имеет суффиксную ссылку на внутренний узел, представляющий. См., Например, суффиксную ссылку от узла к узлу на рисунке выше. Суффиксные ссылки также используются в некоторых алгоритмах, работающих на дереве. χ α {\ displaystyle \ chi \ alpha} χ {\ displaystyle \ chi} α {\ displaystyle \ alpha} α {\ displaystyle \ alpha}ANANA

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

История

Эта концепция была впервые введена Вайнером (1973). Вместо того, чтобы суффикс S [ я. . п ], Веинер хранится в его синтаксическом дереве префикса идентификатор для каждой позиции, то есть, самую короткая строка, начиная с I и происходящей только один раз в S. Его алгоритм D берет несжатое дерево для S [ k +1.. n ] и расширяет его в дерево для S [ k. . n ]. Таким образом, начиная с тривиального дерева для S [ n. . n ], дерево для S [1.. n ] может быть построено путем n -1 последовательных вызовов алгоритма D; однако общее время выполнения составляет O ( n 2). Алгоритм Вайнера B поддерживает несколько вспомогательных структур данных для достижения линейного времени выполнения по размеру созданного дерева. Последние по-прежнему могут быть O ( n 2) узлами, например, для S = a n b n a n b n $. Алгоритм Вайнера C, наконец, использует сжатые попытки для достижения линейного общего размера хранилища и времени выполнения. Дональд Кнут впоследствии охарактеризовал последний как «Алгоритм 1973 года». Текст книга Аха, Хопкрофт amp; Ульман (1974, Sect.9.5) воспроизведены результаты Weiner в упрощенном и более элегантной форме, вводя термин дерева позиции.

McCreight (1976) была первой, чтобы построить (сжатый) все синтаксическое дерево суффиксов S. Хотя суффикс, начинающийся с i, обычно длиннее, чем идентификатор префикса, их представления пути в сжатом дереве не различаются по размеру. С другой стороны, МакКрайт мог обойтись без большинства вспомогательных структур данных Вайнера; остались только суффиксные ссылки.

Укконен (1995) еще больше упростил конструкцию. Он предоставил первое онлайн-построение суффиксных деревьев, теперь известных как алгоритм Укконена, с временем выполнения, которое соответствовало самым быстрым алгоритмам на тот момент. Все эти алгоритмы являются линейными по времени для алфавита постоянного размера и обычно имеют время работы в наихудшем случае. О ( п бревно п ) {\ Displaystyle О (п \ журнал п)}

Фарач (1997) дал первый алгоритм построения суффиксного дерева, оптимального для всех алфавитов. В частности, это первый алгоритм линейного времени для строк, взятых из алфавита целых чисел в полиномиальном диапазоне. Алгоритм Фараха стал основой для новых алгоритмов построения как суффиксных деревьев, так и суффиксных массивов, например, во внешней памяти, сжатой, сжатой и т. Д.

Функциональность

Суффиксное дерево для строки длины может быть построено во времени, если буквы происходят из алфавита целых чисел в полиномиальном диапазоне (в частности, это верно для алфавитов постоянного размера). Для более крупных алфавитов время выполнения определяется сначала сортировкой букв, чтобы привести их в диапазон размера ; в общем, на это нужно время. Приведенные ниже затраты даны в предположении, что алфавит постоянный. S {\ displaystyle S} п {\ displaystyle n} Θ ( п ) {\ Displaystyle \ Theta (п)} О ( п ) {\ Displaystyle О (п)} О ( п бревно п ) {\ Displaystyle О (п \ журнал п)}

Предположим, что суффиксное дерево было построено для строки длины или что обобщенное суффиксное дерево было построено для набора строк полной длины. Ты можешь: S {\ displaystyle S} п {\ displaystyle n} D знак равно { S 1 , S 2 , , S K } {\ Displaystyle D = \ {S_ {1}, S_ {2}, \ точки, S_ {K} \}} п знак равно п 1 + п 2 + + п K {\ displaystyle n = n_ {1} + n_ {2} + \ cdots + n_ {K}}

  • Искать строки:
    • Проверить, является ли строка длины подстрокой во времени. п {\ displaystyle P} м {\ displaystyle m} О ( м ) {\ Displaystyle О (м)}
    • Найдите первое вхождение паттернов общей длины в виде подстрок во времени. п 1 , , п q {\ Displaystyle P_ {1}, \ точки, P_ {q}} м {\ displaystyle m} О ( м ) {\ Displaystyle О (м)}
    • Найдите все вхождения паттернов общей длины как подстроки во времени. z {\ displaystyle z} п 1 , , п q {\ Displaystyle P_ {1}, \ точки, P_ {q}} м {\ displaystyle m} О ( м + z ) {\ Displaystyle О (т + г)}
    • Искать регулярное выражение P во времени, ожидаемом сублинейно в. п {\ displaystyle n}
    • Найдите для каждого суффикса шаблона длину самого длинного совпадения между префиксом и подстрокой во времени. Это называется статистикой соответствия для. п {\ displaystyle P} п [ я м ] {\ Displaystyle P [я \ точки м]} D {\ displaystyle D} Θ ( м ) {\ Displaystyle \ Theta (м)} п {\ displaystyle P}
  • Найдите свойства строк:
    • Найдите самые длинные общие подстроки в строке и по времени. S я {\ displaystyle S_ {i}} S j {\ displaystyle S_ {j}} Θ ( п я + п j ) {\ displaystyle \ Theta (n_ {i} + n_ {j})}
    • Найдите все максимальные пары, максимальные или сверхмаксимальные повторы во времени. Θ ( п + z ) {\ Displaystyle \ Theta (п + г)}
    • Найдите разложение Лемпеля – Зива по времени. Θ ( п ) {\ Displaystyle \ Theta (п)}
    • Найдите самые длинные повторяющиеся подстроки во времени. Θ ( п ) {\ Displaystyle \ Theta (п)}
    • Найдите наиболее часто встречающиеся подстроки минимальной длины по времени. Θ ( п ) {\ Displaystyle \ Theta (п)}
    • Найдите самые короткие строки из тех, которые не встречаются во времени, если такие строки есть. Σ {\ displaystyle \ Sigma} D {\ displaystyle D} О ( п + z ) {\ Displaystyle О (п + г)} z {\ displaystyle z}
    • Найдите самые короткие подстроки, встречающиеся только один раз. Θ ( п ) {\ Displaystyle \ Theta (п)}
    • Найдите для каждого из них самые короткие подстроки, которые не встречаются где-либо еще во времени. я {\ displaystyle i} S я {\ displaystyle S_ {i}} D {\ displaystyle D} Θ ( п ) {\ Displaystyle \ Theta (п)}

Суффиксное дерево может быть подготовлено для постоянного поиска наименьшего общего предка между узлами во времени. Затем можно также: Θ ( п ) {\ Displaystyle \ Theta (п)}

  • Найдите самый длинный общий префикс между суффиксами и in. S я [ п . . п я ] {\ displaystyle S_ {i} [п..n_ {i}]} S j [ q . . п j ] {\ displaystyle S_ {j} [q..n_ {j}]} Θ ( 1 ) {\ Displaystyle \ Theta (1)}
  • Найдите образец P длины m с не более чем k несовпадениями по времени, где z - количество совпадений. О ( k п + z ) {\ displaystyle O (kn + z)}
  • Найдите все максимальные палиндромы за или время, если допускаются промежутки в длине или если допускаются несоответствия. z {\ displaystyle z} Θ ( п ) {\ Displaystyle \ Theta (п)} Θ ( грамм п ) {\ Displaystyle \ Theta (gn)} грамм {\ displaystyle g} Θ ( k п ) {\ Displaystyle \ Theta (kn)} k {\ displaystyle k}
  • Найти все тандемные повторы в и К -mismatch тандемных повторов в. z {\ displaystyle z} О ( п бревно п + z ) {\ Displaystyle О (п \ журнал п + г)} О ( k п бревно ( п / k ) + z ) {\ Displaystyle О (кн \ журнал (п / к) + г)}
  • Найдите самые длинные общие подстроки по крайней мере строк в течение в времени. k {\ displaystyle k} D {\ displaystyle D} k знак равно 2 , , K {\ Displaystyle к = 2, \ точки, К} Θ ( п ) {\ Displaystyle \ Theta (п)}
  • Найдите самую длинную палиндромную подстроку данной строки (используя обобщенное суффиксное дерево строки и его обратное) за линейное время.
Приложения

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

  • Строка поиска, в O (м) сложности, где т есть длина подстроки (но с начальным O (N) время, необходимое для построения дерева суффиксов для строки)
  • Поиск самой длинной повторяющейся подстроки
  • Нахождение самой длинной общей подстроки
  • Поиск самого длинного палиндрома в строке

Деревья суффиксов часто используются в приложениях биоинформатики для поиска закономерностей в последовательностях ДНК или белков (которые можно рассматривать как длинные строки символов). Способность эффективно искать несоответствия можно считать их самой сильной стороной. Деревья суффиксов также используются при сжатии данных ; их можно использовать для поиска повторяющихся данных и на этапе сортировки преобразования Барроуза – Уиллера. Варианты схем сжатия LZW используют суффиксные деревья ( LZSS ). Суффиксное дерево также используется в кластеризации суффиксного дерева, алгоритме кластеризации данных, используемом в некоторых поисковых системах.

Выполнение

Если каждый узел и ребро могут быть представлены в пространстве, все дерево может быть представлено в пространстве. Общая длина всех строк на всех ребрах дерева равна, но каждое ребро может быть сохранено как позиция и длина подстроки S, что дает общее использование пространства компьютерными словами. Наихудший случай использования пространства суффиксного дерева проявляется в слове Фибоначчи, дающем полные узлы. Θ ( 1 ) {\ Displaystyle \ Theta (1)} Θ ( п ) {\ Displaystyle \ Theta (п)} О ( п 2 ) {\ Displaystyle О (п ^ {2})} Θ ( п ) {\ Displaystyle \ Theta (п)} 2 п {\ displaystyle 2n}

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

  • Стоимость поиска ребенка на данном персонаже.
  • Стоимость вставки ребенка.
  • Стоимость включения всех дочерних узлов узла (деленная на количество дочерних узлов в таблице ниже).

Пусть σ - размер алфавита. Тогда у вас есть следующие расходы:

Уважать Вставка Обход Списки братьев и сестер / несортированные массивы О ( σ ) Θ ( 1 ) Θ ( 1 ) Побитовые родственные деревья О ( бревно σ ) Θ ( 1 ) Θ ( 1 ) Хеш-карты Θ ( 1 ) Θ ( 1 ) О ( σ ) Сбалансированное дерево поиска О ( бревно σ ) О ( бревно σ ) О ( 1 ) Сортированные массивы О ( бревно σ ) О ( σ ) О ( 1 ) Хеш-карты + списки братьев и сестер О ( 1 ) О ( 1 ) О ( 1 ) {\ displaystyle {\ begin {array} {r | lll} amp; {\ text {Lookup}} amp; {\ text {Insertion}} amp; {\ text {Traversal}} \\\ hline {\ text {Списки братьев и сестер / несортировано массивы}} amp; O (\ sigma) amp; \ Theta (1) amp; \ Theta (1) \\ {\ text {Побитовые родственные деревья}} amp; O (\ log \ sigma) amp; \ Theta (1) amp; \ Theta (1) \\ {\ text {Хеш-карты}} amp; \ Theta (1) amp; \ Theta (1) amp; O (\ sigma) \\ {\ text {Сбалансированное дерево поиска}} amp; O (\ log \ sigma) amp; O (\ log \ sigma) amp; O (1) \\ {\ text {Сортированные массивы}} amp; O (\ log \ sigma) amp; O (\ sigma) amp; O (1) \\ {\ text {Хеш-карты + списки родственников}} amp; O (1) amp; O (1) amp; O (1) \ end {array}}}

Стоимость вставки амортизируется, а затраты на хеширование приведены для идеального хеширования.

Большой объем информации на каждом ребре и узле делает суффиксное дерево очень дорогим, занимая примерно в 10-20 раз объем памяти исходного текста в хороших реализациях. Массив суффиксов уменьшает это требование к фактору 8 (для массива, включая LCP значения, построенные в пределах 32-битное адресное пространство и 8-битных символов.) Этот фактор зависит от свойств и может достигать 2 с использованием 4-байтовыми широких символов ( необходимо содержать любой символ в некоторых UNIX-подобных системах, см. wchar_t ) в 32-битных системах. Исследователи продолжали находить более мелкие структуры индексации.

Параллельное строительство

Были предложены различные параллельные алгоритмы для ускорения построения дерева суффиксов. Недавно был разработан практический параллельный алгоритм построения суффиксного дерева с работой (последовательное время) и промежутком. Алгоритм обеспечивает хорошую параллельную масштабируемость на многоядерных машинах с общей памятью и может индексировать геном человека - примерно 3 ГБ - менее чем за 3 минуты с использованием 40-ядерной машины. О ( п ) {\ Displaystyle О (п)} О ( бревно 2 п ) {\ Displaystyle О (\ журнал ^ {2} п)}

Внешняя конструкция

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

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

С другой стороны, были проведены практические работы по построению суффиксных деревьев на основе дисков, которые масштабируются до (нескольких) ГБ / час. Самыми современными методами являются TDD, TRELLIS, DiGeST и B 2 ST.

TDD и TRELLIS масштабируются до всего генома человека, в результате получается суффиксное дерево на диске размером в десятки гигабайт. Однако эти методы не могут эффективно обрабатывать наборы последовательностей, превышающие 3 ГБ. DiGeST работает значительно лучше и может обрабатывать наборы последовательностей размером порядка 6 ГБ примерно за 6 часов.. Все эти методы позволяют эффективно строить суффиксные деревья для случая, когда дерево не помещается в основной памяти, но входные данные помещаются. Самый последний метод, B 2 ST, масштабируется для обработки входных данных, которые не помещаются в основную память. ERA - это недавний метод построения параллельного дерева суффиксов, который стал значительно быстрее. ERA может проиндексировать весь геном человека за 19 минут на 8-ядерном настольном компьютере с 16 ГБ оперативной памяти. В простом кластере Linux с 16 узлами (4 ГБ ОЗУ на узел) ERA может проиндексировать весь геном человека менее чем за 9 минут.

Смотрите также
Заметки
Рекомендации
Внешние ссылки
Последняя правка сделана 2023-03-20 05:08:55
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте