Какую возможную схему я могу использовать для хранения словосочетаний? - PullRequest
2 голосов
/ 14 января 2011

Я делаю простую программу на Java.При заданном наборе букв будут перечислены все слова (содержащие более 2 букв), которые соответствуют комбинациям букв.
Например:
Является ли данное слово верным.
Результат должен быть: приход . raw , daw , war , rad
У меня в базе данных sqlite огромный список английских слов в оригинальном видеи отсортировано по букве, это делает выбор быстрее.


Схема базы данных выглядит следующим образом:
словарь: {id, word, length}
anagram: {id, anagram, length}
anagram_dictionary: {id, word_id, anagram_id}


С тем же примером:
Когда вставлено слово raw
Он ищет arw , и результаты возвращают raw война

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

Для примера это математика:
4! / (4! * 1!) + 4! / (3! * 1!) = 5

Моя проблема в том, чтозаданная длина букв равна 16. Поэтому я должен составить комбинации из 16 в 16 + комбинации из 16 в 15 + ... + комбинации из 16 в 1

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

Заранее спасибо

Ответы [ 3 ]

3 голосов
/ 14 января 2011

Похоже, что наиболее эффективный способ сделать это - сохранить слова, используя упорядоченный по алфавиту ключ (который у вас уже есть):

adn -> и, днк celrstu -> кластер и т.д ...

Возьмите ваши данные, расположите буквы по алфавиту, найдите их, сопоставьте. Готово.

Если это не ответ на ваш вопрос, вы можете немного изменить формулировку вашего вопроса ...

2 голосов
/ 14 января 2011

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

Пока вы вводите свой словарь, выполните некоторую предварительную обработку.Подсчитайте частоты так, как рекомендует CurtainDog.

Теперь, основываясь на вашем примере, похоже, что вы хотите найти подмножество вашего данного слова.Вы можете искать его комбинации ИЛИ вы можете исключить те, которые не вписываются в это подмножество.

, таким образом

Получить словарьотсюда ваше заданное слово имеет букву A, поэтому пропустите эту буквуИсходя из этого, ваше заданное слово не имеет B, поэтому верните все слова, которые не имеют B.Исходя из этого, ваше заданное слово не имеет буквы C, поэтому верните все слова, в которых нет буквы C.Исходя из этого, ваше слово имеет D, улучшенное форматирование, поэтому пропустите эту буквутак далее...

кажется, что ваше беспокойство о том, что время выполнения растет, поскольку в вашем заданном слове больше букв.С этим решением время выполнения улучшается при использовании более крупных слов, а ваш худший сценарий - (26-2) * (количество слов в словаре)

0 голосов
/ 14 января 2011

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

...