python编写程序计算1+2+3+......+100和_Python3:计算两个列表总和为100的所有排列的最有效方法是什么?...
優(yōu)化這種方法的方法不是找出更快的方式來生成排列,而是生成盡可能少的排列。
首先,如果您只想要按排序順序的組合,您將如何做到這一點(diǎn)?
您不需要生成0到100的所有可能組合,然后對(duì)其進(jìn)行過濾。第一個(gè)數(shù)字a可以是0到100之間的b任何數(shù)字。第二個(gè)數(shù)字可以是0到(100-a)之間的任何值。第三個(gè)數(shù)字,c只能是100-ab。所以:for a in range(0, 101):
for b in range(0, 101-a):
c = 100-a-b
yield a, b, c
現(xiàn)在,而不是產(chǎn)生100*100*100組合過濾下來到100*50*1+1,我們只是生成100*50*1+1,為2000X加速。
但是,請(qǐng)記住,仍有X * (X/2)**N答案。因此,X * (X/2)**N及時(shí)計(jì)算它們而不是X**N最佳 - 但它仍然是指數(shù)時(shí)間。而且沒有辦法解決這個(gè)問題; 畢竟,你想要一個(gè)指數(shù)的結(jié)果。
你可以尋找方法讓第一部分itertools.product與reduceor 結(jié)合起來更簡(jiǎn)潔accumulate,但我認(rèn)為它最終會(huì)降低可讀性,并且你希望能夠擴(kuò)展到任意任意N,并且還能得到所有的排列,而不僅僅是排序的。所以,在你這樣做之前保持它是可以理解的,然后在你完成之后尋找方法來壓縮它。
你顯然需要經(jīng)歷N步驟。我認(rèn)為使用遞歸比循環(huán)更容易理解。
當(dāng)n為1時(shí),唯一的組合是(x,)。
否則,對(duì)于從0到x的每個(gè)值a,您可以將該值與總和為xa的n-1個(gè)數(shù)的所有組合一起使用。所以:def sum_to_x(x, n):
if n == 1:
yield (x,)
return
for a in range(x+1):
for result in sum_to_x(x-a, n-1):
yield (a, *result)
現(xiàn)在你只需要添加排列,你就完成了:def perm_sum_to_x(x, n):
for combi in sum_to_x(x, n):
yield from itertools.permutations(combi)
但是有一個(gè)問題:permutations置換位置,而不是價(jià)值。所以,如果你有,比如說(100, 0, 0),那六個(gè)排列是(100, 0, 0),(100, 0, 0),(0, 100, 0),(0, 0, 100),(0, 100, 0),(0, 0, 100)。
如果N非常小 - 就像在你的例子中那樣,N = 3且X = 100-可以很好地生成每個(gè)組合的所有6個(gè)排列并過濾它們:def perm_sum_to_x(x, n):
for combi in sum_to_x(x, n):
yield from set(itertools.permutations(combi))
......但如果N能夠變大,我們也會(huì)在那里談?wù)摵芏嗬速M(fèi)的工作。
這里有很多關(guān)于如何在沒有重復(fù)值的情況下進(jìn)行排列的好答案。例如,請(qǐng)參閱此問題。借用該答案的實(shí)現(xiàn):def perm_sum_to_x(x, n):
for combi in sum_to_x(x, n):
yield from unique_permutations(combi)def perm_sum_to_x(x, n):
for combi in sum_to_x(x, n):
yield from sympy.multiset_permutations(combi)
def perm_sum_to_x(x, n):
for combi in sum_to_x(x, n):
yield from more_itertools.distinct_permutations(combi)
總結(jié)
以上是生活随笔為你收集整理的python编写程序计算1+2+3+......+100和_Python3:计算两个列表总和为100的所有排列的最有效方法是什么?...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: TinyPNG 超强png图片在线压缩工
- 下一篇: python类和函数_构建程序. Pyt