Трие и суффиксное дерево и суффиксный массив

какая структура обеспечивает наилучшие результаты производительности; trie (дерево префиксов), дерево суффиксов или массив суффиксов? Существуют ли другие подобные структуры? Каковы хорошие реализации Java этих структур?

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

6 ответов


trie была первой обнаруженной структурой данных такого рода.

дерево суффиксов является улучшением по сравнению с trie (оно имеет суффиксные ссылки, которые позволяют линейный поиск ошибок, дерево суффиксов обрезает ненужные ветви trie, поэтому оно не требует столько места).

массив суффиксов-это урезанная структура данных, основанная на дереве суффиксов (без суффиксов (медленные совпадения ошибок), но сопоставление шаблонов очень быстрое).

trie не для реальный мир использует, потому что он потребляет слишком много места.

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

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

в том же семействе структур данных:

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

FCST берет его дальше, он реализует выборочное дерево суффиксов с массивом суффиксов.

DFCST является динамической версией FCST.

расширения:

двумя важными факторами являются использование пространства и время выполнения операции. Вы можете подумать, что с современными машинами это не актуально, но индексировать ДНК одного человека потребуется 40 Гб (используя несжатый и неоптимизированной суффиксное дерево). И чтобы построить один из этих индексов над этим количеством данных, может потребоваться несколько дней. Представьте себе Google, у него много данных для поиска, им нужен большой индекс по всем веб-данным, и они не меняют его каждый раз, когда кто-то строит веб-страницу. У них есть какая-то форма кэширования для этого. Однако основной индекс, вероятно, статичен. И каждые пару недель или около того они собирают все новые веб-сайты и данные и строят новый индекс, замена старого, когда новое закончено. Я не знаю, какой алгоритм они используют для индексирования, но это, вероятно, массив суффиксов со свойствами дерева суффиксов над секционированной базой данных.

CST использует 8 гигабайт, однако скорость работы дерева суффиксов сильно уменьшена.

массив суффиксов может сделать то же самое примерно за 700 Мегас до 2 Гигас. Однако вы не найдете генетических ошибок в ДНК с массивом суффиксов (что означает: поиск шаблона с подстановочным знаком много гораздо медленнее.)

FCST (полностью сжатое дерево суффиксов) может создать дерево суффиксов от 800 до 1,5 Гигас. С относительно небольшой скоростью ухудшения в сторону КНТ.

DFCST использует на 20% больше пространства, чем FCST, и теряет скорость статической реализации FCST (однако динамический индекс очень важен).

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

это сказало, дерево суффиксов имеет очень интересные результаты поиска для сопоставления шаблонов с ошибками. Aho corasick не так быстр (хотя почти так же быстр для некоторых операций, а не для сопоставления ошибок), и Бойер Мур остается в пыли.


какие операции вы планируете делать? libdivsufsort когда-то была лучшей реализацией массива суффиксов в C.


используя деревья суффиксов, вы можете написать что-то, что будет соответствовать вашему словарю вашему тексту в O(n+m+k) времени, где n-Буквы в вашем словаре, m-Буквы в вашем тексте, и k-количество совпадений. Попытки для этого намного медленнее. Я не уверен, что такое массив суффиксов, поэтому я не могу прокомментировать это.

тем не менее, это нетривиально для кода, и я не знаю никаких библиотек Java, которые предоставляют необходимые функции.


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

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

(описание в эти конспекты лекций, связанный с разделом "внешние ссылки" страницы Википедии, намного легче читать, чем описание на самой странице.)


Trie vs Suffix tree

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

Это означает, если у нас есть слово запроса, которое имеет 10 символов, поэтому нам нужно не более 10 шагов, чтобы найти его.

Бор : дерево для хранения строк, в котором есть один узел для каждого общего префикса. Строки хранятся в extra leaf узлы.

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

def от : Словарь алгоритмов и структур данных

обычно Trie используется для индексации слов словаря (лексики) или любых наборов строк пример D={abcd, abcdd, bxcdf,....., zzzz }

дерево суффиксов, используемое для индексирования текста с использованием той же структуры данных "Три" по всем суффиксам нашего текста T=abcdabcg все суффиксы T = {abcdabcg, abcdabc, abcdab, abcda, abcd, abc, a}

теперь это похоже на группы строк. мы строим Trie над этими группами строк (все суффиксы T).

конструкция обеих структур данных линейна, она принимает O(n) во времени и пространстве.

в случае dicionary (набор строк): n = сумма символов всех слов. в тексте : n = длина текста.

массив суффиксов: это техника для представления дерева суффиксов в сжатом sapce, это массив всех начальных позиций суффиксов строки.

Это медленнее, чем суффикс дерева во время поиска.

для получения дополнительной информации перейдите в Википедию, есть хорошая статья на эту тему.


этой реализация индуцированного алгоритма сортировки (называемого sais) имеет версию Java для построения массивов суффиксов.