我正在使用DP算法,即将子问题值存储在2D数组中,其中一个轴
表示从n
到w
的{{1}}项和其他0
值,其中W
是最大值
背包的能力。因此W
值是我需要的最佳值
计算。我在其他资料中读过这个算法的时间复杂度
T[n-1][W]
。我的问题是:是否有可能进一步降低时间复杂度?
我发现其他答案几乎相同,但如果没有例子,我就无法理解:how to understand about reducing time complexity on 0~1 knapsack
我告诉我们,我们不需要计算O(nW)
小T[i][w]
值,因为它们没有在最佳值中使用,但我无法正确理解,任何人都可以提供详细和可视化例?这对我有很大帮助。
答案 0 :(得分:0)
您尝试填充的2D数组的大小为n
W
(实际上,W + 1,因为值来自0..W
,但是一个接一个地没有这不会影响渐近的复杂性。因此,要填充该数组,您至少需要n*W
工作(即使您只是将数组初始化为全零!)。
因此,Θ(nW)(紧束缚,同时为O(nW)和Ω(nW))是渐近算法时间复杂度方面最好的。
这就是动态编程解决方案如此酷的原因,就是你在解决方案数组的每个元素(在这种情况下,2D)上花费一些时间从头到尾做一些不变的工作(将此与复杂性相对照自上而下的递归解决方案!)。