gpt4 book ai didi

python - Python中的子集和(动态规划)-复杂性问题

转载 作者:行者123 更新时间:2023-12-01 08:21:29 24 4
gpt4 key购买 nike

我在解决 Python 中子集和问题的函数的某些实现方面遇到问题。

我们这里有动态规划,所以复杂度应该是多项式。

问题是,如果集合的大小线性增长,并且数字的大小也线性增长(当然不是数字的对数),那么代码执行时间会呈指数增长。

我的猜测是,这可能是由于特定的实现造成的。是否有可能以某种方式改进它?

Python 代码:

def subsetsum(array,num):

if num == 0 or num < 1:
return None
elif len(array) == 0:
return None
else:
if array[0] == num:
return [array[0]]
else:
with_v = subsetsum(array[1:],(num - array[0]))
if with_v:
return [array[0]] + with_v
else:
return subsetsum(array[1:],num)

最佳答案

您使用切片来传递数组的后缀,这将创建一个具有线性运行时间的副本。为了避免这种情况,您可以传递索引。另一个优点是索引是可散列的,因此您可以缓存(或 memoize )并避免重新计算答案:

from functools import lru_cache

def ssum(array, N):
@lru_cache(maxsize=None)
def subsetsum(idx, num):
if num < 1 or idx >= len(array):
return frozenset()
if array[idx] == num:
return frozenset([idx])
with_v = subsetsum(idx + 1, num - array[idx])
if with_v:
return with_v | frozenset([idx])
else:
return subsetsum(idx + 1, num)
return list(array[i] for i in subsetsum(0, N))
>>> ssum([1,1,2], 4)
[1, 1, 2]

不幸的是,复制从后缀获得的答案仍然存在成本

关于python - Python中的子集和(动态规划)-复杂性问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54619475/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com