微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么使用动态规划的算法无法在多项式时间内解决背包问题?

如何解决为什么使用动态规划的算法无法在多项式时间内解决背包问题?

我看到了这个解释,但我仍然无法完全理解它。 如果我们遵循这个逻辑:假设某个算法在 O(n) 时间内工作,那么: 假设二进制项中的 n = 1000(4 位长) 所以时间复杂度T(n) = O(8) 让我们将输入的大小加倍。 n = 10000000 (8-bit long) T(n) = O(128) 时间以指数形式增加,所以这意味着O(n)不是多项式时间?

explanation

解决方法

问题是:“多项式作为什么的函数?”。当我们确定算法的复杂性时,我们通常(但并非总是)将其表示为输入长度的函数。通常,但并非总是,此长度由字母 n 表示。例如,如果您研究涉及图的问题,则字母 n 通常用于表示图中顶点的数量,而不是输入的长度。

在你的例子中,变量 n 是物品的数量,变量 W 是包的容量。

因此,数字 n 与复杂度相关;但它本身并不是输入的整个长度。让我们称 N 为输入的实际长度。尽量不要混淆 nN。您的算法的复杂度必须表示为 N 的函数,并且诸如“线性复杂度”、“多项式复杂度”、“指数复杂度”等术语将始终参考 {{1} },而不是N

输入的长度 n 是多少?

您的输入包含对 N 的列表,后跟容量 (weight(i),value(i))。据推测,袋子中的每件物品都被允许具有从W0的重量;和一个从 W 到某个最大值 0 的值。因此,权重需要与 V 一样多的位来表示,而值需要与 W 一样多的位来表示。

如果您对对数和写数字略有了解,您应该知道写一个数字所需的位数与其对数成正比。因此,每个权重都需要 V 位,每个值都需要 log(W) 位。

因此:log(V)

您可以说服自己 N = n * (log(W) + log(V))W 的长度与复杂性有关。这里我们所有的数字都是整数。但是想象一个现实世界的问题。重量可以用吨或克表示。 V1 ton 相同。价值可以用美分或数万欧元表示。在将现实世界的问题输入到算法中之前,我们需要选择我们的单位。

如果重量以克而不是吨表示,您的算法是否需要更长的时间来解决问题?

答案是肯定的。因为克比吨精确一百万倍。因此,当以克而不是吨为单位提问时,您要求的答案要精确一百万倍。因此,该算法将花费更多时间来找到该解决方案。

我希望我能说服您,算法的复杂性应该表示为输入实际长度的函数,而不仅仅是元素数量。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。