【从0到1学算法】大O表示法
一般我们在选择算法时,都是想要选择效率最高的算法。那算法的效率,用什么表示?没错!就是用大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个位置 1 第2个位置 2 第3个位 3 第n个位置 n 不在列表中 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;
++i;
j++;
int m = i + j;
i、j、m 所分配的空间都不随着处理数据量变化,因此它的空间复杂度 O(1)。
空间复杂度 O(n)
int[] m = new int[n]
for(i=1; i<=n; ++i)
{
j = i;
j++;
}
第一行new了一个长度为n的数组m,占用大小为n,后面虽然有循环,但没有再分配新的空间,因此,这段代码的空间复杂度主要看第一行即可,即O(n)。
PS
【从0到1学算法】大O表示法的更多相关文章
- 0算法基础学算法 搜索篇第二讲 BFS广度优先搜索的思想
dfs前置知识: 递归链接:0基础算法基础学算法 第六弹 递归 - 球君 - 博客园 (cnblogs.com) dfs深度优先搜索:0基础学算法 搜索篇第一讲 深度优先搜索 - 球君 - 博客园 ( ...
- 1129: 零起点学算法36——3n+1问题
1129: 零起点学算法36--3n+1问题 Time Limit: 1 Sec Memory Limit: 64 MB 64bit IO Format: %lldSubmitted: 4541 ...
- 公钥密码之RSA密码算法大素数判定:Miller-Rabin判定法!
公钥密码之RSA密码算法大素数判定:Miller-Rabin判定法! 先存档再说,以后实验报告还得打印上交. Miller-Rabin大素数判定对于学算法的人来讲不是什么难事,主要了解其原理. 先来灌 ...
- 重拾算法之复杂度分析(大O表示法)
.katex { display: block; text-align: center; white-space: nowrap; } .katex-display > .katex > ...
- 1164: 零起点学算法71——C语言合法标识符(存在问题)
1164: 零起点学算法71——C语言合法标识符 Time Limit: 1 Sec Memory Limit: 64 MB 64bit IO Format: %lldSubmitted: 10 ...
- 1147: 零起点学算法54——Fibonacc
1147: 零起点学算法54--Fibonacc Time Limit: 1 Sec Memory Limit: 64 MB 64bit IO Format: %lldSubmitted: 20 ...
- 1137: 零起点学算法44——多组测试数据输出II
1137: 零起点学算法44--多组测试数据输出II Time Limit: 1 Sec Memory Limit: 64 MB 64bit IO Format: %lldSubmitted: ...
- 1135: 零起点学算法42——多组测试数据(求和)IV
1135: 零起点学算法42--多组测试数据(求和)IV Time Limit: 1 Sec Memory Limit: 64 MB 64bit IO Format: %lldSubmitted ...
- 1134: 零起点学算法41——多组测试数据(a+b)III
1134: 零起点学算法41--多组测试数据(a+b)III Time Limit: 1 Sec Memory Limit: 64 MB 64bit IO Format: %lldSubmitt ...
随机推荐
- R 《回归分析与线性统计模型》page141,5.2
rm(list = ls()) library(car) library(MASS) library(openxlsx) A = read.xlsx("data141.xlsx") ...
- CSAPP读书笔记--第八章 异常控制流
第八章 异常控制流 2017-11-14 概述 控制转移序列叫做控制流.目前为止,我们学过两种改变控制流的方式: 1)跳转和分支: 2)调用和返回. 但是上面的方法只能控制程序本身,发生以下系统状态的 ...
- 二进制中1的个数(n=(n&n-1))
题目描述 输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. 解题:利用Java系统提供的函数Integer.toBinaryString(n),将整数转化为二进制,之后再将二进制的0用 ...
- Ceph 概念理解
简介 Ceph是一个可靠地.自动重均衡.自动恢复的分布式存储系统,根据场景划分可以将Ceph分为三大块,分别是对象存储.块设备存储和文件系统服务. 在虚拟化领域里,比较常用到的是Ceph的块设备存储, ...
- c# quartz
quartz调度核心元素: Scheduler:任务调度器,是实际执行任务调度的控制器.在spring中通过SchedulerFactoryBean封装起来. Trigger:触发器,用于定义任务调度 ...
- POJ 1905:Expanding Rods 求函数的二分
Expanding Rods Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 13780 Accepted: 3563 D ...
- 用fiddler监控移动端的通讯
用fiddler监控移动端的通讯 1 依次打开Fiddler->Tools->Fiddler Options在[Connection]面板里将Allow remote computers ...
- word中替换内容
参考了一篇文章 然后做了如下修改 用python的win32com模块替换word中的文字搞定批量打印奖状 python 操作 office python操作word # -*- coding: u ...
- Spring Boot2(007):关于Spring beans、依赖注入 和 @SpringBootApplication 注解
一.关于Spring beans 和 依赖注入(Dependency Injection) spring boot 和 Spring 全家桶无缝衔接,开发过程中可以很轻松地使用 Spring 全家桶的 ...
- ExcelPackage导入导出,命名空间一定要是EPPlus
1.引入EPPlus.dll,旧版的是OfficeOpenXml.dll,最好使用EPPlus2.调用 string path = UploadExecl(batchUpload.BinaryExce ...