我很难理解两类问题的复杂性之间的关系,比如NP-hard和NP-complete问题。
https://stackoverflow.com/a/1857342/的回答:
直观地说,这些问题至少与NP完全问题一样难以解决。请注意,NP-hard问题不必在NP 中,而它们不一定是决策问题。
这里的确切定义是问题
X
是NP难的,如果存在NP完全问题Y
,那么Y
可以简化为{{ 1}}在多项式时间。
如果问题X
可以在多项式时间缩短为Y
,我们是否应该说X
至少与Y
一样难?如果问题X
在多项式时间内可缩减为Y
,则求解X
所需的时间是多项式时间+求解Y
所需的时间。因此,在我看来,问题X
至少与Y
一样难。
但上面引用的文字恰恰相反。它说,如果NP完全问题X
可以简化为NP难问题Y
,则NP难问题至少与NP完全问题一样难。
这有什么意义?我在哪里思考错误?
答案 0 :(得分:2)
你的错误是假设你必须解决X以解决Y.Y实际上可能更容易,但解决它的一种方法是将其更改为X问题的实例。由于我们处于大O符号和NP类中,我们已经超越了线性算法,您可以随时安全地丢弃算法的任何线性部分。哎呀你几乎可以安全地丢弃任何多项式部分,直到P = NP问题得到解决。这意味着O(f(n) + n) = O(f(n))
其中n=O(f(n))
。
示例(显然既没有NP-hard或NP-complete问题,只是一个例子):你要找到n个未排序数组中的最小数字。有一个明显的解决方案来迭代整个列表,并记住你找到的最低数字,非常直接和坚实的O(n)。
其他人来了,说,好吧,让我们改变它来排序数组,然后我们可以拿第一个数字,它将是最低的。请注意,这个问题的转换是O(1),但是我们可以假设必须对数组进行一些预处理才能使它成为O(n)。整体解决方案是O(n + n * log(n))= O(n * log(n))。
在这里你也将容易的问题改为难题,从而证明难题确实与简单问题相同或更难。
基本上NP难问题的定义意味着,X至少和NP完全Y问题一样难。如果你发现一个NP-complete Y问题可以通过解决X问题来解决,那就意味着要么X比Y更难或更难,那么它确实是NP难的,或者如果它更简单,就意味着你发现了算法比以前的算法更快地解决Y,甚至可能将它从NP-complete类中移出。
另一个例子:让我们假装卷积在我的“完整”集中,通常需要O(n²)。然后你用O(n * log(n))提出快速傅里叶变换,你会发现你可以通过将其转换为FFT问题来解决卷积问题。现在你想出了一个卷积解决方案,它是o(n²),更具体地说是O(n * log(n))。
答案 1 :(得分:0)
设I_X为X的指标函数(即,如果输入在X中则为1,否则为0)并且I_Y是Y的指示函数。如果Y通过可以在多项式中计算的函数f减少到X-时间,然后I_Y = I_X。 f,在哪里。表示功能组成。 X至少和Y一样硬,因为给定I_X的算法,上面的公式给出了I_Y的算法,对于在多项式替换(例如,多项式,指数,有限)下关闭的任何运行时类,如果算法为I_X属于该类,那么I_Y的算法也是如此。该陈述的对立面是,如果Y没有快速决策程序,则X没有快速决策程序。