产生组合的严重效率问题

时间:2017-12-29 09:14:22

标签: python performance

我正试图解决这个问题:

  

给定正整数n,返回严格增加   数字的序列(列表/数组/字符串取决于语言),所以   方块的总和等于n²。

     

如果有多个解决方案(并且会有),请返回结果   具有最大可能值:

基本上,平方数被解构为较小的正方形。但是,我的代码只能有效地处理小数字(20表示第一段代码的最大值,30秒表示第二段),并且指数慢一些。我该如何开发代码?

我对语言的效率知之甚少,并且能够应用到我的代码中,我尝试通过设置梳子来减少内存使用量来优化它,以便为下面的那些取出任何不相关的数据

对于第二段代码,我尝试使用递归来解决我的问题,但它仍然以指数速度变慢。也许我需要一种新方法?非常感谢。

import itertools as it
from math import sqrt


def decompose(n):
    squares = [i ** 2 for i in range(1, n) if (i ** 2)/2 < n ** 2]
    comb = [list(i) for i in (reduce(lambda acc, x: acc + list(it.combinations(squares, x)),
                                     range(1, len(squares) + 1), [])) if sum(i) == n ** 2]
    print [int(sqrt(i)) for i in max(comb)]


decompose(20)

这是第一次尝试,效率低下,所以我试过了。

from math import sqrt
stuff = []


def decompose(a):
    def subset_sum(numbers, target, partial=[]):
        s = sum(partial)

        if s == target:
            stuff.append(partial)
        if s >= target:
            return

        for i in range(len(numbers)):
            n = numbers[i]
            remaining = numbers[i+1:]
            subset_sum(remaining, target, partial + [n])

    compare = 1
    large = None
    subset_sum([x**2 for x in range(1, a)], a**2)

    for y in stuff:
        if compare < y[-1]:
            compare = y[-1]
            large = y

    print [int(sqrt(o)) for o in large]


decompose(30)

0 个答案:

没有答案