Читал статью, где предлагалось использовать для хранения слов бинарное дерево. Но, простите - как?
От каждого узла есть лишь две ветви, а сам узел, как я понял, представляет собой определённую букву слова, на определённой позиции. То есть, при добавлении в дерево какого-нибудь нового слова, которое пересекается с какими-либо двумя до символа N, а дальше предлагает совершенно другую букву, оно нарушит тип дерева. Разъясните, пожалуйста, как применять (если это вообще реально) бинарные деревья для задачи поиска, например, синонимов к слову?
Как я в данный момент представляю решение (для русского алфавита):
Создать дерево, где каждый узел имеет следующий вид:
-Номер буквы
-Массив из 33 элементов такого же типа
-Флаг завершения слова. Используется в том случае, если данный узел определённой глубины является конечной буквой в некотором слове, может представлять из себя, например, группу байт, определяющих порядковый номер блока данных уже в самой базе синонимов.
Как перестроить то же на бинарное дерево?
Другие языки программирования и технологии
Бинарные деревья в алгоритме поиска слов
Делать это именно бинарным деревом действительно абсурдно. Хотя и вполне возможно. Но проще использовать, например, http://habrahabr.ru/post/111874/ - достаточно близко к тому, что ты придумал.
Вы определитесь, что вам конкретно надо. Вы сейчас описали отнюдь не бинарное дерево, а так называемое префиксное дерево, где вы сохраняете в структуру множество слов. Эффективность префиксного дерева в том, что она соединяет одинаковые префиксы слов. И нет, буква это не узел, а связь в этом случае. Бинарное же дерево совершенно другая структура, где у каждого узла максимум две связи: больше и меньше.
https://ru.wikipedia.org/wiki/Префиксное_дерево
https://ru.wikipedia.org/wiki/Двоичное_дерево
https://ru.wikipedia.org/wiki/Префиксное_дерево
https://ru.wikipedia.org/wiki/Двоичное_дерево
Не, всё совсем не так. Слово - неделимый объект, нельзя его делить на буквы. Между объектами определены отношения сравнения (больше, меньше, равно). Задача поиска синонимов не из этой области.
Строки-ключи сравниваются в двоичном дереве поиска в лексикографическом порядке, вот как раз в этом и есть суть, если меньше то левое поддерево, если больше правое поддерево, если нуль значит найден искомый ключ-строка. Но для строк есть различные деревья, такие как префиксное дерево, суфиксное дерево...
p.s. трудно изобрести свой эффективный "велосипед" без знаний хотя бы уже придуманных.
p.s. трудно изобрести свой эффективный "велосипед" без знаний хотя бы уже придуманных.
Дали бы ссылку на статью, было бы полегче понять, что вы хотите. Вы о Radix tree?
Просто бинарное дерево жутко неэффективное для поиска по началу слова. Применяются похожие на словари структуры:
-- на верхнем уровне массив букв, к каждой из которых привязана ссылка на второй уровень. Это уровень типа букв в телефонной книге.
-- на втором уровне тоже массив, но трехбуквенных сочетаний - это как в углу страницы словаря пишут КОН-КОР - слова начинающиеся на КОН и КОР, этот уровень ссылается либо на массив из ссылок на записи с полным словом, либо на следующий уровень, если слов, допустим на КОН- очень много.
-- на третьем уровне могут быть 4-буквенные сочетания типа КОНА-КОНГ, которые под собой уже имеют массив реальных указателей нс слова с таким началами.
Вам предлагают разбивать слова на части и хранить на разных уровнях (то есть вместо КОНА-КОНГ хранить А-Г, так как КОН уже выше уровнем), это по-идее экономит место, но не сильно, так как ссылки обычно занимают значительно больше места, чем несколько символов. Это просто не выгодно, а бинарное дерево даёт даже большие накладные расходы.
Такие структуры обычно хранятся с основными данными и периодически перестраиваются с нуля, начиная либо с какой-то ветви. Либо аналогично алгоритмам Б-дерева
Просто бинарное дерево жутко неэффективное для поиска по началу слова. Применяются похожие на словари структуры:
-- на верхнем уровне массив букв, к каждой из которых привязана ссылка на второй уровень. Это уровень типа букв в телефонной книге.
-- на втором уровне тоже массив, но трехбуквенных сочетаний - это как в углу страницы словаря пишут КОН-КОР - слова начинающиеся на КОН и КОР, этот уровень ссылается либо на массив из ссылок на записи с полным словом, либо на следующий уровень, если слов, допустим на КОН- очень много.
-- на третьем уровне могут быть 4-буквенные сочетания типа КОНА-КОНГ, которые под собой уже имеют массив реальных указателей нс слова с таким началами.
Вам предлагают разбивать слова на части и хранить на разных уровнях (то есть вместо КОНА-КОНГ хранить А-Г, так как КОН уже выше уровнем), это по-идее экономит место, но не сильно, так как ссылки обычно занимают значительно больше места, чем несколько символов. Это просто не выгодно, а бинарное дерево даёт даже большие накладные расходы.
Такие структуры обычно хранятся с основными данными и периодически перестраиваются с нуля, начиная либо с какой-то ветви. Либо аналогично алгоритмам Б-дерева
Похожие вопросы
- Как создать бинарное дерево в c++ новичку(т.е. мне)???!Помогите плз!
- Построение бинарного дерева (С/С++)
- как построить бинарное дерево
- В корзине лежит 20 яблок. Напишите алгоритм поиска наибольшего по размеру яблока.
- Алгоритм поиска на C++
- В какой книжке про С++ можно почитать о таких вещах, как структуры, бинарные деревья, красно-черные деревья? подскажите
- Говорят что готовые алгоритмы сортировок и поиска мало эффективны и не пригодны в использовании
- Вопрос по основам машинного кода и бинарного кода. Как это работает в своей основе?
- Почему программирование на первый взгляд такое сложное? Потому что многие не умеют составлять алгоритмы?
- Нужно ли быть очень сильным математиком и хорошо уметь конструировать алгоритмы на позиции Software Engineer?