Mathematica
Decidí comenzar de nuevo, ahora que entiendo las reglas del juego (creo).
Un diccionario de 10000 palabras de "palabras" únicas compuestas al azar (solo minúsculas) de longitud 3. De manera similar, se crearon otros diccionarios que consisten en cadenas de longitud 4, 5, 6, 7 y 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
toma la versión actual del diccionario para verificar. La palabra superior se une con variantes cíclicas (si existe alguna). La palabra y sus coincidencias se agregan a la lista de salida out
de palabras procesadas. Las palabras de salida se eliminan del diccionario.
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
recorre todas las palabras del diccionario.
f[dict_]:=FixedPoint[g,{dict,{}}][[2]]
Ejemplo 1 : palabras reales
r = f[{"teaks", "words", "spot", "pots", "sword", "steak", "hand"}]
Length[r]
{{"filete", "té"}, {"mano"}, {"ollas", "mancha"}, {"espada", "palabras"}}
4
Ejemplo 2 : palabras artificiales. Diccionario de cadenas de longitud 3. Primero, sincronización. Luego el número de palabras del ciclo.
f[d3]//AbsoluteTiming
Length[%[[2]]]
5402
Tiempos en función de la longitud de la palabra . 10000 palabras en cada diccionario.
No sé cómo interpretar los resultados en términos de O. En términos simples, el tiempo se duplica aproximadamente del diccionario de tres caracteres al diccionario de cuatro caracteres. El tiempo aumenta de manera insignificante de 4 a 8 caracteres.