Python 如何在不建立临时列表的情况下计算唯一排列的数量?
如何计算这个数字,而不是枚举所有排列,然后创建一个集合来切断所有重复Python 如何在不建立临时列表的情况下计算唯一排列的数量?,python,math,combinatorics,Python,Math,Combinatorics,如何计算这个数字,而不是枚举所有排列,然后创建一个集合来切断所有重复 len(set(itertools.permutations('aaabbb'))) 20 len(set(itertools.permutations('aabb'))) 6 设counts是一个数组,其counts[k]=第k个符号的计数 我们需要一种让python轻松计算一系列乘法的方法,一个product()函数 发件人: 现在我们可以将排列的数量定义为: def unique_permutations(count
len(set(itertools.permutations('aaabbb')))
20
len(set(itertools.permutations('aabb')))
6
设counts是一个数组,其counts[k]=第k个符号的计数 我们需要一种让python轻松计算一系列乘法的方法,一个product()函数 发件人: 现在我们可以将排列的数量定义为:
def unique_permutations(counts):
return math.factorial(sum(counts))/product(map(math.factorial, counts))
在另一种语言中,我们不得不担心,由于采用大阶乘或乘以许多小阶乘,在这个除法中会出现大量的数字。通常,在某一点上,计算将溢出MAXINT或MAXFLOAT规范。但在python中,所有整数操作都是精确的,需要取尽可能多的数字,并且整数溢出在设计中不会发生。速度可能成为一个问题,但那是另一回事
如何使用它:
>>> unique_permutations([3,3])
20
>>> unique_permutations([2,2])
6
有关如何执行此操作的数学信息,请参见如果您有每个字母的
N_i
副本,则您需要的数字就是
(N_1+N_2+…+N_k)/(N_1!N_2!…N_k!)
有关在没有溢出的情况下计算此值的方法,请参阅。这确实属于math.stackexchange.com。我不同意@Karl Knechtel。数学是编程和计算机科学不可或缺的组成部分。
>>> unique_permutations([3,3])
20
>>> unique_permutations([2,2])
6