从n个选择中有效地计算长度k的下一个排列

时间:2013-02-02 15:48:20

标签: algorithm permutation

我需要有效计算来自k的长度n的下一个排列 选择。维基百科列出a great algorithm 用于从n个选项中计算长度n的下一个排列。

我能想出的最好的事情是使用该算法(或the Steinhaus–Johnson–Trotter algorithm),然后只考虑列表的第一个k项,并在更改完全时再次迭代那个位置。

约束:

  • 算法必须计算给出的下一个排列 当前的排列。如果需要生成所有排列的列表, 这将占用太多的记忆。
  • 必须能够计算k长度n的排列(这是 其他算法失败的地方

非约束:

  • 不在乎它是否就地
  • 我不在乎它是否符合排序规则或任何订单
  • 我不太关心太多它如何有效地计算下一个排列, 在理性的范围内,它不能通过制作一个给我下一个排列 每次都列出所有可能的。

1 个答案:

答案 0 :(得分:1)

您可以将此问题分解为两部分:

1)从一组大小k中查找大小为n的所有子集。

2)对于每个这样的子集,找到大小为k的子集的所有排列。

引用的维基百科文章提供了第2部分的算法,因此我在此不再重复。第1部分的算法非常相似。为简单起见,我将其描述为“查找整数k的所有大小为[0...n-1]的子集。

1)从子集[0...k-1]

开始

2)获得下一个子集,给定子集S

2a)找到最小的jj ∈ S ∧ j+1 ∉ S。如果j == n-1,则没有下一个子集;我们已经完成了。

2b)小于j的元素形成序列i...j-1(因为如果缺少任何这些值,j将不会是最小的)。如果i不为0,请将这些元素替换为i-i...j-i-1。将元素j替换为元素j+1