Matematyka
Postanowiłem zacząć od nowa, teraz, gdy rozumiem zasady gry (tak myślę).
Słownik o długości 10000 unikalnych, losowo skomponowanych „słów” (tylko małe litery) o długości 3. W podobny sposób utworzono inne słowniki składające się z ciągów o długości 4, 5, 6, 7 i 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
pobiera bieżącą wersję słownika do sprawdzenia. Górne słowo jest połączone z cyklicznymi wariantami (jeśli istnieją). Słowo i jego dopasowania są dołączane do listy out
wyników przetworzonych słów. Słowa wyjściowe są usuwane ze słownika.
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
przegląda słownik wszystkich słów.
f[dict_]:=FixedPoint[g,{dict,{}}][[2]]
Przykład 1 : rzeczywiste słowa
r = f[{"teaks", "words", "spot", "pots", "sword", "steak", "hand"}]
Length[r]
{{„stek”, „teaks”}, {„ręka”}, {„garnki”, „spot”}, {„miecz”, „słowa”}}
4
Przykład 2 : Sztuczne słowa. Słownik ciągów długości 3. Po pierwsze, czas. Następnie liczba słów cyklicznych.
f[d3]//AbsoluteTiming
Length[%[[2]]]
5402
Czasy jako funkcja długości słowa . 10000 słów w każdym słowniku.
Nie wiem szczególnie, jak interpretować wyniki w kategoriach O. Mówiąc prosto, czas z grubsza podwaja się ze słownika z trzema znakami do słownika z czterema znakami. Czas rośnie prawie pomijalnie z 4 do 8 znaków.