【问题标题】:Fast algorithm to generate all nonordered permutations of lenght K from N从 N 生成长度为 K 的所有无序排列的快速算法
【发布时间】:2017-11-27 08:23:13
【问题描述】:

我有一个大小为 N 的数组,我需要从这个数组中生成大小为 K 的所有排列变体。变体 [1 2 3] 和 [3 1 2] 是不同的。我发现的标准解决方案是

1) 只是排列,我获得与数组大小相同的所有重新排序。

2) 只是组合,我从大小为 N 的数组中获得大小为 K 的所有组合,但是对于这些算法 [1 2 6] 和 [6 1 2] 是相同的,而我需要它们不同。

您能帮我找到一个有效的解决方案吗?

我应该在 Matlab 上实现它,但我希望我能够将您的解决方案翻译成其他语言。

【问题讨论】:

标签: algorithm permutation combinatorics


【解决方案1】:

基本上,在任何可以从 1:N 生成所有大小为 K 的无序子集并且可以生成 1:K 的所有排列的语言中,获取所有有序子集就像迭代子集并使用排列它们一样简单每个 K 排列。

在 Julia 语言中:

using Combinatorics, Iterators, Base.Iterators

N = 4
K = 2

collect(flatten(permutations(subset) for subset in subsets(1:N,K)))

给予:

12-element Array{Array{Int64,1},1}:
 [1, 2]
 [2, 1]
 [1, 3]
 [3, 1]
 [1, 4]
 [4, 1]
 [2, 3]
 [3, 2]
 [2, 4]
 [4, 2]
 [3, 4]
 [4, 3]

【讨论】:

    【解决方案2】:

    结合您找到的两个解决方案。这是python代码:

    allPermutations = list()
    combinations=getCombinations(arr, K)
    for comb in combinations:
        allPermutations.extend(getPermutations(comb))
    

    1.arr 是输入数组。

    2.getCombinations 是一个函数,它返回大小为Karr 中所有组合的列表。

    3.getPermutations 返回作为输入的数组的所有排列。

    【讨论】:

      猜你喜欢
      • 2020-08-18
      • 1970-01-01
      • 2016-01-02
      • 2019-03-26
      • 1970-01-01
      • 2018-04-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多