当前位置:   article > 正文

算法入门——大O表示法,时间、空间复杂度_在算法中o是

在算法中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表示法该如何表示。

  1. # 第一组
  2. print('Hello,World')
  3. # 第二组
  4. for i in range(n):
  5.    print('Hello,World')
  6. # 第三组
  7. for i in range(n):
  8.    for j in range(n):
  9.        print('Hello,World')
  10. # 第四组
  11. for i in range(n):
  12.    for j in range(n):
  13.        for k in range(n):
  14.            print('Hello,World')

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

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

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

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

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

再看下面两组代码:

  1. # 第一组
  2. print('Hello,World')
  3. print('Hello,Python')
  4. print('Hello,Java')
  5. # 第二组
  6. for i in range(n):
  7.    print('Hello,World')
  8.    for j in range(n):
  9.        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。

空间复杂度

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

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

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

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

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

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

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/508157
推荐阅读
相关标签
  

闽ICP备14008679号