在计算复杂性里面,如果一个算法的时间复杂度是输入数据的多项式表达,但却是输入长度的指数时间算法,那么称其为伪多项式时间。
如果一个NPC问题存在伪多项式时间算法,那么称其为Weakly NP-Complete。否则,称为Strongly NP-Complete.
很明显的一个例子是0-1背包问题,这一点经常容易引起别人的误解。其实0-1背包问题是一个NPC问题,你可以简单的把它规约到子集和问题,但是有人经常争辩说0-1 kanpsack问题存在Polynomial Algorithm,那么问题就在这里,那个所谓的Polynomial Algorithm is Pseudo-Polynomial actually!
一个经典0-1背包问题的DP解法的时间复杂度是O(nW),W为背包容量,但是背包容量是否需要枚举[min(…),\sum(…)]呢?所以问题就在这里了复杂度是O(n2^n)…
还有一个问题就是素性检测!这个当然也是NPC的了。。
In the case of primality, it turns out there is a different algorithm for testing whether n is prime (discovered in 2002) which runs in time O(log6n).
如果仍然不是很清楚,那么需要熟悉一下NPC与P类问题区别,下面是一个不错的表格。。。
不过貌似在源blog中有一处错误。。。Linear Programming的确是P问题,但是解决这个P问题的simplex 算法却不是Polynomial的,这个需要注意!