一般我们在选择算法时,都是想要选择效率最高的算法。那算法的效率,用什么表示?没错!就是用大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表示法的更多相关文章

  1. 0算法基础学算法 搜索篇第二讲 BFS广度优先搜索的思想

    dfs前置知识: 递归链接:0基础算法基础学算法 第六弹 递归 - 球君 - 博客园 (cnblogs.com) dfs深度优先搜索:0基础学算法 搜索篇第一讲 深度优先搜索 - 球君 - 博客园 ( ...

  2. 1129: 零起点学算法36——3n+1问题

    1129: 零起点学算法36--3n+1问题 Time Limit: 1 Sec  Memory Limit: 64 MB   64bit IO Format: %lldSubmitted: 4541 ...

  3. 公钥密码之RSA密码算法大素数判定:Miller-Rabin判定法!

    公钥密码之RSA密码算法大素数判定:Miller-Rabin判定法! 先存档再说,以后实验报告还得打印上交. Miller-Rabin大素数判定对于学算法的人来讲不是什么难事,主要了解其原理. 先来灌 ...

  4. 重拾算法之复杂度分析(大O表示法)

    .katex { display: block; text-align: center; white-space: nowrap; } .katex-display > .katex > ...

  5. 1164: 零起点学算法71——C语言合法标识符(存在问题)

    1164: 零起点学算法71——C语言合法标识符 Time Limit: 1 Sec  Memory Limit: 64 MB   64bit IO Format: %lldSubmitted: 10 ...

  6. 1147: 零起点学算法54——Fibonacc

    1147: 零起点学算法54--Fibonacc Time Limit: 1 Sec  Memory Limit: 64 MB   64bit IO Format: %lldSubmitted: 20 ...

  7. 1137: 零起点学算法44——多组测试数据输出II

    1137: 零起点学算法44--多组测试数据输出II Time Limit: 1 Sec  Memory Limit: 64 MB   64bit IO Format: %lldSubmitted: ...

  8. 1135: 零起点学算法42——多组测试数据(求和)IV

    1135: 零起点学算法42--多组测试数据(求和)IV Time Limit: 1 Sec  Memory Limit: 64 MB   64bit IO Format: %lldSubmitted ...

  9. 1134: 零起点学算法41——多组测试数据(a+b)III

    1134: 零起点学算法41--多组测试数据(a+b)III Time Limit: 1 Sec  Memory Limit: 64 MB   64bit IO Format: %lldSubmitt ...

随机推荐

  1. oracle根据一张表更新另外一张表

    知道是两张表进行更新,之前作过mysql的,直接就写了: update a,b set a.code = b.code wehre a.id = b.id 然后就报错了,上网查了下知道oracle不能 ...

  2. Day4 - L - Tram POJ - 1847

    Tram network in Zagreb consists of a number of intersections and rails connecting some of them. In e ...

  3. ASP.NETCore -----导出Excel文件并下载

    本事例分为nopi(安装DotNetCore.NPOI)下载和EPPlus(EPPlus.Core.dll)下载,其中npoi下载演示的是根据执行的模板进行数据下载 npoi帮助类NpoiExcelU ...

  4. 剑指offer自学系列(四)

    题目描述: 输入一个正整数数组,把数组里面所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个,例如输入数组{3,32,321},输出的最小数字为321323 题目分析: 如果采用穷举法,把 ...

  5. CheckBox标签和属性

    CheckBox的作用:可以提供复选 下面是我点击按钮查看所选内容的代码:定义按钮监听器,并在onClick方法中调用shoeAlt方法(此方法会在第二块代码定义) Button btn=(Butto ...

  6. DEDECMS打开网站后台系统首页卡解决方法

    找到根目录下(一般是dede) templets文件夹下找到index_body.htm文件,将第25行至第41行部分注释或删除 保存文件,然后再打开后台,就不会有这个问题了.

  7. SpringMVC原理及流程解析

    前言 春节期间宅在家里闲来无事,对SpringMVC进行了比较深入的了解,将之前模糊不清的地方基本摸索清楚了,特此撰文总结记录一下. 正文 一.一个请求为什么会调用到SpringMVC框架里? 首先问 ...

  8. pyinstaller打包PySide2写的GUI程序,调用ffmpeg隐藏CMD控制台解决方案

    1 问题描述 使用PySide2写了一个GUI程序,调用ffmpeg命令行工具,做简单的批量视频处理(调整帧宽度.帧高度.视频变速.降低视频码率达到限制视频大小),使用了ffmpeg. ffmpeg- ...

  9. Ubuntu 14.04 安装 Dash to Dock

    每次打开或选择一个已经打开的应用都要把鼠标指到左上角,相当费事. Ubuntu 14.04 GNOME自带 Tweaks (系统中名为:优化工具),可以使界面如Windows般(最小化.最大化.底部任 ...

  10. linux 命令之 objdump 简单使用

    objdump 介绍 objdump命令是用查看目标文件或者可执行的目标文件的构成的gcc工具 objdump 选项介绍 --archive-headers -a 显示档案库的成员信息,类似ls -l ...