Mathematica
Решили начать снова, теперь, когда я понимаю правила игры (я думаю).
Словарь из 10000 слов уникальных случайно составленных «слов» (только в нижнем регистре) длиной 3. Аналогичным образом были созданы другие словари, состоящие из строк длиной 4, 5, 6, 7 и 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
принимает текущую версию словаря для проверки. Верхнее слово объединяется с циклическими вариантами (если они есть). Слово и его совпадения добавляются в список вывода out
обработанных слов. Выходные слова удаляются из словаря.
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
пробегает словарь всех слов.
f[dict_]:=FixedPoint[g,{dict,{}}][[2]]
Пример 1 : фактические слова
r = f[{"teaks", "words", "spot", "pots", "sword", "steak", "hand"}]
Length[r]
{{"steak", "teaks"}, {"hand"}, {"pots", "spot"}, {"sword", "words"}}
4
Пример 2 : Искусственные слова. Словарь строк длины 3. Во-первых, время. Тогда количество слов цикла.
f[d3]//AbsoluteTiming
Length[%[[2]]]
5402
Время как функция длины слова . 10000 слов в каждом словаре.
Я не особенно знаю, как интерпретировать результаты в терминах О. Проще говоря, время примерно удваивается от словаря из трех символов до словаря из четырех символов. Время увеличивается почти незаметно с 4 до 8 символов.