时间和空间复杂度及复杂度分类(P,NP,NP-hard,NP-complete)


在学墨尔本大学离散优化课程时发现,无论是教学还是测验,都非常注重优化方法的性能,如解质量,扩展性,耗时,内存占用等,因此再次回顾时间复杂度和空间复杂度

通常来说,解决一个问题会有多种方法,我们必须比较不同算法的性能,选择最合适的来解决特定问题。在分析一个算法时,通常考虑时间复杂度(time complexity)和空间复杂度(space complexity)。时间和空间复杂度取决于很多因素,如硬件,操作系统等,但是这些都暂时不考虑,我们只关注算法本身的执行过程

时间复杂度Time Complexity

算法的时间复杂度将算法运行所花费的时间量化为与输入长度有关的函数。注意此处的运行时间是输入长度的函数,而不是机器的实际执行时间。用一个简单的例子来说明,假设给定数组array A,在array A中找出是否存在一组pair(x,y)使其和为x+y=zarray A中有N个元素。伪代码如下

int a[n];
for(int i = 0;i < n;i++)
  cin >> a[i]
  

for(int i = 0;i < n;i++)
  for(int j = 0;j < n;j++)
    if(i!=j && a[i]+a[j] == z)
       return true

return false

假设机器执行每个基础操作的时间大概为固定常数c,实际执行的代码行数取决于z的值,因为找到x+y=z就可以返回True。在分析算法的时候通常考虑最差的情况,例如该例子中,array A中没有一组(x,y)能满足和为z,就需要遍历完整个array A然后返回False。在最坏的情况下:

  • 输入需要N次操作
  • 外循环i运行N
  • 对于每个i,内循环j运行N

总的执行时间为N*c + N*N*c + c,最后一个creturn。现在忽略低阶项,随着输入的量级增加,低阶项相对无关紧要,因此仅采用最高阶项(没有常数),在这种情况下为N*N。这种最坏的情况使用big-O notation 来表示,也就是说上面算法的时间复杂度为O(N2)。这里的N是输入数组A的长度,数组长度增加,执行时间也会增加。再来看另外一个例子

count = 0
i = N
while(i > 0):
  for j in range(i):
    count+=1
  i /= 2

如果没有仔细思考,很容易认为时间复杂度为O(N*logN)Nj的循环部分,logNi的循环,但是这是错的,想一下count+=1到底执行了几次

  • i = N时运行N
  • i = N / 2时运行N / 2
  • i = N / 4时运行N / 4

count+=1总共运行次数为N + N/2 + N/4+…+1= 2 * N,因此时间复杂度为O(N)。以下是在指定输入长度和最坏接受的时间复杂度下可选择的求解方法。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

空间复杂度Space Complexity

算法的空间复杂度将算法运行所占用的空间量化为与输入长度有关的函数。考虑如下例子,需要找出数组中各个元素的频次,伪代码如下

int freq[n];
int a[n];

for(int i = 0; i<n; i++)
{
   cin>>a[i];
   freq[a[i]]++;
} 

有两个长度为N的数组,循环中使用了变量i,假设单位空间为c。总共占用空间即为N * c + N * c + 1 * c = 2N * c + c,随着输入的增加,c的影响可以忽略,因此可以说空间复杂度为O(N)
空间复杂度量化了算法使用的所有空间,包括辅助空间auxiliary space。辅助空间是指除开输入需要的额外空间,在上面例子中,freq[n]就是辅助空间,占用N * c + c即复杂度为O(N)

复杂度分类

P问题

P问题中的P是Polynomial Time,即多项式时间,代表机器可以在确定性多项式时间内解决的决策问题集合。有如下特征

扫描二维码关注公众号,回复: 15188954 查看本文章
  • P问题的解容易找到
  • P是计算问题中具有solvable和tractable的一类,tractable就是指问题在理论和实践上都能解决

常见P问题有计算最大公约数;寻找最大匹配(maximum matching);线性规划的决策版本

NP问题

NP代表Non-deterministic Polynomial Time,非确定性多项式时间,NP问题是机器可以在非确定性多项式时间内解决的决策问题的集合,有如下特征

  • NP问题的解很难找,因此求解时间是非确定性多项式时间,但是解很容易验证
  • NP问题可以在多项式时间内用图灵机验证
    常见NP问题有布尔可满足性问题 (Boolean Satisfiability Problem SAT),哈密顿路径问题,图着色问题

NP-hard问题

NP-hard问题至少要和NP问题中最难的一类一样难,代表所有NP问题都能在多项式时间复杂度内归约(reduction)到的问题

归约:我们现在遇到了个问题,可以把它转化到一个某个已解决的问题上,而不是一定要直接解决这个问题。对于问题 A和问题 B,如果存在一个可以计算的函数 f,使得对于任意问题 A 的实例 x,都有 A(x)=f(B(x)),那么我们就说问题 A可以被归约到问题 B上

  • 所有 NP-hard 问题都不在 NP 中
  • 如果给出了一个NP-hard 问题的解,验证也需要很长时间
  • 如果对于 NP 中的每个问题 L,存在从 L 到 A 的多项式时间归约,则问题 A 是 NP-hard 问题
    常见的NP-hard问题有停机问题(Halting problem),TSP

NP-complete问题

如果一个问题既是 NP 问题又是 NP-hard问题,那么它就是NP-complete问题。NP-complete问题是 NP 中的难题。

  • NP-complete 问题是特殊的,因为 NP 类中的任何问题都可以在多项式时间内转换或归约为 NP-complete 问题
  • 如果可以在多项式时间内解决NP-complete问题,那么也可以在多项式时间内解决任何 NP 问题

常见NP-complete问题有0/1背包问题,哈密尔顿回路,顶点覆盖(Vertex cover)
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_45526117/article/details/127493748