2011-01-14 5 views
2

Je fais un programme simple en Java. Étant donné un ensemble de lettres, il énumérera tous les mots (avec plus de 2 lettres) qui correspondent aux combinaisons de lettres. Par exemple:
Le mot donné est ward. Le résultat devrait être: quartier. cru, daw, guerre, rad
J'ai dans une base de données SQLite une liste énorme o mots anglais sous la forme originale et classée par lettres, ce sélectionnez les options plus rapidement.Quel schéma est-ce que je peux utiliser pour stocker des combinaisons de mots?


Le schéma de base de données ressemble:
dictionnaire: {id, mot, longueur}
anagram: {id, Anagramme, longueur}
anagram_dictionary: {id, word_id, anagram_id}


Avec le même exemple:
Lorsque l'état brut de mot est inséré
Il recherche pour ARW, et les résultats redonnent cru, guerre

Mon problème réside que chaque fois que je fais une recherche, il fait le calcul du combinations des lettres que je donne.

Pour l'exemple, il fait ce calcul:! (! 3 * 1)
4/(! 4 * 1) + 4/= 5

Mon problème est que la longueur des lettres donnée est 16. Je dois donc faire des combinaisons de 16 en 16 + combinaisons de 16 en 15 + ... + combinaisons de 16 en 1

Je dois améliorer la méthode car il faut des âges pour donner un résultat simple, mais je Ne fais pas maintenant comment? Donc, je tente de stocker dans la base de données, mais ne peux pas comprendre comment?

Merci à l'avance

Répondre

2

Je ne suis pas tout à fait sûr de vos contraintes et ressources, ce qui me aider à régler mon répondez mais ici ça va ...

Pendant que vous entrez votre dictionnaire, effectuez un pré-traitement. Comptez les fréquences comme le recommande CurtainDog. Maintenant, selon votre exemple, il semble que vous vouliez trouver le sous-ensemble de votre mot donné. Vous pouvez rechercher ses combinaisons ou vous pouvez éliminer celles qui ne correspondent pas à ce sous-ensemble.

ainsi

Obtenez le dictionnaire
de cela, votre parole donnée a un A, donc sauter cette lettre
de cela, votre parole donnée ne dispose pas d'un B, donc revenir tous les mots qui ne sont pas A partir de là, votre mot donné n'a pas de C, alors renvoyez tous les mots qui n'ont pas de C.
à partir de cela, votre mot donné a un D, ​​formatage amélioré donc passez cette lettre
etc ...

il semble que votre préoccupation était la croissance de l'exécution que votre mot donné avait plus de lettres. Avec cette solution, le temps d'exécution s'améliore avec des mots plus grands et votre pire scénario est (26-2) * (# de mots dans le dictionnaire)

0

Dans votre dictionnaire, stocker les fréquences de chaque lettre. Ensuite, construisez votre sélection pour ne renvoyer que les mots dont la fréquence des lettres correspond (ou inférieure si vous voulez pouvoir retourner des anagrammes partiels)

+0

J'ai enregistré en quelque sorte les fréquences, mais je dois encore obtenir toutes les combinaisons possibles des lettres pour correspondre aux fréquences. Comment puis-je améliorer cela? –

+0

Pourquoi avez-vous besoin de toutes les combinaisons pour faire correspondre les fréquences? –

3

Il semble que le moyen le plus efficace de le faire serait de stocker des mots en utilisant une clé alpha ordonnée (que vous avez déjà):

adn -> et, adn celrstu -> groupe etc ...

Prenez vos commentaires, alphabétiser les lettres, regardez vers le haut, un match. Terminé.

Si ce n'est pas la réponse à votre question, vous pouvez ajuster le libellé de votre question un peu ...

+0

Mais vous avez besoin d'un multimap (ou quelque chose comme un 'Map >'), car les différents mots peuvent avoir la même alphabétisation (par exemple "read" et "dear"). – Landei

+0

approche nice +1 - aucune autre carte requise, vous avez juste besoin d'une procédure pour commander la chaîne en cours – Randy

Questions connexes