PermutationGroup 置换群

问题

包含nn个元素的排列s=[x0,x1,x2,,xn1]s = [x_0, x_1, x_2, \dots, x_{n-1}],元素范围为[0,n1][0, n-1]且互不相同。另一个包含nn个元素的数组t=[y0,y1,y2,,yn1]t = [y_0, y_1, y_2, \dots, y_{n-1}],元素范围也是[0,n1][0, n-1]且互不相同。且sts \neq t

排列ss在数组tt上的置换操作为s[t[i]]=s[i]s[t[i]] = s[i](其中i[0,n1]i \in [0, n-1]),称ttss的置换准则。对ss中的所有元素按照数组tt的对应下标上的值进行置换称为一次置换操作。例如

s=[0,1,2,3,4,5,6,7,8,9]s = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

在置换准则

t=[3,4,2,6,1,7,0,5,9,8]t = [3, 4, 2, 6, 1, 7, 0, 5, 9, 8]

进行一次置换后得到

s=[6,4,2,0,1,7,3,5,9,8]s = [6, 4, 2, 0, 1, 7, 3, 5, 9, 8]

求包含nn个元素的排列ss在置换准则tt下经过kk次置换操作后得到的排列。

解法

显然暴力kk次循环的时间复杂度过高,不予采用。

对于上面例子的排列ss及置换准则tt

s=[0,1,2,3,4,5,6,7,8,9]t=[3,4,2,6,1,7,0,5,9,8]\begin{matrix} s = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] \\ t = [3, 4, 2, 6, 1, 7, 0, 5, 9, 8] \end{matrix}

(1)(1) 对于第00个元素,第11次置换后s[0]=6s[0] = 6,即s1=[6,4,2,0,1,7,3,5,9,8]s_1 = [6, 4, 2, 0, 1, 7, 3, 5, 9, 8]

(2)(2) 对于第00个元素,第22次置换后s[0]=3s[0] = 3,即s2=[3,1,2,6,4,5,0,7,8,9]s_2 = [3, 1, 2, 6, 4, 5, 0, 7, 8, 9]

(3)(3) 对于第00个元素,第33次置换后s[0]=0s[0] = 0,即s3=[0,4,2,3,1,7,6,5,9,8]s_3 = [0, 4, 2, 3, 1, 7, 6, 5, 9, 8]

(4)(4) 对于第00个元素,第44次置换后s[0]=6s[0] = 6,即s4=[6,1,2,0,4,5,3,7,8,9]s_4 = [6, 1, 2, 0, 4, 5, 3, 7, 8, 9]

44次置换后的s4[0]s_4[0]和第11次置换后的s1[0]s_1[0]相同,即s4[0]=s1[0]s_4[0] = s_1[0]。可以看出置换操作存在周期性。本题例子中,第00个元素s[0]s[0]的置换周期为33,即si+3[0]=si[0]s_{i+3}[0] = s_{i}[0](其中i0i \geq 0)。

只要确定所有元素的置换周期,就可以跳过kk次暴力循环。设mm为包含nn个元素的排列ss上平均每个元素的置换周期,则该算法的时间复杂度为O(n×m)O(n \times m)

源码

PermutationGroup.h

PermutationGroup.cpp

测试

PermutationGroupTest.cpp

Last updated