LINUX.ORG.RU

Это чудное слово «словарь»...


1

2

Что можно было бы использовать для словаря слов вместо чего-нибудь древовидного?

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

Плюсы были «очевидны»:
- Размер нода = размер символа
- Размер словаря байтах не превышает суммарный размер слов
- Поиск - логарифмический, десятки (раньше, на пнях вторых) и сотни тыщ слов в секунду щас.
- Легко скинуть в файл, прочесть из файла.

Вот, в очередной раз задумался - мож я отстал от жизни и давно есть структура, превосходящая банальное древо по указанным качествам?

- Поиск - логарифмический

Не логарифический от количества слов, а линейный от длины слова. Количество хранимых слов не важно. Ы?

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

Manhunt ★★★★★
()

Принципиально ничего менять не надо и всё правильно, разве что ещё раз почитать про suffix trie, patricia trie (например чтобы оптимизировать размер) и иже с ними.

invy ★★★★★
()
Ответ на: комментарий от Manhunt

Ы?

Ы. Да, с логарифмом по поиску мой память дал маху.

она будет быстрее дерева

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

malbolge ★★
() автор топика
Ответ на: комментарий от malbolge

Один мой коллэга лишь за счет смены хеш-функции для строки в своем проекте уменьшил время вычислений с суток до часа.

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

Manhunt ★★★★★
()
Ответ на: комментарий от Manhunt

Тут же про подбор коллизий для dos пока не вспоминали. Или это превентивные меры?)

anonymous
()

если хочется изврата - можно почитать работы Phil Bagwell

shty ★★★★★
()

Размер нода = размер символа

Это как??? Вообще то размер нода - длина алфавита на размер пойнтера??

Размер словаря байтах не превышает суммарный размер слов

Умноженный на длину алфавита на размер пойнтера???

Еще есть либо хэш-таблица, либо rb_tree. Хотя большинство хэшей к-е я видел (я правда с ними мало работал), это вычисление хэша (long) + то же дерево по хэшу + разрешение коллизий. В STL std::map (rb_tree) на порядок тормознутее std::unordered_map (хэш + дерево по хэш-значениям), пока коллизии не начинаются.

Для строк ИМНО разумный хэш без коллизий лучше дерева (не надо строки сравнивать, это м.б. долго), но теряется упорядоченность.

AIv ★★★★★
()

Медленный поиск какой-то. Хеш таблица должна десятки-сотни миллионов поисков в секунду легко выдавать.

Legioner ★★★★★
()
Ответ на: комментарий от Legioner

Хеш таблица не подойдет по требованию компактности. В дереве у нас префиксы одинаковые не повторяются, а вот в указанном выше DAWG - еще и суффиксы слов объединяются. В хеш таблице такого «сжатия» нет.

malbolge ★★
() автор топика
Ответ на: комментарий от Legioner

Ну, немножко лажанул - размер символа + 4 байта индекса.

malbolge ★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.