【问题标题】:count number of permutations in a cycle计算循环中的排列数
【发布时间】:2018-05-27 12:47:31
【问题描述】:

我有一个数字 1 到 n 的排列。在每一轮中,一个置换函数用于将当前置换映射到一个新置换。

该函数由F(i) = p[i] 定义,它将当前排列的每个元素映射到新排列中的位置。由于这个函数是单射和满射的,所以可以证明我们总是再次得到第一个排列。 (实际上是排列图中的一个循环)

例如[2,3,1] -> [3,1,2] -> [1,2,3] -> [2,3,1],因此循环长度为 3,因为第一个和最后一个排列相同,我们陷入了循环。

作为输入,我有一种特殊的排列方式,如下所示:

[2,1, 
4,5,3, 
7,8,9,10,6,
17,11,12,13,14,15,16,
18,19,20, 
29,21,22,23,24,25,26,27,28,
40,30,31,32,33,34,35,36,37,38,39,
53,41,42,43,44,45,46,47,48,49,50,51,52]

它由一些子排列组成(每一行都有一组数字,它们属于它们的索引集)

我的问题是再次到达第一个排列所需的最少移动次数是多少。

作为序言中的一个练习问题,我想计算每个子排列的移动次数并获得它们的 lcm,但我不确定如何实现这个(如何计算每个子排列的移动次数)

任何帮助将不胜感激

【问题讨论】:

    标签: algorithm prolog permutation


    【解决方案1】:

    置换p 可以看作是从集合{1,2,...,n} 到自身的双射函数。现在您似乎要求的是此排列与其自身p o p o ... o p 的最小连接数(其中o 是与(f o g)(i) := f(g(i)) 的连接运算符) s.t.你得到身份排列p0p0(i) = i

    你有一个排列可以很容易地分解成循环1->2->1, 3->4->5->3, 6->7->8->9->10->6, ... 每个循环都需要与其拥有的成员一样多的连接来获得身份。由于您有长度为 2、3、5、7、3、9、11、13 的循环,因此需要 2*9*5*7*11*13 (最小公倍数)串联,直到所有循环都同时运行第一次。

    【讨论】:

    • 我不明白这个`每个循环都需要与它自身一样多的连接才能获得身份。`总是这样吗?
    • 让我们来循环3 -> 4 -> 5 -> 3。它有 3 个成员(元素)。排列旋转这三个元素。经过 3、6、9、... 轮换后,您始终拥有身份。
    • 很抱歉,我自己没有理解这个问题,感谢您的帮助
    猜你喜欢
    • 1970-01-01
    • 2021-06-27
    • 2018-10-31
    • 1970-01-01
    • 2018-12-27
    • 2021-09-09
    • 1970-01-01
    • 2019-05-26
    • 2020-12-04
    相关资源
    最近更新 更多