数据结构与算法(1):大O表示法

大O表示法

1. 算法分析简介

① 算法:为逐步解决问题而设计的一系列通用指令,即解决问题的方法;
② 程序:表示算法的编程语言集,程序由算法和数据结构组成;
③ 算法分析:基于所使用的计算资源对算法进行分析比较,计算资源通常包括执行速度和占用内存空间大小,对应"时间复杂度"和"空间复杂度"。

精确表示算法的效率是困难的,只能近似地进行描述。分析算法的优劣,可以从时间复杂度和空间复杂度入手,由于不同计算机的算力不同,直接将计算机运行时间和内存占用情况作为指标进行对比是不具备比较的意义。为摆脱硬件设施的影响,通常用大O表示法对算法性能进行描述。

2. 大O表示法

2.1 简介

数量级(order of magnitude)常被称作大O表示法,记为O(f(x))。大O符号是由德国数论学家保罗·巴赫曼(Paul Bachmann)在其1892年的著作《解析数论》(Analytische Zahlentheorie)首先引入的。大O表示法是用函数来描述一个函数运算量数量级的渐近上界,即用函数表征运行时间如何随数据量增长而变化。

2.2 如何用大O法表示算法计算时间复杂度

2.2.1 算法执行步数与大O法

将每一步计算定义为基本计算单元,算法执行时间就与算法执行步数成正比。

例1:求和

sum = 0
for i in range(n):
   sum += i

该算法中,赋值语句执行次数是1,求和次数为n,那么计算步数 T ( n ) = 1 + n T(n)=1+n T(n)=1+n,此时, O ( T ( n ) ) = n O(T(n))=n O(T(n))=n
O只表示出运算的数量级

例2:求和

sum1 = 0
sum2 = 0
sum3 = 0
for i in range(n):
   for j in range(n):
   sum1 += i
   sum2 += j
   sum3 = sum3 + i + j

该算法中,三个赋值语句执行次数是3,sum1-sum3的求和次数为3 n 2 n^2 n2,那么计算步数 T ( n ) T(n) T(n)=3+3 n 2 n^2 n2,此时, O ( T ( n ) ) O(T(n)) O(T(n))= n 2 n^2 n2(起决定性作用的是 n 2 n^2 n2,因此3可以忽略)。

以上两个例子,简单描述了大O表示法与运算步骤数的关系,大O只体现算法运算的数量级,常见算法数量级如下:
在这里插入图片描述在这里插入图片描述

常见大O函数
注:图片来源于《Python数据结构与算法分析》
2.2.2 最好情况VS最坏情况VS平均情况

算法的性能不仅仅依赖问题的规模,还受到数据集的影响。

例3:找到列表中目标值的索引

list1 = [0,1,2,3,4,5,6,7,8,9]
num = 0
for i in range(len(list1)):
   if list1[i] == num:
       print(i)
       break

当num的值刚好为0,一次查找就能够找到,这就是最好情况;而当num的值为9时,需要10次才能找到,这是最差情况;而平均情况介于最好情况和最坏情况之间,这里如果num是等概率随机分布的,那么平均需要5.5次才能找到。

常见数据结构操作效率

在这里插入图片描述
注:表格来源【https://www.cnblogs.com/liuboren/p/11883194.html】

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值