最近因为要证明np问题,所以找了一系列概念去理解这4个问题。理解的时候看到好多人给出了不同的答案,我下面会借鉴别人的答案来总结出一份对于我自己来说,最容易理解这4个问题的说法。
预备知识了解:
时间复杂度
表明问题规模扩大后,程序需要的时间长度增长得有多快。程序的时间复杂度一般可以分为两种级别:
(个人感想:这个对于程序员或者学数学或其他的来说不陌生,从程序的角度出发,就是一个程序运行所需要的时间和输入size存在的一个关于时间上的关系。)
- 多项式级的复杂度,如O(1),O(log(n))、O(n^a)等,
- 非多项式级的,如O(a^n)、O(n!)等。后者的复杂度计算机往往不能承受。
约化(Reducibility)
(个人感想:这个理解是我看过那么多概念觉得最能理解的,最简洁的。约化是这4个问题之间相互转换的关键)
简单的说,一个问题A可以约化为问题B的含义是,可以用问题B的解法解决问题A。(个人感觉也就是说,问题A是B的一种特殊情况。)标准化的定义是,如果能找到一个变化法则,对任意一个A程序的输入,都能按照这个法则变换成B程序的输入,使两程序的输出相同,那么我们说,问题A可以约化为问题B。
例如求解一元一次方程这个问题可以约化为求解一元二次方程,即可以令对应项系数不变,二次项的系数为0,将A的问题的输入参数带入到B问题的求解程序去求解。
另外,约化还具有传递性,A可以化约为B,B可以约化为C,那么A也可以约化为C。
多项式时间内找出这个解&多项式时间内验证这个解
(个人感想:这个概念也是很重要的,我觉得对于理解是不可忽视的一个概念)
比如说著名的背包问题Knapsack problem,你要在多项式的时间内找出这个解释很困难的,但是如果有人给了一个解给你,你来验证这个解(看一下每个背包是否可以装得下这个解分配的物品),这个是可以在有效时间内验证的,毕竟对于这个背包问题来说,它的验证十分简单。
p问题、np问题、npc问题、np难问题的概念:
(个人感想:这个stackoverflow上面最高票的答案的说法是我觉得,没有能够比拟的,还有一个不错的是一个斯坦福的TA在quora上的回答,下面我会粘贴stackoverflow上最高票的这个答案,如果第一遍读了不能理解,那就读第二遍,直到读懂为止。)
P
P is a complexity class that represents the set of all decision problems that can be solved in polynomial time.
That is, given an instance of the problem, the answer yes or no can be decided in polynomial time.
Example
Given a connected graph G
, can its vertices be coloured using two colours so t