我想生成一种算法,用于按特定顺序排列不同数字列表
例如: -
数字是
1 2 3 4
排列顺序是
3 1 4 2
即。排列后,第一个数字将排在第三位,第二个排在第一位,第三个排在第四位,第四个排在第二位 现在数字的顺序将是
2 4 1 3
现在如果算法继续以相同的顺序进行排列,那么在一些迭代之后它将生成相同的输入数字序列并且它将停止。对于这种情况,迭代总数为4。
2 4 1 3
4 3 2 1
3 1 4 2
1 2 3 4
我这样做的方法是将另一个数组tmp[]
与另外两个名为number[]
和order[]
的数组一起使用。现在我只是通过维护number[]
中特定元素的位置顺序并在下一次迭代之前检查相同的数字序列来复制tmp[]
中order[]
的元素。如果需要另一次迭代
number[]=tmp[]
,算法将重复之前的步骤。
现在如果元素的数量很大,例如。 10^7
或更高,此方法将运行缓慢。
有没有更好的解决方案来找到迭代次数?
答案 0 :(得分:1)
如果你想生成排列,你的解决方案已经是最优的,因为它的复杂性等于输出的大小。
但是,如果您只是对可以生成的不同排列的数量感兴趣,那么您可以做得更好:
3 1 4 2
是一个周期1 -> 3 -> 4 -> 2 -> 1
但2 1 4 3
是两个周期1 -> 2 -> 1
和3 -> 4 -> 3
lcm(n1, …, np)
,其中n1, …, np
是周期的长度,lcm
是最不常见的倍数。