2013-07-20 1 views
2

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

Предположим, что «Ap» является подстрокой,
«Apple» и «Application» должны быть возвращены.
Поскольку в этом случае «Ap» находится в начале двух строк, я могу думать об использовании Tries.

Но что, если подстрока, которую нужно подобрать, можно найти где угодно в словах словарного запаса?
Например: Если указано «ap», также должна быть возвращена «форма», так как «ap» встречается в «форме».

Комплект словарных букетов очень большой.

+0

Что определяет лучше всего? Самый быстрый, самый маленький. Что ты пробовал? Есть способы, которыми вы можете оптимизировать, используя ограничения, например, нечувствительные к регистру, но нет волшебной палочки. –

+0

@Tony Fastest .. –

+0

Я сделал что-то вроде этого один раз для поиска слова scrabble, но у него было намного больше ограничений для оптимизации и необходимости находить все слова с шаблоном, подобным A? P. Это существенно сломило словарь в словарь словаря списков. Таким образом, у меня был словарь всех слов с A в них, в котором содержался словарь списков, для какой позиции в слове A. Был использован большой объем памяти и потребовалось некоторое время для загрузки. –

ответ

1

Что вы хотите, это suffix tree. В нем хранятся все суффиксы (набор) строк в trie (в вашем случае набор слов). Каждый лист trie связан с набором строк, которые имеют этот суффикс.

При поиске подстроки вы просто сопоставляете подстроку в корне trie; ваша подстрока должна быть префиксом какого-либо суффикса или нет совпадения. Обнаружение существования существования совпадения - это линейное время в длине подстроки. Чтобы определить все совпадающие слова, вы должны перечислить все листы из trie, доступные с того места, где заканчивается матч. Это проблема с деревом; если дерево имеет значительное разветвление, это может быть немного дорого.

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

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