为了账号安全,请及时绑定邮箱和手机立即绑定

算法复杂度分析(O)

标签:
大数据

算法复杂度是指算法在编写成可执行程序后,运行时所需要的资源,资源包括时间资源和内存资源。可以大概理解为操作的次数和数据个数的比例关系。

webp

算法复杂度分析

O

参考 《Data Structures and Algorithms in Python》 中给的一个例子:

考虑计算一个 n * n 矩阵所有元素的和:
\begin{bmatrix} 0 & 1 & 2 \ 3 & 4 & 5 \ 6 & 7 & 8 \ \end{bmatrix}
这里列举两种方式:

# version1total_sum = 0for i in range(n):
    row_sum[i] = 0    for j in range(n):
        row_sum[i] = row_sum[i] + matrix[i, j]
        total_sum = total_sum + matrix[i, j]# version2total_sum = 0for i in range(n):
    row_sum[i] = 0    for j in range(n):
        row_sum[i] = row_sum[i] + matrix[i, j]
    total_sum = total_sum + row_sum[i]    # 注意这里和上边的不同

v1 版本的关键操作在 j 循环里,两步加法操作,由于嵌套在第一个循环里,操作步骤是 (2n) * n = 2n^2
v2 版本的 total_sum 只有 n 次操作,它的操作次数是 n + n*n = n^2 + n
这里你可能还感觉不到它们有多大差别,因为计算机执行的太快了,但是当 n 增长特别快的时候,总的操作次数差距就很明显了:

webp

操作次数比较

通常我们不太关注每个算法具体执行了多少次,而更关心随着输入规模 n 的增加,算法运行时间将以什么速度增加。为此计算机科学家定义了一个符号, 用来表示在最糟糕的情况下算法的运行时间,大 O 符号,在数学上称之为渐进上界(《算法导论》)。

如何计算时间复杂度

上边我们列举了两个版本的计算矩阵和的代码,你看到了两个公式:

  • v1: 2n*n = 2n^2

  • v2: n + n*n = n + n^2

当 n 非常大的时候,n^2 的数值这里将占主导,我们可以忽略 n 的影响

  • v1: 2n*n = 2n^2

  • v2: n + n*n = n + n^2 \leq 2n^2

这里我们可以认为两个算法的时间复杂度均为 O(n^2)

常用时间复杂度

这里我们列举一些常用的时间复杂度,按照增长速度排序,日常我们的业务代码中最常用的是指数之前的复杂度,指数和阶乘的增长速度非常快, 当输入比较大的时候用在业务代码里是不可接受的。

O名称举例
1常量时间一次赋值
\log n对数时间折半查找
n线性时间线性查找
n\log n对数线性时间快速排序
n^2平方两重循环
n^3立方三重循环
2^n指数递归求斐波那契数列
n!阶乘旅行商问题

空间复杂度

相比时间复杂度,空间复杂度讨论比较少。因为用户老爷等不及,况且现在存储越来越白菜价了,更多时候我们为了提升响应速度宁可多 使用点空间。 空间复杂度相对好算一些,就是每个元素的空间占用乘以总的元素数,有些算法需要额外的空间存储,有些可以本地解决。 如果能本地搞定的我们成为 in place 的,原地操作,比如交换一个 数组中的某两个位置的元素。但是有些操作可能就需要申请额外的空间 来完成算法。

常见复杂度增长趋势图

为了有个直观的感觉,看看一些经典的时间复杂度和对应的增长趋势图,不同函数在输入规模增长的时候很快就会有巨大的增长差异

webp

常见复杂度增长趋势图

时间换空间,空间换时间

有一些时候时间和空间两者不可兼得,我们会牺牲其中之一来换取另一个。

空间换时间:比如典型的就是 python 中的集合,虽然它比较浪费空间,但是却能用 O(1) 的时间复杂度来判重。

时间换空间:当我们空间不够用,典型的就是缓存失效算法,我们不可能缓存下无限容量的数据,就会使用一些缓存淘汰算法来保证空间可用。



作者:GHope
链接:https://www.jianshu.com/p/db50851a3398


点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消