03 | 复杂度分析(上):如何分析、统计算法的执行效率和资源消耗?

事后统计法:

(把代码跑一遍,通过统计、监控,就能得到算法的执行时间和占用的空间大小)

1)测试结果非常依赖测试环境,测试环境中硬件的不同会对测试结果有很大的影响。

2)测试结果受数据规模的影响很大。待排序数据的有序度不一样,排序的执行时间就会有很大的差别。

 

在不运行代码的情况下,用“肉眼”得到一段代码的执行时间;

所以代码的执行时间T(n)与每行代码的执行次数n成正比 ~~~  T(n) = O(f(n))

 

时间复杂度分析:

1. 只关注循环执行次数最多的一段代码

O 这种复杂度表示方法只是表示一种变化趋势。通常会忽略掉公式中的常量、低阶、系数,只需要记录一个最大阶的量级就可以了。在分析一个算法、一段代码的时间复杂度的时候,也只关注循环执行次数最多的那一段代码就可以了。这段核心代码执行次数的 n 的量级,就是整段要分析代码的时间复杂度。

2. 加法法则:总复杂度等于量级最大的那段代码的复杂度

3. 乘法法则:嵌套代码的复杂度等于嵌套内外代码复杂度的乘积

几种常见时间复杂度实例分析

粗略地分为两类,多项式量级非多项式量级

其中,非多项式量级只有两个:O(2n) O(n!)。当数据规模 n 越来越大时,非多项式量级算法的执行时间会急剧增加,求解问题的执行时间会无限增长。所以,非多项式时间复杂度的算法其实是非常低效的算法。

O(1) 一般情况下,只要算法中不存在循环语句、递归语句,即使有成千上万行的代码,其时间复杂度也是Ο(1)

O(logn)O(nlogn)

x=log2n,所以,这段代码的时间复杂度就是 O(log2n)

不管是以 2 为底、以 3 为底,还是以 10 为底,我们可以把所有对数阶的时间复杂度都记为 O(logn)。对数之间是可以互相转换的,log3n 就等于 log32 * log2n,所以 O(log3n) = O(C * log2n),其中 C=log32 是一个常量。因此,在对数阶时间复杂度的表示方法里,我们忽略对数的,统一表示为 O(logn)

 

O(m+n)O(m*n)m n 是表示两个数据规模。我们无法事先评估 m n 谁的量级大,所以我们在表示复杂度的时候,就不能简单地利用加法法则,省略掉其中一个。所以,上面代码的时间复杂度就是 O(m+n)

空间复杂度分析

时间复杂度的全称是渐进时间复杂度表示算法的执行时间与数据规模之间的增长关系。类比一下,空间复杂度全称就是渐进空间复杂度asymptotic space complexity),表示算法的存储空间与数据规模之间的增长关系

常见的空间复杂度就是 O(1)O(n)O(n2 ),像 O(logn)O(nlogn) 这样的对数阶复杂度平时都用不到。而且,空间复杂度分析比时间复杂度分析要简单很多。

复杂度也叫渐进复杂度,包括时间复杂度和空间复杂度,用来分析算法执行效率与数据规模之间的增长关系,越高阶复杂度的算法,执行效率越低。

常见的复杂度并不多,从低阶到高阶有:O(1)O(logn)O(n)O(nlogn)O(n2 )

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值