matematica
Ho deciso di ricominciare, ora che ho capito le regole del gioco (penso).
Un dizionario di 10000 parole di "parole" univoche composte casualmente (solo lettere minuscole) di lunghezza 3. In modo simile sono stati creati altri dizionari costituiti da stringhe di lunghezza 4, 5, 6, 7 e 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
prende la versione corrente del dizionario per verificare. La parola in cima è unita a varianti cicliche (se ne esistono). La parola e le sue corrispondenze vengono aggiunte all'elenco di output out
delle parole elaborate. Le parole di output vengono rimosse dal dizionario.
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
scorre attraverso tutte le parole del dizionario.
f[dict_]:=FixedPoint[g,{dict,{}}][[2]]
Esempio 1 : parole reali
r = f[{"teaks", "words", "spot", "pots", "sword", "steak", "hand"}]
Length[r]
{{"bistecca", "teaks"}, {"mano"}, {"pentole", "spot"}, {"spada", "parole"}}
4
Esempio 2 : parole artificiali. Dizionario di stringhe di lunghezza 3. Primo, tempismo. Quindi il numero di parole del ciclo.
f[d3]//AbsoluteTiming
Length[%[[2]]]
5402
Tempi in funzione della lunghezza della parola . 10000 parole in ciascun dizionario.
Non so particolarmente come interpretare i risultati in termini di O. In termini semplici, i tempi raddoppiano approssimativamente dal dizionario dei tre caratteri al dizionario dei quattro caratteri. Il tempismo aumenta quasi trascurabilmente da 4 a 8 caratteri.