Skip to content

NP问题

NP 问题的定义

  • NP 问题:可以在多项式时间内验证 YES or NO(基于非确定性图灵机)
  • NP-Hard 问题:
    • 一个问题 \(P\) 是 NP 难问题,如果 \(\forall Q\in NP,Q\leq_{P}P\)
  • NPC 问题:
    • 该问题是 NP 问题
    • 已知的某个 NPC 问题可以在多项式时间内归约到该问题。
      • 这保证其是 NP 问题中最难的

归约

定义 (问题 \(P\)\(Q\) 的归约)

判定问题 \(P\)\(Q\) 的归约(\(P\leq Q\))为一个转换函数 \(T(x)\),满足: - 它能够将问题 \(P\) 的任意一个合法的输入 \(x\) 转化为 \(Q\) 的一个合法的输入 \(T(x)\)。 - \(P\) 问题对于任意输入 \(x\) 的输出是 YES,当且仅当 \(Q\) 问题对输入 \(T(x)\) 的输出是 YES

  • 多项式归约
    • 表达为 \(\leq_{P}\),P 即多项式(polynomial

背包问题和伪多项式时间

算法问题计算时间复杂度,一般是一个 \(O(f(n,m,\dots))\) ,其中 \(f\) 是一个函数,\(n,m,\dots\) 是一个参数

但需要注意,参数实际上分为: - 结构性参数,是题严格直接给出的。 - 如冒泡排序\(n\),表达数组元素的个数,我们只关心这个数值,不关心其规模,所以用 \(n\) 表示。\(n\) 是数字个数的多少 - \(n\) 只用来决定外循环的次数,是数字个数的多少 - 数值性参数,我们对齐操作只关心他的数值大小。 - 如质数判断问题中的 \(n\),我们对齐要进行数值操作,关心其输入规模。 - \(n\) 是一个我们关心的数值

总体而言,根据参数的不同,我们会出现伪多项式时间和多项式时间 多项式时间算法 (polynomial time algorithm) 表示:算法的复杂度与输入的规模呈多项式关系。 伪多项式时间算法 (pseudopolynomial time algorithm) 是表示:算法的复杂度与输入规模呈指数关系,与输入的数值大小呈多项式关系。

例如背包问题 \(O(nW)\),where \(n\) 是物品序列大小,\(W\)背包容量 - \(n\) 是一个结构性参数,因为其只表示物品的个数 - \(W\) 是一个数值型参数,我们要对其进行数值操作。 - 所以单纯把 \(W\) 也看作结构性参数而不考虑实在规模的 \(O(nW)\) 被称为伪多项式时间复杂度,原因在于: - 如果 \(W\) 以输入规模的形式提供,则量度时间复杂度,应该考虑输入的位数,即 \(\log W\)

- 在背包问题的复杂度应该写成 $O(n2^{ \log W})$),是指数复杂度
- 这也是为什么背包问题不能说其有 $P$ 算法。