【问题标题】:Permutation of number by desired order按所需顺序排列数字
【发布时间】:2014-07-07 10:57:09
【问题描述】:

我想生成一种算法,用于按特定顺序排列不同数字的列表。
示例:-
数字是

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[] 的数组来做到这一点。现在我只是在tmp[] 中复制number[] 的元素,方法是维护order[] 中特定元素的位置顺序,并在下一次迭代之前检查相同的数字序列。如果需要另一次迭代,那么 number[]=tmp[],算法会重复前面的步骤。

现在,如果元素的数量很大,例如10^7 或更高,则此方法运行缓慢。 有没有更好的方法来求迭代次数?

【问题讨论】:

  • 你想用什么语言来做这个?
  • 您是否需要实际生成排列列表,还是只想计算步数,然后得出第一个排列?
  • 我想要更好的算法。语言无关紧要。
  • 您可以尝试就地排序,这可能会更快,因为您不必一直复制,尽管它的复杂性更差O(n log n) 而不是O(n)
  • 这相当于当前 CodeChef 竞赛中的一个问题:codechef.com/JULY14/problems/SGARDEN。请等到 7 月 14 日比赛结束后再回答。

标签: arrays algorithm permutation


【解决方案1】:

如果您想生成排列,您的解决方案已经是最优的,因为它的复杂性等于输出的大小。

但是,如果您只对可以生成的不同排列的数量感兴趣,您可以做得更好:

  • 按周期分解您的“订单”:例如 3 1 4 2 是一个周期 1 -> 3 -> 4 -> 2 -> 12 1 4 3 是两个周期 1 -> 2 -> 13 -> 4 -> 3
  • 不同排列的数量是lcm(n1, …, np),其中n1, …, np 是循环的长度,lcm 是最小公倍数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-25
    • 1970-01-01
    • 2020-09-03
    • 1970-01-01
    相关资源
    最近更新 更多