1. 背景介绍

    对于一个算法来说,我们主要观察其时间复杂度,和空间复杂度(这个好像很多方面已经不太关注了),如果我们知道该算法的时间下界,我们就可以评价解决该问题的各种算法的效率,进而确定对已有算法还有多少改进的余地。但是很多情况下,要确定一个算法的内在计算复杂性是很困难的,我们往往凭经验来判断一个算法的好坏,也有许多常见的问题,可以借助很多计算方法和工具,来较准确地确定许多问题的计算复杂性。问题的计算复杂性可以通过解决该问题所需计算量的多少来度量。问题了?多少就叫做多,多少就叫做少呢?怎么衡量这个算法容易还是不容易呢,也就是人们常说的难和易的问题。

  2. 难和易的衡量标准是什么?

    针对问题的规模而言,P(polynomial就是能在多项式时间内能够解决的问题。而将需要指数函数时间解决的问题看做是NP问题(Non-deterministic polynomial)

  3. 多项式时间?

    在研究算法的时间复杂度时,我们通常用O(nk )来表示。其中n是问题的规模,k是一个非负整数。一些科学家指出只有多项式时间算法才称得上是"好"算法。其实多项式时间复杂性也并不意味着较低的时间要求,如(n1000 ),他们的值依然大的惊人。至于科学家为什么要用这个标准去定义它,我们搞算法无需关注,不是重点。通常人们将存在多项式时间算法的问题成为易解问题,将需要在指数时间内解决的问题成为难解问题,目前证明的难解问题只有两类:不可判定问题和非决定的难处理问题。

  4. 什么是P?=NP呢?

    有一类问题叫做NP 完全问题,到底什么是NP完全问题?这个以后再说,关于这个问题,人们既没有找出求解NP完全问题的多项式时间算法,也没有人能证明出不存在多项式时间算法。

  5. 什么是P,NP,NP完全问题?

    P就是多项式时间内可以解决的问题。

    NP类问题是指在多项式内可以被证明的问题,那么所谓的证明是什么玩意,即如果已知一个问题解得证书,那么可以证明此问题在该输入规模下能在多项式时间内解决。一个证书可以是对一组变量的一个赋值,我们可以在多项式时间内检验这一赋值是否满足此布尔表达式。

    所有的P问题同时也是NP问题,我们暂且相信P包含于NP,那么P是否真包含与NP呢?这是一个开放问题。

    NP完全问题:如果一个NP问题和其他任何NP问题一样不易解决,那么我们认为这个问题是NPC问题或者NP完全问题。

  6. 什么不可判定问题和非决定的难处理问题?

    不可判定问题:他们太难了,以致于根本不存在能求解它们的任何算法。非决定的难处理问题:这类问题是可判定的(即可解的)。但是即使使用非决定的计算机也不能在多项式时间内求解它们。

  7. 什么是确定算法,什么是不确定算法

    设A是问题II的一个算法。如果在处理问题II的实例时,在算法的执行过程中,每一步只有一个确定的选择,则称算法A是确定性算法。因此,确定性算法对于同样的输入实例一遍一遍地执行,其输出从不改变。通常在写程序时,用到的都是一些确定性算法,比如查找和排序算法。

    非确定算法包含两个阶段:猜测和验证阶段。设A 是求解问题II的一个算法。对于规模为n的输入实例L,生成一个输出结果S,把它作为给定实例L的一个候选解,该解可能是相应的输入实例L的解,也可能不是,甚至完全不着边际。但是它能够以多项式时间内能够输出这个结果。那么在验证阶段需要一个确定性算法来验证,把L和S都作为该算法的输入,如果s的确是L的一个解,算法停止且输出是,否则输出否。

  8. P类问题和NP类问题的关系?

    P类问题是可以用多项式时间的确定性算法来进行判定或求解

    NP类问题可以用多项式时间的不确定算法来进行判定或求解,关键是存在一个确定算法,能够以多项式的时间来验证在猜测阶段所产生的答案。

    直观上理解:P类问题是在确定性算法下的易解问题,而NP问题是非确定性计算模型下的易验证问题。因为确定性算法只是不确定算法的一种特例,显然有P NP,再者,通常认为,问题求解难于问题验证,故大多数研究者相信NP类是比P类要大得多集合,即是P! NP,故P!=NP。可是还没有任何人证明:在NP类中有哪个问题不属于P类。即P=NP?,但是后来人们发现还有一系列的特殊NP类问题,这类问题使得大多数科学家相信P!=NP,这类特殊的问题就是NP完全问题。

  9. NP完全问题与NP 问题之间的关系?

     1. 解决了这个问题我们就解决了所有NP问题
    2. 这个问题本身也是个NP问题

  10. 对于NP完全问题,我们如何应对呢?

    要想成为一名优秀的算法设计者,一定要懂得NP完全问题的基本原理。如果读者能够确定一个NP完全问题,就可以提供充分的论据说明其不易处理性。作为一名工程师,更好的办法就是花时间开发一种近似算法或者解决某种易处理问题的特例,而不是寻找求得问题确切解的一种快速算法。此外,很多有趣的问题并不比排序,图的搜索或者网络流问题更难,但事实上,它们却是NP完全问题,因此熟悉这类问题非常重要。

  11. 迄今为止,所有的NP完全问题都还没有多项式时间算法。对于这类问题,通常可采取以下几种解题策略。

    (1)只对问题的特殊实例求解

    (2)用动态规划法或分支限界法求解

    (3)用概率算法求解

    (4)只求近似

    (5)用启发式方法求解