【问题标题】:Reducing time complexity of Knapsack 0~1 while using DP algorithm使用 DP 算法降低背包 0~1 的时间复杂度
【发布时间】:2017-03-18 20:42:39
【问题描述】:

我正在使用 DP 算法,即将子问题值存储在一个轴的二维数组中

表示n 项目和其他 - 从0Ww 值,其中W 是最大值

背包容量。因此T[n-1][W] 值是我需要的最佳值

计算。我在其他资料中读到这个算法的时间复杂度是

O(nW)。我的问题是:是否有可能进一步降低这个时间复杂度?

我找到了其他答案,它谈到了几乎相同的事情,但没有例子我无法理解:how to understand about reducing time complexity on 0~1 knapsack

我告诉我们不需要用小的w 值来计算T[i][w],因为它们没有用于最佳值,但我不能正确地得到这个,谁能给出详细和直观的例子?这会让我受益匪浅。

【问题讨论】:

  • 我认为你的意思是 O(nw),而不是 O(nW),尽管它在渐近上没有真正的区别 (w = W+1)。
  • 这个来源告诉它是 O(nW):geeksforgeeks.org/…
  • 渐近无关紧要,所以说 O(nw) 或 O(nW) 是正确的。

标签: c time-complexity dynamic-programming knapsack-problem


【解决方案1】:

您尝试填充的 2D 数组的大小为 n 乘以 W(实际上,W+1,因为值来自 0..W,但逐一不影响渐近复杂度这里)。因此,要填充该数组,您至少需要完成n*W 工作(即使您只是将数组初始化为全零!)。

因此,就渐近算法时间复杂度而言,Θ(nW)(紧密绑定,即 O(nW) 和 Ω(nW))是您能做到的最好的。

这就是使动态编程解决方案如此酷的原因,就是您在解决方案数组的每个元素(在本例中为 2D)上花费恒定的时间做一些恒定的工作,自下而上(对比这与自上而下的递归解决方案!)。

【讨论】:

  • 谢谢,我的讲师要求制作一个解决这个问题的程序,但他还要求对排序过程添加一些限制以消除排序和进程的总数,但我猜与递归子问题算法或只是纯暴力检查所有2^n 子集相比,这种 DP 技术本身将受到限制
  • 是的,比递归和排列算法好得多!只要您记住解决方案,递归有时也可以。
猜你喜欢
  • 1970-01-01
  • 2014-04-21
  • 1970-01-01
  • 1970-01-01
  • 2011-06-15
  • 2021-03-30
  • 1970-01-01
  • 2023-03-06
  • 2012-07-28
相关资源
最近更新 更多