![]() |
|
|
![]()
|
|
| trupca |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 22.7.2008 Репутация: нет Всего: нет |
можно перефразировать топик как "структура с быстрым доступом к содержащимся в ней строкам"?
передо мной стала проблема - нужно разобрать входящий поток данных (данные идут строками) на наличие в ней совпадений с некоторыми данными словами (включая и их словоформы). мне представилось что решение данной задачи - это организация некой структуры данных, которая представляла бы из себя аналог дерева в вершине которого, допустим, находится буква "д", а ноды второго и последующих уровней были пусты или содержали буквы являющиеся вторыми (третьими, четвёртыми и т.д.) знаками в искомом слове. пример для наглядности: о м а д е н ь в котором вершиной "дерева" является буква "д", ноды второго уровня это "о" и "е" и т.д. смысл же данной конструкции будет более понятен на примере её использования: допустим у нас есть строка "добрый день!" и нам нужно найти в ней вхождения слова "день". алгоритм для которого придумана эта структура будет посимвольно читать строку и сравнивать каждый прочитанный элемент с вершиной дерева и если будет найдено совпадение, то будет проверяться наличие на втором уровне нодов второго символа после совпадения (после буквы "д"). то бишь, программа читая строку, обнаружит первое совпадение в первом символе, затем во втором, но не найдя на третьем уровне нодов буквы "б", перейдёт к поиску совпадений с вершиной дерева, пока не наткнётся на совпадение "день" и "день" после чего сообщит что было найдено совпадение, {блок операторов, ...} и не продолжит делать тоже самое пока не встретит конец строки. ну и теперь вопрос. xD у этого есть какое-то конкретное название? просто я не находил ничего подобного в литературе и мне не от чего оттолкнуться в поисках реализации подобной структуры, конечно, если она существует в природе. ну и хотя бы примерных оценок производительности этих структуры и алгоритма. есть ли более простые (но в достаточной мере эффективные) способы эту проблему? конечно подобные изыскания очень интересны, но всё таки надо двигать проект. |
|||
|
||||
| Void |
|
|||
![]() λcat.lolcat ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2206 Регистрация: 16.11.2004 Где: Zürich Репутация: 3 Всего: 173 |
-------------------- “Coming back to where you started is not the same as never leaving.” — Terry Pratchett |
|||
|
||||
| AVA12 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 135 Регистрация: 4.5.2008 Репутация: 1 Всего: 4 |
Такие деревья обычно называют "trie" (по-русски - "бор" или "префиксное дерево"). Сложность поиска всех ключей - линейная от длины текста и максимальной длины ключа. Правда, за счет большого расхода памяти. Можно свести расход памяти к минимуму за счет усложнения алгоритма и некоторого увеличения времени работы, пример - "Patricia trie" aka "radix tree".
|
|||
|
||||
| Antiquar |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 14.9.2009 Репутация: нет Всего: нет |
Понятный и известный алгоритм поиска по дереву.
При правильной реализации скорость будет на уровне других алгоритмов, если конечно количество искомых слов (словоформ) не достигает десятков тысяч. Я же, когда занимался подобным, для ускорения работы делал еще первичное дерево - числовое. И в его узлы вносил преобразованные в число первые 4 символа искомых слов. Дало увеличение скорости на 20-30%. Но недостаток понятный - нельзя было задать слово для поиска менее 4 символов. |
|||
|
||||
| trupca |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 22.7.2008 Репутация: нет Всего: нет |
огромное спасибо. поиск по действующим названиям алгоритма и структуры данных срезу же дал результат.
ps как всё было бы проще если бы каждый автор не придумывал собственное название для данной структуры... |
|||
|
||||
![]()
|
| Правила форума "Алгоритмы" | |
|
|
Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Алгоритмы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |