Trie против дерева суффикса против суффикса

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

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

Это была первая структура данных такого рода.

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

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

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

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

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

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

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

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

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

Расширение:

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

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

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

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

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

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

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

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

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

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

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

Это звучит как приложение для алгоритма Aho-Corasick : постройте автомат из словаря (в линейном времени), который затем может быть использован для поиска всех вхождений словаря слова в несколько текстов (также в линейном времени).

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

Trie vs Suffix tree

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • NSArray содержит метод Object
  • Как инициализировать std :: array элегантно, если T не является конструктивным по умолчанию?
  • Инициализация массива PowerShell
  • Как сортировать быстрый массив, содержащий экземпляры подclassа NSManagedObject, по значению атрибута (date)
  • Сохраняется ли порядок элементов в списке JSON?
  • Байт-массив для преобразования изображений
  • Разбить строку и поместить ее в массив int
  • Алгоритм перестановки для массива целых чисел в Java
  • Изменение размера массива при сохранении текущих элементов в Java?
  • Многомерные массивы в Swift
  • Использование массива нулевой длины
  • Давайте будем гением компьютера.