Mathematica
Decidi começar de novo, agora que entendo as regras do jogo (acho).
Um dicionário de 10000 palavras de "palavras" únicas compostas aleatoriamente (somente em minúsculas) de comprimento 3. De maneira semelhante, outros dicionários foram criados, consistindo em cadeias de comprimento 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
leva a versão atual do dicionário para verificar. A palavra superior é associada a variantes cíclicas (se houver alguma). A palavra e suas correspondências são anexadas à lista de saída out
, de palavras processadas. As palavras de saída são removidas do dicionário.
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
percorre o dicionário de todas as palavras.
f[dict_]:=FixedPoint[g,{dict,{}}][[2]]
Exemplo 1 : palavras reais
r = f[{"teaks", "words", "spot", "pots", "sword", "steak", "hand"}]
Length[r]
{{"bife", "teca"}, {"mão"}, {"panelas", "ponto"}, {"espada", "palavras"}}
4
Exemplo 2 : Palavras artificiais. Dicionário de cadeias de comprimento 3. Primeiro, tempo. Então o número de palavras do ciclo.
f[d3]//AbsoluteTiming
Length[%[[2]]]
5402
Tempos em função do comprimento da palavra . 10000 palavras em cada dicionário.
Não sei particularmente como interpretar as descobertas em termos de O. Em termos simples, o tempo praticamente dobra do dicionário de três caracteres para o dicionário de quatro caracteres. O tempo aumenta quase de forma insignificante de 4 a 8 caracteres.