在阅读“三维装箱”问题的论文时,接触到NP-hard problem的概念。该博文记录与其相关的一些概念理解。
时间复杂度:指当问题规模扩大后,程序需要的时间的增长程度,而不是表示一个程序运行需要花的时间。
多项式级时间复杂度:O(1),O(log(n)),O(n^a)等。因为规模n出现在底数的位置。
P问题:可以在多项式级时间复杂度内解决
NP问题:可以在多项式级时间复杂度内被验证
NP-hard问题:指问题S,满足任何NP问题都可以在多项式级时间复杂度内被归约为S(归约:即被归约的NP问题与S的答案相同,当解决了S时,就同时解决了所有的NP问题)。可以理解为,这是一个比所有NP问题都难的问题。
延伸思考:
- 为什么验证一个答案的正确性这么重要?
因为最开始的时候都是数学家在搞这个,对于数学家来说如果有一个机器能帮助他们证明各种定理那就爽了。数学家经常干的两件事:1. 给出证明 2. 验证某个证明是不是对的。直觉上肯定验证更容易一些,但如果somehow可以证明NP=P,也就是说 验证 和 给出证明 其实在数学上是等价的,那么这个证明很可能给出了如何把 验证一个证明是否正确(NP)转化为 如何给出一个证明(P)的方法,从此以后数学家只要思考如何验证证明的正确性就能自动得到证明了。那个时候密码学的重要性只是崭露头角,但即使是在数学上的重要性,也足够让这个定义吸引人了。 - 为什么要单独把NP里最难的问题拿出来定义为NP-hard问题?
最开始的时候,大家不知道NP的定义是存在所谓 最难的 这么一个东西的,各类问题没有固定的比较标准。直到一个叫Cook的数学家做了点CS的工作,他证明了任何一个NP形式的问题都可以转换成 3SAT (某个NP问题)。3SAT 就是说有n个variable,m个clause,每个clause都是某三个variable 或(|) 在一起, 最后再把所有的clause 和(&) 在一起, 问题是:“有没有一种对于这n个variable的取值可以让整个boolean formula的值为true?” 3SAT 这个问题的优点在于它非常的直观清晰。最开始这篇文章没得到什么重视,直到一个非常出名的计算机科学家Levin看到了这篇文章,突然意识到如果这么多问题都等价于 3SAT 问题,那这就很好地揭示了为什么之前那么多算法问题都找不到快速的(多项式级)算法,因为都和3SAT一样难嘛;另外可以用 3SAT 作为对各种计算问题的分界线,那以后只要发现是NP-complete的问题,大家就不用对于每个问题找解法了。由此衍生了很多对于complexity class的研究,而cook-levin这种把NP问题化为3SAT的思想一次又一次起到了至关重要的作用。
链接:https://www.zhihu.com/question/24653072/answer/28536702
来源:知乎