大O表示法的理解

一. 背景

在现实生活中,解决一个问题可以有多种方法,其中有好的方法,也有较为一般的方法。评判标准虽有不同,但总体思想是:用最小的代价获得最多的收益。

这里所说代价并不仅指金钱开销,有时也包括时间,所耗费资源等。

计算机程序也是为了解决问题而编写的。同理可知,程序有好的,也有一般的,评判标准主要有两方面:时间与空间。

人们都希望事情解决的越快越好,所以程序解决问题花费的时间一定要少。计算机资源是有限的,所以程序也要尽可能的少消耗资源。

不过很多时候不能两全其美,此时应该抓主要矛盾。在编程时,很多场合会用空间消耗的增加来换取运行时间的减少。毕竟对于我们来说,时间一般会更加重要。

二. 引入

那么应该怎么比较不同算法之间的优劣呢?答:应该从时间与空间两方面入手。

打个比方:

你的书架上有100本书,它们是任意放置的,没有先后次序。你想在其中找到《算法导论》,那么你需要从头找到尾,运气好的话,第一本就是,运气不好的话,你就要找到最后。

但是有一天你突发奇想,为每本书编号并且记住了,那么运用二分查找,最多只需要找7次。

忽然有一天,你买了1000本书,还是没有先后次序地都放在书架上,并且又想找到《算法导论》,这次情况就会比较复杂,运气好的话,第一本就是,运气不好的话,你要找遍这1000本书。

但是你发现编号的方法比较好找,于是再次编号并运用二分查找,最多只要10次。

三. 大O记号

我们将按照书籍一一查找的方法,叫做方法一;将二分查找叫做方法二。

显然,方法一的查找次数跟书籍的书量相关,你有1万本书的时候,最坏情况就要找1万次。而方法二则快的多。

方法一的算法叫做线性查找,当你有 n 本书的时候,最多需要 n 次查找。线性的意思是算法所需要的时间跟数据的量成正比。

方法二(二分查找)所需要的时间也跟数据量相关,但是并不会随着数据量的增长而剧烈增加。

可以发现,算法的执行时间是与数据量有关的。

在方法一中,从 n 本书中找到一本书,最坏情况下需要找 n 次,我们将这种最坏情况下需要的时间记为 O( n )。最好情况只需要找一次,即第一本书就是,我们将这种情况记为 Ω (1)。

我们用大O表示最坏情况下需要的时间时间,用大 Ω 表示最好情况下需要的时间。不过最好情况并不总会发生,所以它的意义不大。

一般讨论的都是最坏情况下需要的时间,它给了人们一种保证,即最坏情况下所用的时间是多少。

四. 时间还是次数?

1. 回到上面的例子中,你有 n 本书时,最坏情况需要的时间是 O( n ),那有 2n 本书时呢?答:也应该表示为 O ( n ),而不是 O ( 2n )。

我们关注的是算法所花时间随着数据量增长的量级,应该抛去其中不重要的项,只留下起决定性因素的项,而不是具体的函数。

这里又会有一个新的问题。

假设一个成年人从100本书中找一本,最多需要100次,花费1小时;一个小孩从100本书中找一本,最多需要100次,花费10小时。

100次是相同的次数,而1小时和10小时却不一样。不同的人按照同一种工序执行一种操作,操作相同,但花费时间不同。

同样一个程序,在不同的计算机上运行,最后花费的时间必然不一样,由此可见,具体的时间并不能用来衡量算法的优劣。

我们发现,两个人都用了100次,说明不管是谁来操作,都需要花费100次,这里是同一个算法在不同平台上的比较。

而不同算法之间的横向比较,也需要通过次数来进行。

线性查找在A计算机上执行100次,花费1小时;在B计算机上执行100次,花费10小时。

二分查找在A计算机上执行7次,花费1分钟;在B计算机上执行7次,花费10分钟。

显然,二分查找不论哪种情况,都要比线性查快,哪怕是两台计算机的运行时间不一样。

我们关注的就是这种增长率,而不是具体的时间。通过分析的手法,能够提前估算算法需要的时间,而不是分别运行两个算法再统计时间。

2. 在程序中,计算时间复杂度时,是按照语句的执行次数来计算的。

前面说过,同样的程序,在不同计算机上的运行时间不同,不同的算法在不同的计算机上运行时间也不一样,所以不应该用时间作为统一的衡量标准。

但是一个算法,在处理相同数据量时,语句运行的次数是一样的,并且我们假设每条语句的运行时间相同(具体时间是多少无关紧要),为一个确定的数值,那么算法的时间复杂度用大O表示法来表示。

原文地址:https://www.cnblogs.com/Hello-Nolan/p/12242116.html

时间: 2024-10-13 14:49:08

大O表示法的理解的相关文章

大数据三特点的理解

写这篇文章始于对维克托前辈<大数据时代>的理解与思考,大数据的浪潮已经一波一波地拍打在中国的土地上,各行各业都在积极的探索与这一技术的接轨 和发展的机遇,所以能够见证并亲历这一个变革技术的时代我们这一代是幸运的.之所以说大数据时代是一次变革,不光是其技术进步所带来的,其伴随的思维冲击 与变革也是前所未有的.这些对于大数据时代到来的赞美之词,在追捧大数据的人群中可以说是声音此起彼伏,溢于言表.但是根据我身临其境的观察发现人群中的 声音有不乏少数的嘈杂与偏颇,所以想写一篇文章来表述自己的理解以及和

大O表示法

一.大O表示法定义 大O表示法是一种特殊的表示法,指出了算法的速度有多快.当然是趋向于操作的次数,因为每种操作的方式不同所需的时间也就无法统一.大O表示法通常作为一个算法优劣的标准,越快越好,数值越小越快. 二.大O表示法语法 O(n) 例: 假设列表有n个元素,简单查找需要查找每个元素,因此需要执行n次操作.使用大O表示法记做:O(n) 如果用二分法查找,则需要执行 log 2n 次操作.使用大O表示法记做:O(log 2n) 三.理解大O表示法 大O表示法记录的是最糟糕情况下的运行次数. 从

大O表示法(向往罗马)

一.身在斯洛文尼亚的阿拉里克得到斯提里科被杀的消息后,仰天大笑:"终于没有人能阻止我去罗马了."当他手下的将军问:"不知大王打算走哪条路去罗马?"西哥特王哈哈大笑,说出了那句千古名言:All roads lead to Rome 二.最近看了Mark Allen Weiss的<数据结构与算法分析---java语言描述>,看到第二章的算法分析,看到里面对算法时间预估方式用到的相对增长率(relative rate of growth).同时为了准确计算不同

2、数据结构与算法之大O表示法

一.大O表示法 大O表示法不是一种算法.它是用来表示一个算法解决问题的速度的快慢.一般我们描述一件事情完成的快慢是用时间描述的,比如说我完成一道计算题用了多少分钟.但算法的运算是很难用准确的时间来描述的,所以我们就用算法解决问题一共用了多少步来表示算法的快慢. 用第一篇的两种查找方法来举例,简单查找我们要用列表中的每一个元素逐一去比较,如果有n个元素,那么简单查找最多需要n步找到数据(数据在列表末尾).而二分查找一次只用中位数去作比较,当查找有n个元素的数组时,最多需要log2n次. 用大O表示

1. 时间复杂度(大O表示法)以及使用python实现栈

1.时间复杂度(大O表示法): O(1) < O(logn) < O(n) < O(nlogn) < O(n2) < O(n3) < O(2n) < O(n!) < O(nn) (1)Python中常用数据结构的时间复杂度: list内置操作的时间复杂度: dict内置操作的时间复杂度: (2)抽象数据类型(ADT: Abstract Data Type): 常用数据运算(5种): 增(插入) 删(删除) 改(修改) 查(查找) 排序   2. 栈的实现:

大O表示法(Big O nonation)

大O表示法是用来表示一个算法在最糟糕情况下的运行时间.需要注意的是算法运行时间并不以秒为单位并且是从其增速的角度度量的. 下面是5个常见的大O运行时间 ? O(log n), also known as log time. Example: Binary search. ? O(n), also known as linear time. Example: Simple search. ? O(n * log n). Example: A fast sorting algorithm, like

算法图解之大O表示法

什么是大O表示法 大O表示法可以告诉我们算法的快慢. 大O比较的是操作数,它指出了算法运行时间的增速. O(n) 括号里的是操作数. 举例 画一个16个格子的网格,下面分别列举几种不同的画法,并用大O表示法表示 1.  一次画一个格子.O(n) 2. 折叠纸张,折叠四次就能出现16个格子.O(log n) 大O表示法所表示的是一个算法在最糟糕情况下的运行时间. 一些常见的大O运行时间 O(log n),也叫对数时间,二分查找. O(n),也叫线性时间,简单查找. O(n * log n),快速排

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

一般我们在选择算法时,都是想要选择效率最高的算法.那算法的效率,用什么表示?没错!就是用大O表示法. PS: 大O表示法中,log即为log2,后面不再说明. 下面以简单查找和二分查找,在含有n个元素的有序列表中查找其中一个元素为例,下表总结了我们发现的情况. 使用简单查找时,最多需要猜测次数与列表长度相同,这被称为线性时间,大O表示法为O(n). 二分查找则不同,最多需要猜测次数为logn(n为列表长度),这被称为对数时间(log时间),大O表示法为O(logn). 基本概念 大O表示法指出了

快速排序法精简理解

今天工作的空余时间比较多,说点废话. 话说三国时期,孙权送来了一头巨象给曹操,曹操想知道这象的重量,询问属下,都不能说出称象的办法.曹冲说:“把象放到大船上,在水面所达到的地方做上记号,再让船装载其他东西(当水面也达到记号的时候),称一下这些东西,那么比较下(东西的总质量差不多等于大象的质量)就能知道了.” 将一个问题分割称一些小问题,然后递归解决,再利用这些小问题的解合并成原来的的大问题的解,此乃分而治之法. 我理解的快速排序,就是一种分而治之方法. 1.从数列中选出一个元素作为基数(pivo