Mathematica
Décidé de recommencer, maintenant que je comprends les règles du jeu (je pense).
Un dictionnaire de 10000 mots de "mots" uniques composés au hasard (minuscules uniquement) de longueur 3. De la même manière, d'autres dictionnaires ont été créés, composés de chaînes de longueur 4, 5, 6, 7 et 8.
ClearAll[dictionary]
dictionary[chars_,nWords_]:=DeleteDuplicates[Table[FromCharacterCode@RandomInteger[{97,122},
chars],{nWords}]];
n=16000;
d3=Take[dictionary[3,n],10^4];
d4=Take[dictionary[4,n],10^4];
d5=Take[dictionary[5,n],10^4];
d6=Take[dictionary[6,n],10^4];
d7=Take[dictionary[7,n],10^4];
d8=Take[dictionary[8,n],10^4];
g
prend la version actuelle du dictionnaire pour vérifier. Le mot du haut est joint à des variantes cycliques (le cas échéant). Le mot et ses correspondances sont ajoutés à la liste de sortie out
des mots traités. Les mots de sortie sont supprimés du dictionnaire.
g[{wds_,out_}] :=
If[wds=={},{wds,out},
Module[{s=wds[[1]],t,c},
t=Table[StringRotateLeft[s, k], {k, StringLength[s]}];
c=Intersection[wds,t];
{Complement[wds,t],Append[out,c]}]]
f
parcourt tous les mots du dictionnaire.
f[dict_]:=FixedPoint[g,{dict,{}}][[2]]
Exemple 1 : mots réels
r = f[{"teaks", "words", "spot", "pots", "sword", "steak", "hand"}]
Length[r]
{{"steak", "teaks"}, {"hand"}, {"pots", "spot"}, {"sword", "words"}}
4
Exemple 2 : Mots artificiels. Dictionnaire de chaînes de longueur 3. Tout d'abord, le calendrier. Puis le nombre de mots du cycle.
f[d3]//AbsoluteTiming
Length[%[[2]]]
5402
Timings en fonction de la longueur des mots . 10000 mots dans chaque dictionnaire.
Je ne sais pas particulièrement comment interpréter les résultats en termes de O. En termes simples, le timing double à peu près du dictionnaire à trois caractères au dictionnaire à quatre caractères. Le timing augmente de façon presque négligeable de 4 à 8 caractères.