stringtranslate.com

Дерево суффиксов

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

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

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

История

Эта концепция была впервые введена Вайнером (1973). Вместо суффикса Вайнером [3] был сохранен идентификатор префикса для каждой позиции, то есть самая короткая строка, начинающаяся с и встречающаяся только один раз в . Его алгоритм D берет несжатый [4] trie для и расширяет его до trie для . Таким образом, начиная с тривиального trie для , trie для может быть построен путем последовательных вызовов алгоритма D; однако общее время выполнения равно . Алгоритм Вайнера B поддерживает несколько вспомогательных структур данных для достижения общего времени выполнения, линейного по размеру построенного trie. Последние по-прежнему могут быть узлами, например, для Алгоритм Вайнера C , наконец, использует сжатые попытки для достижения линейного общего размера хранилища и времени выполнения. [5] Дональд Кнут впоследствии охарактеризовал последний как «Алгоритм года 1973» по словам его ученика Воана Пратта . [ оригинальное исследование? ] [6] Учебник Ахо, Хопкрофта и Ульмана (1974, раздел 9.5) воспроизвел результаты Вайнера в упрощенной и более элегантной форме, введя термин « дерево позиций» .

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

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

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

Определение

Дерево суффиксов для строки длины определяется как дерево, такое что: [7]

  1. Дерево имеет ровно n листьев, пронумерованных от до .
  2. За исключением корня, каждый внутренний узел имеет как минимум двух дочерних узлов.
  3. Каждое ребро помечено непустой подстрокой .
  4. Никакие два ребра, выходящие из узла, не могут иметь строковые метки, начинающиеся с одного и того же символа.
  5. Строка, полученная путем объединения всех строковых меток, найденных на пути от корня до листа, образует суффикс , для от до .

Если суффикс также является префиксом другого суффикса, то такого дерева для строки не существует. Например, в строке abcbc суффикс bc также является префиксом суффикса bcbc . В таком случае путь, прописывающий bc , не будет заканчиваться листом, что нарушает пятое правило. Чтобы исправить эту проблему, дополняется терминальным символом, которого нет в строке (обычно обозначается ). Это гарантирует, что ни один суффикс не является префиксом другого, и что будут листовые узлы, по одному для каждого из суффиксов . [8] Поскольку все внутренние некорневые узлы являются ветвящимися, таких узлов может быть не более, а всего узлов ( листья, внутренние некорневые узлы, 1 корень).$

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

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

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

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

Предположим, что суффиксное дерево построено для строки длины , или что обобщенное суффиксное дерево построено для набора строк общей длины . Вы можете:

Дерево суффиксов может быть подготовлено для постоянного поиска наименьшего общего предка между узлами во времени. [17] Затем можно также:

Приложения

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

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

Выполнение

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

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

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

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

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

Параллельная конструкция

Были предложены различные параллельные алгоритмы для ускорения построения суффиксного дерева. [27] [28] [29] [30] [31] Недавно был разработан практический параллельный алгоритм для построения суффиксного дерева с работой (последовательное время) и диапазоном . Алгоритм достигает хорошей параллельной масштабируемости на многоядерных машинах с общей памятью и может индексировать человеческий геном — примерно 3 ГБ — менее чем за 3 минуты, используя 40-ядерную машину. [32]

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

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

Существуют теоретические результаты для построения деревьев суффиксов во внешней памяти. Алгоритм Farach-Colton, Ferragina & Muthukrishnan (2000) теоретически оптимален, со сложностью ввода-вывода, равной сложности сортировки. Однако общая сложность этого алгоритма до сих пор не позволяла реализовать его на практике. [33]

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

TDD и TRELLIS масштабируются до всего генома человека, что приводит к созданию дерева суффиксов на диске размером в десятки гигабайт. [34] [35] Однако эти методы не могут эффективно обрабатывать коллекции последовательностей, превышающие 3 ГБ. [36] DiGeST работает значительно лучше и способен обрабатывать коллекции последовательностей размером порядка 6 ГБ примерно за 6 часов. [36]

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

Смотрите также

Примечания

  1. ^ Дональд Э. Кнут; Джеймс Х. Моррис; Воган Р. Пратт (июнь 1977 г.). «Быстрое сопоставление шаблонов в строках» (PDF) . Журнал SIAM по вычислениям . 6 (2): 323–350. doi :10.1137/0206024.Здесь: стр.339 внизу.
  2. ^ В 1970 году Кнут предположил, что эта задача не может быть решена за линейное время. [1] В 1973 году это было опровергнуто алгоритмом суффиксного дерева Вайнера (1973).
  3. ^ Этот термин используется здесь для того, чтобы отличить предшествующие структуры данных Вайнера от настоящих суффиксных деревьев, определенных выше и не рассматривавшихся до МакКрейта (1976).
  4. ^ т.е. каждая ветвь помечена одним символом
  5. ^ Смотрите Файл:WeinerB aaaabbbbaaaabbbb.gif и Файл:WeinerC aaaabbbbaaaabbbb.gif для несжатого примера дерева и его сжатого соответствия.
  6. ^ аб Гигерих и Курц (1997).
  7. ^ Гасфилд (1999) , стр.90.
  8. ^ Гасфилд (1999) , стр.90-91.
  9. ^ Фарах (1997).
  10. ^ Гасфилд (1999) , стр.92.
  11. ^ Гасфилд (1999) , стр.123.
  12. ^ Баеза-Йейтс и Гоннет (1996).
  13. ^ Гасфилд (1999) , стр.132.
  14. ^ Гасфилд (1999) , стр.125.
  15. ^ Гасфилд (1999) , стр.144.
  16. ^ Гасфилд (1999) , стр.166.
  17. ^ Гасфилд (1999) , Глава 8.
  18. ^ Гасфилд (1999) , стр.196.
  19. ^ Гасфилд (1999) , стр.200.
  20. ^ Гасфилд (1999) , стр.198.
  21. ^ Гасфилд (1999) , стр.201.
  22. ^ Гасфилд (1999) , стр.204.
  23. ^ Гасфилд (1999) , стр.205.
  24. ^ Гасфилд (1999) , стр.197–199.
  25. ^ ab Allison, L. "Suffix Trees". Архивировано из оригинала 2008-10-13 . Получено 2008-10-14 .
  26. ^ Впервые представлено Замиром и Эциони (1998).
  27. ^ Апостолико и др. (1988).
  28. ^ Харихаран (1994).
  29. ^ Сахиналп и Вишкин (1994).
  30. ^ Фарах и Мутукришнан (1996).
  31. ^ Илиопулос и Риттер (2004).
  32. ^ Шун и Блеллок (2014).
  33. ^ Смит (2003).
  34. ^ ab Tata, Hankins & Patel (2003).
  35. ^ аб Пхупакди и Заки (2007).
  36. ^ abc Барски и др. (2008).
  37. ^ ab Барски и др. (2009).
  38. ^ Мансур и др. (2011).

Ссылки

Внешние ссылки