相关文章推荐
追风的投影仪  ·  沈阳地铁12号线未来规划展望_哔哩哔哩_bi ...·  2 月前    · 
爱看球的哑铃  ·  在技术领域裁员的安全隐患及化解方案-阿里云开 ...·  4 月前    · 
踢足球的可乐  ·  上海市人民政府办公厅关于印发《上海市自建房安 ...·  9 月前    · 
喝醉的小笼包  ·  永市监处罚(2023)149号·  1 年前    · 
近视的熊猫  ·  德耀中华 ...·  1 年前    · 
Code  ›  【从0到1学算法】大O表示法开发者社区
算法 查找算法 时间复杂度 二分查找
https://cloud.tencent.com/developer/article/1668150
完美的稀饭
1 年前
KEN DO EVERTHING

【从0到1学算法】大O表示法

腾讯云
开发者社区
文档 建议反馈 控制台
首页
学习
活动
专区
工具
TVP
最新优惠活动
文章/答案/技术大牛
发布
首页
学习
活动
专区
工具
TVP 最新优惠活动
返回腾讯云官网
KEN DO EVERTHING
首页
学习
活动
专区
工具
TVP 最新优惠活动
返回腾讯云官网
社区首页 > 专栏 > 【从0到1学算法】大O表示法

【从0到1学算法】大O表示法

作者头像
KEN DO EVERTHING
发布 于 2020-07-24 16:18:19
652 0
发布 于 2020-07-24 16:18:19
举报
文章被收录于专栏: KEN DO EVERTHING KEN DO EVERTHING

一般我们在选择算法时,都是想要选择效率最高的算法。那算法的效率,用什么表示?没错!就是用大O表示法。

PS : 大O表示法中,log即为log2,后面不再说明。

下面以简单查找和二分查找,在含有n个元素的有序列表中查找其中一个元素为例,下表总结了我们发现的情况。

使用简单查找时,最多需要猜测次数与列表长度相同,这被称为线性时间,大O表示法为O(n)。

二分查找则不同,最多需要猜测次数为logn(n为列表长度),这被称为对数时间(log时间),大O表示法为O(logn)。

基本概念

大O表示法指出了算法的速度有多快。

可能你会好奇,它的单位是多少?秒?没有单位,它并非指的是时间,而是从增量的角度衡量。

列表中查找元素,简单查找、二分查找的增速如下图。

假若我们不知道增速,只知道查找100个元素时的查找时间,猜测10000个元素时的查找时间:

对于简单查找,100个元素时为100毫秒,简单推算出10000个元素为10秒;

对于二分查找,100个元素时为7毫秒,简单推算出10000个元素为700毫秒。

PS:简单推算 10000个元素时的运行时间= 运行时间(100个元素时)* 100

简单查找的推算是对的,因为的增速是n,而二分查找的推算是错的,它的增速为logn,这便不能理所当然简单推算了。

很显然,我们只要知道算法的增速,便能知道它在n个元素中运行的运行时间了,大O表示法就是用来表示算法增速的。

专业描述:大O表示法表示操作数的增速,指出了算法运行时间的增速。

常见的大O运行时间(从快到慢)
  • O(㏒n) 对数时间 比如二分查找
  • O(n) 线性时间 比如简单查找
  • O(n*㏒n) 比如快速排序
  • O(n²) 比如选择排序
  • O(n!) 比如旅行者问题
大O表示法的不同维度
时间复杂度

上述的大O表示法都是用来表示 时间复杂度 ,而且通常指的是最坏情况下的时间复杂度。

通常有以下3种时间复杂度:

以简单查找为例子,在n个元素的列表中查找目标元素

  • 最好情况时间复杂度 :目标元素刚好在列表 第一个位置 ,那么只需要一次就能找到,时间复杂度为O(1)。
  • 最坏情况时间复杂度 :目标元素在列表 最后一个位置 或者 不在列表中 ,那么得需要遍历完整个列表才能得出结果,时间复杂度为O(n)。
  • 平均情况时间复杂度 :考虑目标元素在列表中任何位置的情况。 下面简单分析下:目标元素如果在列表中,出现的位置有n种情况,加上不在列表中这一种情况,总共n+1种情况。每种情况下需要遍历的次数如下表: 目标元素所在位置 第1个位置 第2个位置 2第3个位置 3第n个位置 不在列表中 平均遍历次数=各种情况遍历次数相加÷总的情况数 各种情况遍历次数相加为 ((1+2+3...+n)+n) ,总的情况数 (n+1)

平均情况复杂度为:

((1+2+3...+n)+n)/(n+1)=n(n+3)\2(n+1)

大O表示法,会 省略系数、低阶、常量, 所以平均情况时间复杂度是 O(n) 。

空间复杂度

空间复杂度是对一个算法在运行过程中临时占用存储空间大小的一个量度,反映的是一个趋势。

空间复杂度比较常用的有:O(1)、O(n)、O(n²),我们下面来看看:

空间复杂度 O(1)

如果算法执行所需要的临时空间不随着某个变量n的大小而变化,即此算法空间复杂度为一个常量,可表示为 O(1)。

例子:

int i = 1;
int j = 2;
int m = i + j;

i、j、m 所分配的空间都不随着处理数据量变化,因此它的空间复杂度 O(1)。

空间复杂度 O(n)

int[] m = new int[n]
 
推荐文章
追风的投影仪  ·  沈阳地铁12号线未来规划展望_哔哩哔哩_bilibili
2 月前
爱看球的哑铃  ·  在技术领域裁员的安全隐患及化解方案-阿里云开发者社区
4 月前
踢足球的可乐  ·  上海市人民政府办公厅关于印发《上海市自建房安全专项整治工作方案》的通知
9 月前
喝醉的小笼包  ·  永市监处罚(2023)149号
1 年前
近视的熊猫  ·  德耀中华 第八届全国道德模范候选人事迹(上)-光明日报-光明网
1 年前
今天看啥   ·   Py中国   ·   codingpro   ·   小百科   ·   link之家   ·   卧龙AI搜索
删除内容请联系邮箱 2879853325@qq.com
Code - 代码工具平台
© 2024 ~ 沪ICP备11025650号