详解时间、空间复杂度(内含彩蛋~~)

一世执手 提交于 2020-04-04 18:42:45

学习算法我们首先需要清楚的概念就是时间复杂度空间复杂度
接下来我们就详细讲解一下时间复杂度和空间复杂度,为大家后面的学习打好基础!

算法入门书籍挑选点这里~ 帮你快速找到适合自己的算法书籍(详细,内含彩蛋哦~)

一、时间复杂度:执行算法所需要的计算工作量

(一)时间复杂度的理解

1.时间频度定义

我们需先明白:
一个 算法花费的时间 是与算法中语句的执行次数正比
(也就是说一个算法中语句执行次数越多,花费的时间也就越多)

时间频度:T(n): 一个算法中的语句执行次数,记为T(n)

2.(渐进)时间复杂度定义

T(n): 算法中基本操作重复执行的次数是问题规模n的某个函数。
f(n): 某个辅助函数

算法的(渐进)时间复杂度O(f(n)):

若有某个辅助函数f(n),使得当n趋近于无穷大时,T(n)/f (n)的极限值为不等于零的常数,则称f(n)是T(n)的同数量级函数。

记作T(n)=O(f(n)),称O(f(n)) 为算法的渐进时间复杂度,简称时间复杂度。

O(f(n)) 表示方法称为大O表示法

注意: T(n)不同,但时间复杂度可能相同。

(二)时间复杂度的计算

计算攻略:

  1. 用常数1代替运行时间中的所有加法常数
(1) T(n)=n2+7n+6 ⇒ T(n)=n2+7n+1
  1. 修改后的运行次数函数中,只保留最高阶项
(2)T(n)=n2+7n+1 ⇒ T(n)=n2
  1. 去除最高项系数
(3)T(n)=n2 ⇒ O(n2 )

注意:

(1)循环的时间复杂度 = 循环体的复杂度 × 该循环运行次数

(2)单纯的分支结构(不包括在循环结构中)其时间复杂度为O(1)

常见的算法时间复杂度由小到大排序:

常见的算法时间复杂度由小到大依次为:
O(1):常数阶
O(logan)【O(log2n)】:对数阶
O(n):线性阶
O(nlogan)【O(nlog2n)】:线性对数阶
O(n2):平方阶
O(n3):立方阶
O(nk):k次方阶
O(2n):指数阶
随着问题规模n的不断增大,上述时间复杂度越来越大大,算法的执行效率也越来越低

大O表示法推导实例:

1.常数阶 ⇒ O(1)
int n =100;//执行1次
int sum =n*2;//执行1次
System.out println(sum);//执行1次

你可能会问代码一共执行了3次鸭,为什么时间复杂度不是O(3)呢?

这是因为用到了第一条攻略:用常数1代替运行时间中的所有加法常数

本题中:T(n)=3根据第一条攻略:

(1) T(n)=3 ⇒ T(n)=1
(2) T(n)=1 ⇒ O(1)

在这里插入图片描述

2.线性阶 ⇒ O(n)
int i= 0,sum=0;
for(i=0;i<n;i++){//for循环执行n次
sum=2*i;//执行一次for循环此语句执行一次
System.out.println(sum);//执行一次for循环此语句执行一次
}

所以:T(n)=2n

第三条攻略: 去除最高项系数

本例中根据第三条攻略可得

(1) T(n)=2n ⇒ T(n)=n
(2) T(n)=n ⇒ O(n)

在这里插入图片描述

3.平方阶 ⇒ O(n2)

例1:

int i,j=0;
for(i=0;i<n;i++){//执行n次
	for(j=0;j<n;j++){//执行n次
		System.out.println(i + " " + j );
	}
}

所以:T(n)=n2

T(n)=n 2 ⇒ O(n2)

在这里插入图片描述

例2:

int i,j=0;
for(i=0;i<n;i++){//执行n次
	for(j=i;j<n;j++){//注意j=i
		System.out.println(i + " " + j );
	}
}

当i=0,第二个for循环执行n次
当i=1,第二个for循环执行n-1次
当i=2,第二个for循环执行n-2次
当i=n-1,第二个for循环执行1次

执行总数T(n)=n+(n-1)+(n-2)+……1=+=(n 2+n)

根据第二条攻略、第三条攻略可得:

第二条攻略:修改后的运行次数函数中,只保留最高阶项
第三条攻略: 去除最高项系数

T(n)=(n 2+n) ⇒ T(n)=n 2
T(n)=n 2 ⇒ O(n2)

在这里插入图片描述

二、 空间复杂度:执行这个算法所需要的内存空间

空间复杂度

对一个算法在运行过程中临时占用存储空间大小的量度,记做S(n)=O(f(n))。

n为问题的规模,f(n)为算法所占存储空间的函数。

空间复杂度分类

O(1)情况:

当算法的存储空间大小固定,与输入规模没有直接的关系时,空间复杂度记作O(1)。

O(n)情况:

当算法分配的空间和输入规模n成正比时,空间复杂度记作O(n)。

三、彩蛋

我将入门算法书中时间复杂度、空间复杂度讲解部分为大家截出来了,有需要的宝宝可以自取。

链接:https://pan.baidu.com/s/1mrMeuLv11Bf09zrE-DhFLA
提取码:yw8d

欢迎大家来公号 “小乔的编程内容分享站” 来找小乔玩~
一起学习Java基础+算法~
还有更多资源等你来拿哦~

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!