序篇_算法复杂度计算

复杂度是用来衡量算法优劣的度量单位,而其定义又可从时空两个维度考虑:

  • 时间:执行当前算法所消耗的时间
  • 空间:执行当前算法需要占用多少内存空间

时间复杂度

​ 因为如果按实际运行程序的执行时间的话,可能会由于机器性能差异导致时间误差,所以大佬们提出了通用方法【大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;                (1for(i=1;i<=n;i++)2for(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、相对路径/绝对路径,均以无效告终。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值