算法入门——大O表示法,时间、空间复杂度

目录

大O表示法

时间复杂度

空间复杂度


算法

算法是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令。简单来说算法是一个计算过程,解决问题的方法。

任何代码片段都可视为算法,我们使用算法一般都是为了最大限度地减少运行时间或占用空间。

大O表示法来指出算法的速度,通过时间复杂度和空间复杂度来衡量算法的快慢。

大O表示法

大O表示法是一种特殊的算法,其作用是指出算法的速度,大O表示法表示方式如下:

其中:

  • O:是大写字母O;

  • n:表示操作数,操作数,它指出了算法的运行时间的增速。

从快到慢的顺序列出我们经常会遇到算法的5种运行时间:

  • O(log n):对数时间,该时间的算法包括二分查找法;

  • O(n):线性时间,该时间的算法包括顺序查找;

  • O(n * log n ):该时间的算法包括快速排序;

  • O(n ² ):该时间的算法包括选择排序;

  • O(n!):该时间的算法包括旅行商问题。

注意:

  • 算法的速度指的并非时间,而是操作数的增速;

  • 算法运行时间并不以秒为单位。

时间复杂度

时间复杂度是用来评估算法运行效率的式子。

在下面的几组代码中,假设每执行一行代码的时间为t,那么哪组代码运行时间最短呢,用大O表示法该如何表示。

# 第一组
print('Hello,World')                    
​
# 第二组
for i in range(n):                  
    print('Hello,World')
​
# 第三组
for i in range(n):                  
    for j in range(n):
        print('Hello,World')
​
# 第四组
for i in range(n):                  
    for j in range(n):
        for k in range(n):
            print('Hello,World')

在第一组代码中,因为只有一行代码,所以它的运行时间为O(t);

第二组代码中,有个for循环,执行了n次,所以它的运行时间为O(n×t);

第三组代码中,在for循环中嵌套了for循环,执行了n²次,所以它的运行时间为O(n²×t);

第四组代码中,在for循环中嵌套了for循环又嵌套了for循环,执行了n³次,所以它的运行时间为O(n³×t)

所以第一组代码运行时间最短。

再看下面两组代码:

# 第一组
print('Hello,World')
print('Hello,Python')
print('Hello,Java')
​
# 第二组
for i in range(n):
    print('Hello,World')
    for j in range(n):
        print('Hello,World')

在第一组代码中,有三行代码,共执行了3次,所以它的运行时间为O(3×t);

第二组代码中,第一个for循环中执行了print,所以执行时间为n×t,在嵌套的for循环中,执行了n次,所以运行时间为n²×t,所以第二组代码运行时间为O((n+n²)×t)。

答案是不是这样呢?答案是错误的,例如:烧一壶水需要多长时间,没有人会回答5分35秒的。也就是说没有会说个很具体的时间,都是说模糊的时间,例如烧一壶水需要几分钟。时间复杂度也是同样的道理。

所以我们需要把具体是时间模糊化,也就是把具体的时间复杂度表达式简化,所以第一组代码的运行时间为O(t),第二组代码的运行时间为O(n²),因为n² 的数据规模远大于 n。

空间复杂度

空间复杂度是用来评估算法内存占用大小的式子。空间复杂度的表示方式与时间复杂度完全一样。示例代码如下:

# 第一组
a='11'                  #变量
b='22'
c='33'
​
# 第二组
a=[1,2,3,,...,n]            # 一维数组
​
# 第三组
a[m][n]=9               # 二维数组

在第一组代码中,有a、b、c三个变量,所以其空间复杂度为O(1);

第二组代码中,a是一维数组,长度为n,所以其空间复杂度为O(n);

第三组代码中,a是二维数组,长度mn,所以其空间复杂度为O(mn);

注意:一般情况下,时间复杂度的优先级比空间复杂度优先级高,也就是优先选择时间复杂度低的算法。

好了,算法入门——大O表示法,时间、空间复杂度就学到这里了,下篇文章我们学习算法入门——顺序查找、二分查找。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

白巧克力LIN

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值