列表中所有可能排列的排序元素(排列)的数量

时间:2018-10-16 12:21:55

标签: python algorithm performance sorting permutation

给定一个数组,例如arr = [5, 5, 4, 4, 2, 1],我如何才能在该数组的所有可能排列中找到与原始数组本身相同的排列数量(假设原始数组始终按降序排列)订购)。在此示例情况下,将有4个与原始数组相等的排列。那就是我在python中使用itertools.permutations所得到的。任何人更快的东西?我将不胜感激。以下是我这么慢的python代码。

from itertools import permutations

arr = sorted(map(int, (raw_input().split())), reverse = True)

perms = permutations(n,len(arr))

cnt = 0;

for i in perms:
    if list(i) == arr: print i; cnt += 1
print cnt

3 个答案:

答案 0 :(得分:4)

假设您的数组的大小为n,重复项为r1,r2,...,rk,因此sum(ri)= n。那么答案就是重复阶乘的乘积。

例如,对于arr = [5,5,4,4,2,1],我们得到r = [2,2,1,1],答案为2! * 2! * 1! * 1! = 4

答案 1 :(得分:0)

您可以获得所有相同值子序列长度的阶乘的乘积:

from itertools import groupby
from functools import reduce
from math import factorial
from operator import mul
print(reduce(mul, map(lambda t: factorial(sum(1 for i in t[1])), groupby(arr))))

这将输出:4

答案 2 :(得分:0)

对于N个元素,可能的排列数为N!

如果在示例[5、5、5、4、1]中有3个!数组相同的排列。

我将遍历数组并将值和满足该值的数量存储在关联的数组中。

伪代码

firstArray = [5, 5, 4, 4, 2, 1]
doubleArray = []

for each item in firstArray:
    if item is in doubleArray keys:
        doubleArray[item]++
    else:
        doubleArray[item] = 1

result = 1
for each elem in doubleArray:
    result *= fact(elem)

print "There is " + elem + " permutations possible where the original array remains the same"