Попытки против троичных деревьев поиска для автозаполнения?

Я прошел через попытки и троичные деревья поиска, и у меня есть некоторые вопросы по ним. У меня есть ответы в Google, но я не могу получить конкретный ответ на них. Итак, вот мои вопросы.

  1. Если попытки неэффективны, а TST сочетают в себе лучшее от BST и попыток, значит ли это, что попытки практически не используются?

  2. Если предположить, что TST используются для автозаполнения, как это будет работать в случае с Google? Я имею в виду, что практически у нас нет фиксированного набора слов и т. д. Так как же будет построено дерево для TST?


person Pavan Dittakavi    schedule 10.06.2012    source источник
comment
Вы также изучали Патрицию Триес? Кажется, что они являются золотой серединой между Trie и TST.   -  person Justin    schedule 10.06.2012


Ответы (1)


Попытки и троичные деревья поиска представляют собой компромисс между временем и пространством. Если в вашем алфавите есть k символов, то каждый узел в дереве содержит k указателей плюс один дополнительный бит, определяющий, кодирует ли узел слово. Поиск слова длины L всегда занимает время O(L). Троичное дерево поиска хранит три указателя на узел, плюс один символ и один бит, указывающий, кодирует ли узел слово. Поиск слова длины L занимает время O(L log k). (Если у вас есть статическое троичное дерево поиска, вы можете построить TST, используя деревья со сбалансированным весом, что сокращает время поиска до O(L + log k), но делает вставки непомерно дорогими.)

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

Таким образом, ни одна из структур не является строго лучшей, чем другая. Это зависит от того, какие слова хранятся.

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

Что касается того, как их строить - и попытки, и троичные деревья поиска поддерживают эффективную вставку одного слова. Их не нужно заранее строить из фиксированного набора слов.

Надеюсь это поможет!

person templatetypedef    schedule 10.06.2012
comment
Для случаев, когда каждый узел в Trie использует большинство своих дочерних элементов, Trie значительно более эффективно использует пространство и время, чем троичное дерево поиска. Если каждый узел хранит сравнительно мало дочерних узлов, троичное дерево поиска гораздо более эффективно использует пространство. В случае Trie каждый узел может иметь до k указателей, что означает много памяти и, следовательно, неэффективное использование пространства. Но в случае нескольких дочерних узлов на узел использование динамической коллекции, такой как список или карта, вместо массива может сэкономить место. Таким образом, попытки не так уж плохи с точки зрения пространства, даже если на узел приходится несколько дочерних узлов. - person Meena Chaudhary; 06.11.2014
comment
@MeenaChaudhary Это правда, хотя эти структуры данных менее эффективны по времени, чем стандартный массив. Все это компромисс! - person templatetypedef; 07.11.2014