生成一组整数的不同大小的所有排列的算法?

标签 algorithm permutation

假设我有一个整数数组,例如 [3,4,2,7,8,5]

我如何从该数组生成不同大小的排列?

想获得所有可能的 2 对,或所有可能的 3 组? 4 个?

我希望能够很快完成。

最佳答案

对于基于第一原理的语言不可知方法:枚举所有大小为 k 的子集(对于 k = 2, ..., n,其中 n 是数组的大小)。维基百科关于组合的文章有一节关于他们的 enumeration .对于每个枚举子集,使用 Johnson-Trotter algorithm用于枚举它的排列。这种排列的总数很快就会变得非常大。例如,只有 10 个项目就有 9,864,090

许多语言都有库支持。例如,它是一个简单的 Python 编程练习(使用其 itertools 模块)。这是一个生成此类排列的生成器:

import itertools

def allPermutations(items):
    n = len(items)
    for k in range(2,n+1):
        for combo in itertools.combinations(items,k):
            for perm in itertools.permutations(combo):
                yield perm

例如,list(allPermutations([3,4,2,7,8,5])) 计算出从 [3,4 中提取的所有 1950 个此类排列的列表,2,7,8,5]

关于生成一组整数的不同大小的所有排列的算法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41174875/

相关文章:

ruby - 数组的所有可能分布,来自一个数字

javascript - 将数字映射到字符

python - 在没有递归python的情况下生成具有最大值n-1的n乘n列表的所有排列

javascript - 在 javascript 中更改 RGB 颜色的色调

python - 在 python 中获取子字符串的更快方法?

python - 从 Python 列表中获取最多的 'diverse' 对集?

algorithm - 有额外限制的排列

algorithm - kruskal 算法的性能如何受到不相交集数据结构的影响?

algorithm - 扩大或缩小不规则多边形

java - 重复排列