用于描述单个算法的复杂性,即为:

  • 算法需要的计算时间
  • 运行算法所需的内存空间

计算复杂度理论研究的是算法的复杂性。一个可计算问题,在利用算法解决时,究竟需要多少资源?如果所需资源过多,一个问题就会在工程上不可解,那么这样一来,原本可计算的问题也就变得不可计算了。

计算复杂度理论,使用的计算模型主要是图灵机电路理论

判定性问题

一个算法问题,可以分成两类:

  • 判定性问题:是不是存在解,回答是“是”或者“否”。
  • 搜索性问题(求解问题):具体的解是什么,回答是一个解,或者无解

判定性问题一般是搜索性问题的前置条件,如果搜索性问题可以得到一个解,那么这个问题就一定是可判定的。

例如,一个判定性问题可以是“判断整数 1 是否在自然数中?”,而搜索性问题则更进一步,得到答案:整数 1 是在自然数中的第二个位置。其中,“第二个位置”就是这个问题的解。

对于可计算理论来讲,只研究判定性问题。

算法分析:大 O 表示

高德纳提出的“大O表示法”是一种算法分析方法,目的是忽略计算模型中的常数因子,而关注对算法影响最大的指数部分

其本质是“抓大放小”。

例如,n 表示输入的长度,T(n) 表示算法运行的时间长度。如果算法可在常熟时间内运行完毕,算法的时间复杂度即为 O(n)

计算问题的集合

不同的计算问题有不同的复杂性,根据问题的等价关系,可以将问题按照复杂度打包成集合。

  • P 问题:在“确定性图灵机”上,所需要的计算时间不超过一个确定的多项式
  • NP 问题:在“不确定性图灵机”上,所需要的计算时间不超过一个确定的多项式
  • L 问题:n 为输入长度,在确定性图灵机上所需空间不超过 O(logn) 算法问题的集合。一般认为这样的算法是比较快的

其中两个重要概念:

  • 确定性图灵机和不确定性图灵机:确定性图灵机每次只能做一次计算,不确定性图灵机每次可以对不同的分支同时计算,可以对每个步骤中的分支同时计算。用现代计算机来类比,确定性图灵机类似于单核计算机,而不确定性图灵机类似于多核计算机,能够并行计算。参见:不确定性图灵机
  • 多项式计算时间:算法执行的步骤总数是一个多项式,例如 而不存在例如 这样的因子。

一般认为『有效算法』即为多项式步骤的算法。

P = NP ?

P 问题和 NP 问题考虑的都是“判定性问题”。

NP 完备问题考虑的是所有 NP 问题中最难问题的集合,对于 NP完备问题,我们至今无法找到多项式步骤的算法。所以我们目前认为