我有一些代碼來計算排列和組合,我試圖讓它對大數量更好。有效地計數組合和排列
我發現一種避免大的中間結果的排列更好的算法,但我仍然認爲我可以做的更好的組合。到目前爲止,我已經放入了一個特例來反映nCr的對稱性,但是我仍然想找到一個更好的算法來避免調用階乘(r),這是一個不必要的大的中間結果。如果沒有這種優化,最後的doctest會花費太長的時間來計算階乘(99000)。
任何人都可以提出一個更有效的方法來計數組合?
from math import factorial
def product(iterable):
prod = 1
for n in iterable:
prod *= n
return prod
def npr(n, r):
"""
Calculate the number of ordered permutations of r items taken from a
population of size n.
>>> npr(3, 2)
6
>>> npr(100, 20)
1303995018204712451095685346159820800000
"""
assert 0 <= r <= n
return product(range(n - r + 1, n + 1))
def ncr(n, r):
"""
Calculate the number of unordered combinations of r items taken from a
population of size n.
>>> ncr(3, 2)
3
>>> ncr(100, 20)
535983370403809682970
>>> ncr(100000, 1000) == ncr(100000, 99000)
True
"""
assert 0 <= r <= n
if r > n // 2:
r = n - r
return npr(n, r) // factorial(r)
對於單個nCr的,這是更好的,但是當你有多個NCR公司(N的順序),那麼動態規劃方法比較好,即使它有很長的準備時間,因爲它不會溢出除非必要,否則變成'bignum'。 – JPvdMerwe 2010-01-20 06:39:54