【发布时间】: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