Anagrammes, solution efficace pour les trouver ? - PHP - Programmation
Marsh Posté le 26-09-2004 à 14:04:15
le pb de tous les mots ayant les meme lettres c qu'ensuite faut faire gaffe au doublons de lettres !
moi je vois une solution : pour chaque mot tu fait un anagramme qui ne veux rien dire mais qui a toutes les lettres de ce mot mais dans l'ordre alphabetique résultat tu fait pareil pour le mot que tu cherche et t'as qu'a faire un relevé
exemple :
Loupi -> ilopu
poilu -> ilopu
bob -> bbo
....
tien moi au courant !
Marsh Posté le 26-09-2004 à 16:20:39
bon je recommence
pour TOUT tes mots dans ta bdd tu creer un 'mot joint' suivant cette regle : chaque mo joint contient toutes les lettres du mot d'origine mais triées par ordre alphabetique
exemple :
Code :
|
ensuite quand tu cherche un annagramme tu prend le ton mot d'origine :
Loupi et tu fait la meme chose
Loupi -> ilopu
ensuite tu cherche dans ta base de données ce 'mot joint'. a chaque fois que tu trouve ce 'mot join',
tu sais que le mot correspondant est un annagramme
l'avantage c que t'as juste a parcourrir 1 fois ta bdd sans regle trop compliquée de comparaison puisque le champ doit etre egal à ton 'mot joint'.
pareil si tu utilise un fichier a la place de ta bdd, un coup de ereg ou d'une fonction parallele et tu recupere ton mot !
envoie moi ton fichier de mots et je te montrerai !
Marsh Posté le 26-09-2004 à 18:18:43
hannnn terrible comme solution
Pour les fichiers, j'ai cherché mais j'avais supprimée le programme, ceci-dit il est sur telecharger.com, j'avais fait une recherche sur anagramme et scrabble, j'ai essayé de le retrouver mais pas moyen (j'en ai reinstaller 4 sans succés )
Marsh Posté le 26-09-2004 à 18:26:37
de rien
c un pb auquel j'avais refléchi et en fait t obligé de te derouter completement de la constitution d'un mot pour arriver a en comparer plusieurs !
je cherche un dico correcte et la j'en ai trouvé un de 3.5Mo
y a tout les verbes conjugués dedans je crois
soit 336531 mots - ca va exploser ma base sql de free je crois !
Marsh Posté le 26-09-2004 à 19:07:50
jolly a écrit : de rien |
C'est le dico d'un programme à télécharger ou tu l'a trouvé ailleurs?
Marsh Posté le 26-09-2004 à 19:11:20
Arf, un bête array_intersect est largement suffisant... Faudrait commencer à consulter la doc de temps en temps...
Marsh Posté le 26-09-2004 à 19:33:50
Hermes le Messager a écrit : Arf, un bête array_intersect est largement suffisant... Faudrait commencer à consulter la doc de temps en temps... |
ouais et tu veux qu'on la connaisse comment la fonction? Elle est peu utilisée, n'a pas un nom explicite, et je me vois mal lire la doc entière avec ses milliers de fonctions
Marsh Posté le 26-09-2004 à 20:24:59
ah conais pas cette fonction !
mais apres ton array intersec, t'as encore a comparer la longueure du résultat ....
et pour 3 millions de mots ca fait quand meme bcp
je pense aussi que c plus lourd qu'une comparaison cde chaines 'simples'
Marsh Posté le 26-09-2004 à 21:13:11
jolly a écrit : ah conais pas cette fonction ! |
C'est ce que je pense aussi, avec ta méthode il suffit de faire un select * from machin where truc = truc2, une seule et unique requete, on peut pas faire plus léger
Marsh Posté le 26-09-2004 à 22:02:42
sauf sur la quantité de mots
a la rigueure je peense qu'il serait interessant de fragmenter selon la longueure des mots en plusieures tables mais je suis pas sur que 3 000 000 d'entrées dans Mysql soit si lourd que ca a gerer !
en fait je bug deja dans la creation des entrées (timeout) alors !
Marsh Posté le 26-09-2004 à 22:34:24
jolly a écrit : ah conais pas cette fonction ! |
Non, il suffit de prendre la longueur de la chaine et de comparer avec le nombre d'occurences. c'est rêglé en 2 lignes.
Marsh Posté le 26-09-2004 à 22:36:01
aspegic500mg a écrit : ouais [u]et tu veux qu'on la connaisse comment la fonction[/u]? Elle est peu utilisée, n'a pas un nom explicite, et je me vois mal lire la doc entière avec ses milliers de fonctions |
Et comment tu crois que je l'ai trouvé la fonction ?
Tu prends la doc PHP en .chm, tu vas sur rechercher, tu mets tableaux, et tu regardes les fonctions capables de comparer deux tables. C'est aussi simple que ça, sachant que pour comparer la composition de 2 mots, tu devras passer par des tables de lettres...
Marsh Posté le 26-09-2004 à 22:49:02
la Hermes a raison : la seule solution pour trouver les bonnes fonction c de potasser les manuels et de chercher !
Marsh Posté le 26-09-2004 à 23:32:21
Je vois pas pourquoi j'aurai cherché à comparer 2 tableaux pour trouver des anagrammes, justement je demandais comment faire ca de manière efficace
Bon faut vraiment que je trouve ces fichiers de mots que j'avais, pour pouvoir tester ce bordel! (jolly si tu veux être généreux c'est le moment )
Marsh Posté le 27-09-2004 à 21:29:38
(je réitère)
je t'offre toute ma considération
mais la ca me reloute : 3 million de mots c enorme
ca explose deja un peu les timeout chez moi !!
Marsh Posté le 26-09-2004 à 02:56:28
J'ai téléchargé un ptit logiciel pour trouver les anagrammes d'un mot (tous les mots ayant les memes lettres qu'un autre, dans un ordre different, ex: loupi -> poilu ,ok ca veut rien dire mais c'est pour l'exemple ), et dans son dossier d'installation il y'a des fichiers textes contenant des dizaines(des centaines?) de milliers de mots triés alphabétiquement.
Je me demande comment faire en php pour trouver les anagrammes d'un mot, il y'a la solution d'une regex ("tous les mots ayant toutes les lettres du mot de départ" ) et de passer tous les mots de la bdd en revue à la suite, trés lourd tout de meme. Verriez-vous une autre solution