复杂度是用来衡量算法优劣的度量单位,而其定义又可从时空两个维度考虑:
- 时间:执行当前算法所消耗的时间
- 空间:执行当前算法需要占用多少内存空间
时间复杂度
因为如果按实际运行程序的执行时间的话,可能会由于机器性能差异导致时间误差,所以大佬们提出了通用方法【大O符号表示法】:
T ( n ) = O ( f ( n ) ) T(n)=O(f(n)) T(n)=O(f(n))
n表示数据规模
f(n) 存在的某个函数,使得T(n)/f(n)=非零常数, 那么f(n)称为T(n)的同数量级函数
T(n) 一段程序运行,各种操作代码所执行的总次数
O 表示渐进于无穷的行为
常见的时间复杂度量级
参考链接:五分钟学会时间复杂度
时间复杂度分析的基本策略:从内向外,从最深处开始分析。
有时候,算法中基本操作重复执行的次数还随问题的输入数据集不同而不同,如在冒泡排序中,输入数据有序而无序,其结果是不一样的。此时,我们计算平均值。
常见的算法的时间 复杂度之间的关系为:
O(1) < O(log n) < O(n) < O(nlog n) < O(n^2) < O(2^n) < O(n!) < O(n^n)
例如:
sum=0; (1)
for(i=1;i<=n;i++) (2)
for(j=1;j<=n;j++)(3)
sum++; (4)
计算时间复杂度:
语句(1)执行1次
语句(2)执行n次
语句(3)执行n^2次
语句(4)执行n^2次
再例如:
for (int i = 2; i < n; i++) {
i *= 2;
printf("%i\n", i);
}
计算时间复杂度
假设循环次数为t,则循环条件满足:2^t < n
则执行次数:
T
(
n
)
=
lim
n
→
+
∞
l
o
g
2
n
T(n)=\lim_{n\rightarrow+\infty}{log_{2}n}
T(n)=n→+∞limlog2n
时间复杂度为O(log_2(n)),即O(log n)。
再加上递归呢:
long long Fib(long long N)
{
if (N < 3) //当N<3时,斐波那契数为1
return 1;
return Fib(N - 1) + Fib(N - 2);//函数递归
}
参考链接:斐波那契数的时间复杂度、空间复杂度详解
空间复杂度
算法的空间复杂度通过计算算法所需的存储空间实现,算法空间复杂度的计算公式记作:**S(n) = O(f(n))*
其中,n表示问题规模,f(n)为语句关于n所占存储空间的函数。
一个算法在计算机存储器上所占用的存储空间,包括三个方面
- 存储算法本身所占用的存储空间
- 算法的输入输出数据所占用的存储空间
- 算法在运行过程中临时占用的存储空间
若输入数据所占空间只取决于问题本身,和算法无关,则只用计算辅助单元空间即可。
若算法执行时,所需的辅助空间相对于输入数据量而言是常数,则称此算法为原地工作,空间复杂度O(1);
小结:
1、算法复杂度速查表
2、
Github上图片怎么显示不出来啊,😥😥😥,有大佬知道的,还望告诉一声。试了:1、改host;2、相对路径/绝对路径,均以无效告终。