排列平方根


21

在数学上,阶数n置换 σ是从整数1 ... n到其自身的双射函数。此清单:

2 1 4 3

表示置换σ,使得σ(1)= 2,σ(2)= 1,σ(3)= 4,σ(4)= 3。

置换σ的平方根是一个置换,当应用于自身时,得出σ。例如,2 1 4 3具有平方根τ = 3 4 2 1

k           1 2 3 4
τ(k)        3 4 2 1
τ(τ(k))     2 1 4 3

因为对于所有1≤k≤n,ττ(k))= σ(k)。

输入项

n > 0个整数组成的列表,都在1到n之间(包括1和n),表示一个排列。排列将始终具有平方根。

只要输入和输出一致,就可以使用0 ... n-1列表。

输出量

排列的平方根,也作为数组。

限制条件

您的算法必须在n的多项式时间内运行。这意味着您不能只遍历所有nn阶排列。

允许任何内置函数。

测试用例:

请注意,许多输入具有多个可能的输出。

2 1 4 3
3 4 2 1

1
1

3 1 2
2 3 1

8 3 9 1 5 4 10 13 2 12 6 11 7
12 9 2 10 5 7 4 11 3 1 13 8 6

13 7 12 8 10 2 3 11 1 4 5 6 9
9 8 5 2 12 4 11 7 13 6 3 10 1

我要说的是,对于具有平方根的置换,如果它包含长度为m的n个周期,那么n是偶数还是m是奇数?
尼尔2016年

@尼尔是的。否则,排列可以表示为交换的奇数个。
jimmy23013 '16

啊,是的,这是一种更好的放置方式。
Neil

Answers:


4

Perl,124岁字节

包括+3 -alp

在STDIN上使用基于1的排列来运行:

rootperm.pl <<< "8 3 9 1 5 4 10 13 2 12 6 11 7"

rootperm.pl

map{//;@{$G[-1]^$_|$0{$_}}{0,@G}=(@G=map{($n+=$s{$_=$F[$_-1]}++)?():$_}(0+$',0+$_)x@F)x2,%s=$n=0for@F}@F;$_="@0{1..@F}"

复杂度为O(n ^ 3)


为什么复杂度为O(n ^ 3)?
CalculatorFeline

@CatsAreFluffy因为它是一个愚蠢的程序:-)。它考虑每对元素(即使已经处理过,O(n ^ 2))并将它们的循环压缩在一起(甚至不知道何时停止,O(n)),然后检查这是否是平方根的适当循环。在程序中,您可以看到3个嵌套循环,分别是2个地图和一个
Ton Hospel,2016年

哦。说得通。
CalculatorFeline

2

Mathematica,165167字节

未命名的函数。

PermutationList[Cycles@Join[Riffle@@@#~(s=Select)~EvenQ@*(l=Length)~SortBy~l~Partition~2,#[[Mod[(#+1)/2Range@#,#,1]&@l@#]]&/@#~s~OddQ@*l]&@@PermutationCycles@#,l@#]&

半脱胶

PermutationList[
    Cycles@Join[
        Riffle@@@Partition[SortBy[Select[#,EvenQ@*Length],Length], 2],
        #[[Mod[(Length@#+1)/2Range@Length@#,Length@#,1]]]& /@ Select[#,OddQ@*Length]
    ]& @@ PermutationCycles @ #,
    Max@#
]&

它通过什么魔术起作用?
CalculatorFeline

1
@CatsAreFluffy如果我正确理解了半未上钩的代码,它将排列分为周期,按长度分组,然后对奇数将其提升为幂(长度+1)/ 2,而对偶数则提高将它们配对并一起捣碎。(如果偶数周期不能配对,则该分区没有平方根。)
Neil

0

Prolog-69个字符

p([],_,[]). p([H|T],B,[I|U]):-p(T,B,U),nth1(H,B,I). f(X,Y):-p(Y,Y,X).

说明:

permutate([], _, []).                 % An empty permutation is empty
permutate([X|Xs], List, [Y|Ys]) :-    % To permutate List
  permutate(Xs, List, Ys),            % Apply the rest of the permutation
  nth1(X, List, Y).                   % Y is the Xth element of List

root(Permutation, Root) :-            % The root of Permutation
  permutate(Root, Root, Permutation). % Applied to itself, is Permutation

3
我想这会花费指数时间。
feersum'3

啊对。我得解决这个问题。
AtnNn
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.