引子
开学第一周,初识算法课,当头一棒,老师NP 问题云云,遂寻书溯源,不得解。
突然发现《计算机算法设计与分析》这本书真是过分啊,整一册习题集,不只是哪位老师运用腾挪大法著成此书,怕了怕了。去借学神的《算法导论》一睹NP真容。
……欢迎批评指正
NP
我们以前接触的算法基本上都是多项式时间算法:对于规模为n的输入,在最坏的情况下的运行时间是O(n^k),其中k为某一确定常数。 但实际上有一些问题不能在多项式时间内解决;另外,还有许多可以在多项式时间内解决的问题,但对任意常数k,它们都不能在O(n^k)时间内被解决。
上面所提的后者在我的理解中就是NP问题。可以这样想想:对于下一步的动作,他们也不知道确切的应该怎么办,只能“尝试”很多种方案才能够得出一个答案,这显然是很费时的。
至于NPC问题,可以这么认为,这种问题只有把解域里面的所有可能都穷举了之后才能得出答案,这样的问题是NP里面最难的问题,这种问题就是NPC问题。
……
总之,当我们试着去说明一个问题为NP完全问题时,我们是在陈述它是一个多么困难的问题,并不是去证明它存在某个有效算法,而是去证明不太可能存在有效的算法去解决问题。
NP问题的存在,应该就是提醒我们对待复杂的问题,更好的办法是花时间开发一种近似算法或解决某种已处理问题的特例,而不是寻找求得问题确切解的一种快速算法。
递归策略
直接的或间接的调用自身的算法称为递归算法。
递归的使用在我的印象中最深刻的是初学时完成的求n的阶乘 程序:
1 | int factorial (int n) |
未完待续