【问题标题】:Efficiently calculate next permutation of length k from n choices从 n 个选择中有效地计算长度 k 的下一个排列
【发布时间】:2013-01-17 18:51:21
【问题描述】:

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

我能想到的最好的办法是使用该算法(或the Steinhaus–Johnson–Trotter algorithm),然后只考虑列表中的第一个k 项,并在所有更改都高于该位置时再次迭代。

约束:

  • 算法必须计算下一个排列 当前的排列。如果它需要生成所有排列的列表, 会占用太多内存。
  • 它必须能够计算长度为kn 的排列(这是 其他算法失败的地方

非约束:

  • 不管它是否就位
  • 我不在乎它是按字典顺序还是按任何顺序排列
  • 我不在乎太多它计算下一个排列的效率如何, 当然,在合理范围内,它不能通过制作一个给我下一个排列 每次都列出所有可能的列表。

【问题讨论】:

标签: algorithm permutation


【解决方案1】:

你可以把这个问题分成两部分:

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

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

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-02-24
    • 2016-01-02
    • 2012-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-31
    • 2020-08-18
    相关资源
    最近更新 更多