【发布时间】:2020-03-19 17:49:59
【问题描述】:
我的以下代码执行速度太慢。这个想法类似于 0/1 背包问题,你有一个给定的整数 n,你必须找到 1 到 n - 1 范围内的数字,当平方加起来为 n 平方时。
例如,如果 n 为 5,那么它应该输出 3 , 4 因为 3 ** 2 和 4 ** 2 = (25 or 5 ** 2)。我一直在努力了解如何提高效率,并想知道用于提高此类程序效率的概念。
其他一些例子:n = 8 [无] n = 30 [1, 3, 7, 29] n = 16 [2, 3, 5, 7, 13]
我发现了一些关于此的帖子,但它们似乎仅限于两个数字,因为我的程序需要使用尽可能多的数字才能加起来。
我看了一些关于 0/1 背包问题的视频。我努力将相同的概念应用到我自己的程序中,因为问题完全不同。他们有可以放在包里的东西,它们有重量和利润。
这已经伤害了我几个小时的大脑,如果有人能指出我正确的方向,我将不胜感激,谢谢 :)
from math import sqrt
def decompose(n):
lst = []
sets = []
temp = []
perm = {}
out = []
for i in range (n):
lst.append(i**2)
for i in lst:
for x in sets:
temp.append(i + x)
perm[i + x] = (i, x)
for x in temp:
if x not in sets:
sets.append(x)
if i not in sets:
sets.append(i)
temp = []
if n**2 not in perm.keys():
return None
for i in perm[n**2]:
if str(i).isdigit():
out.append(i)
if i == ' ':
out.append(i)
for i in out:
if i not in lst:
out.remove(i)
for i in perm[i]:
if str(i).isdigit():
out.append(i)
if i == ' ':
out.append(i)
out.sort()
return [sqrt(i) for i in out]
【问题讨论】:
-
这正是 0/1 背包或“硬币找零问题”(en.wikipedia.org/wiki/Change-making_problem)。你的目标是 25(如果 n = 5)。你的“硬币”是 1、4、9、16 等。
-
查看 Google 的 OR-tools 库...它有一个非常快的求解器
标签: python python-3.x performance knapsack-problem processing-efficiency