我已经获得了一个证据,该证据会诋毁关于 0/1 背包问题的普遍看法,我真的很难说服自己我是对的,因为我找不到任何可以支持我的主张的东西,所以我将首先陈述我的主张,然后证明它们,我将感谢任何人试图进一步证实我的主张或反驳它们。任何合作表示赞赏。
断言:
- 用于解决背包问题的 bnb(分支定界)算法的大小与K(背包容量)无关。
- bnb 树完整空间的大小始终为 O(NK),其中 N 是项目数,而不是O(2^N)
- bnb 算法在时间和空间上总是优于标准的动态规划方法。
前提假设:bnb算法容易出现无效节点(如果剩余容量小于当前item的权重,我们不打算对其进行扩展。另外,bnb算法以深度优先的方式完成。
马虎证明:
这是解决背包问题的递归公式:
值(i,k)=最大值(值(i-1,k),值(n-1,k-weight(i))+值(i)
但是如果 k < weight(i): Value(i,k) = Value(i-1,k)
现在想象这个例子:
K = 9
N = 3
V W:
5 4
6 5
3 2
现在这里是这个问题的动态解决方案和表格:
现在想象一下,不管这是否是一个好主意,我们只想通过记忆而不是表格使用递归公式来执行此操作,例如使用地图/字典或简单数组来存储访问的单元格。为了使用记忆化解决这个问题,我们应该解决表示的单元格:
现在这与我们使用 bnb 方法获得的树完全一样:
现在是草率的证明:
- Memoization 和 bnb 树的节点数相同
- 记忆节点取决于表大小
- 表大小取决于 N 和 K
- 因此bnb 不独立于 K
- 记忆空间以 NK 为界,即 O(NK)
- 因此bnb 树的完整空间(或者如果我们以广度优先的方式进行 bnb 的空间)总是 O(NK) 而不是 O(N^2) 因为整棵树不会被构建,它会是喜欢妈妈化。
- 记忆化比标准的动态规划有更好的空间。
- bnb 比动态规划有更好的空间(即使在广度上先做)
- 没有松弛(并且只是消除不可行节点)的简单 bnb 将比 memoization 有更好的时间(memoization 必须在查找表中搜索,即使查找可以忽略不计,它们仍然是相同的。)
- 如果我们忽略 memoization 的查找搜索,它比动态的要好。
- 因此,bnb 算法在时间和空间上总是优于动态算法。
问题:
如果无论如何我的证明是正确的,就会出现一些有趣的问题:
- 为什么要为动态规划而烦恼?根据我的经验,你可以在 dp knapsack 中做的最好的事情是拥有最后两列,如果你从下到上填充它,你可以将它进一步改进为一列,它会有 O(K) 空间但仍然不能(如果上述断言是正确的)击败 bnb 方法。
- 如果我们将它与松弛修剪(关于时间)相结合,我们还能说 bnb 更好吗?
ps:对不起,长篇大论!
编辑:
由于其中两个答案都集中在记忆上,我只想澄清一下我根本不关注这个!我只是使用记忆作为一种技术来证明我的断言。我的主要关注点是分支定界技术与动态编程,这是另一个问题的完整示例,由 bnb + 松弛解决(来源:Coursera - 离散优化):