为什么要了解算法的效率?

一般来说,编程就是把各种已知的算法代入到自己的代码当中,以此来解决问题。因此,了解各种算法的效率对于我们选择一个合适的算法有很大帮助。

算法的效率由什么确定?

从算法分析的理论来讲,算法的效率通常由它们的复杂度来评估,包括时间复杂度和空间复杂度。由于现代计算机RAM空间充足,因此一般优先考虑时间复杂度。

时间复杂度用渐近记号(asymptotic notation)来表示,通常有 O、 Θ和Ω 记号法。渐进的意思就是当问题的规模变大时,解决这个问题所耗费的时间增加了多少。

(注:当规模较小时,无论是高效的算法还是低效的算法,时间耗费差距不明显,很可能产生误导的结果。所以算法分析针对大规模输入。)

如何测量算法的时间复杂度?

一个算法是由控制结构(顺序、分支和循环3种)和基本操作(指固有数据类型的操作)构成的,算法的运行时间与算法中语句的执行次数成正比例,某个算法中语句执行次数多,它运行花费的时间就多。比较同一个问题的不同算法的效率,通常的做法是,选取该算法的基本操作,以其基本操作的重复执行次数作为算法的时间量度,记为时间频度T(n)。n为问题的规模,当n不断变化时,T(n)也会不断变化。一般情况下,算法中重复执行基本操作的次数是问题规模n的某个函数,用T(n)表示。若有某个辅助函数f(n),当n趋近于无穷大时,T(n)/f(n)的极限值为不等于零的常数,则称f(n)是T(n)的同数量级函数,记作T(n)=O(f(n))。称O(f(n)) 为算法的渐进时间复杂度,简称时间复杂度。

(注:为什么不直接查看算法的运行时间呢?因为算法的运行时间受很多因素影响,例如计算机处理器的性能,计算机是否同时还在运行其他程序,等等。)

大O记号法(big O notation,O代表omicron,为希腊字母第15个字)的定义:

对于规模为 n的输入,当n增大时,运行这个函数所增加的运行时间的上界。

算法运行的几种情况(以在一个有n个元素的数列中查找某个元素为例):

  • 最好情况(Best Case):第一次就找到了,表示为O(1)
  • 期望情况(Expected Case):在数列中间的某个位置m找到,表示为O(m)
  • 最坏情况(Worst Case):在数列最后才找到,表示为O(n)

在实际使用中,我们一般仅考量算法在最坏情况下的运行情况,也就是对于规模为 n 的输入,算法的最长运行时间。这样做的理由是:

  1. 一个算法在最坏情况下的运行时间是在任何输入下运行时间的一个上界(Upper Bound),不管其他情况如何,运行时间不会更长
  2. 对于某些算法来说,最坏情况出现的次数还是比较频繁的,比如在数据库中检索一条实际并不存在的记录
  3. 很多时候,算法的期望情况和最坏情况一样差。例如插入排序在最坏情况下(数组事先逆序)和平均情况下(假设有一半逆序),复杂度均为O(n2)

算法复杂度的类型:

  • O(1) --- 常量复杂度(constant complexity)
  • O(n)  ---  线性复杂度(linear complexity)    its runtime grows "on the order of the size of the input"
  • O(n2)  ---  二次方复杂度(quadratic complexity)    its runtime grows "on the order of the square of the size of the input"
  • O(log n)  ---  对数复杂度(logarithmic complexity)
  • O(cn)  ---  指数复杂度((exponential complexity)

其他还有O(n3)三次方复杂度,O(n!)阶乘复杂度等等。

用例子来说明不同类型的算法复杂度:

假设我们现在要自己写一段代码来计算ab的结果(b为正整数)。

方法一:

def exp1(a,b):ans=1while b>0:ans*=ab-=1return ans

此算法基本步骤为:3b+2步(每个循环里面有3步,一共循环b次,再加上初始ans赋值和返回ans值这两步)。当b足够大时,其他数字都不重要了,因此这个算法是一个线性复杂度的算法。

方法二:

def exp2(a,b):if b==1:return areturn a*exp2(a,b-1)

此算法基本步骤为:3b-1步(此处省略推算过程,具体可见参考视频第12分钟处)。因此这个算法也是一个线性复杂度的算法。

方法三:

def exp3(a,b):if b==1:return aif b%2==0:  # 如果b是偶数return (a*a)**(b/2)else:   # 如果b是奇数,a的b次方等于a*a**(b-1)return a*exp3(a,b-1)

此算法基本步骤为:log b步(此处省略推算过程,具体可见参考视频第17分钟处)。因此这个算法是一个对数复杂度的算法。

方法四:

def exp4(a,b):ans=0for i in range(a):for j in range (b):ans+=1return ans

此算法基本步骤为:b2步(此处省略推算过程,具体可见参考视频第20分钟处)。因此这个算法是一个二次方复杂度的算法。

不同类型算法复杂度的时间增长对比:

O(1) --- 输入增大10倍,解决问题的时间不变

O(n) --- 输入增大10倍,解决问题的时间相应增大10倍

O(log n) --- 输入增大10倍,解决问题的时间相应增大1倍

O(n2) --- 输入增大10倍,解决问题的时间相应增大100倍

参考:麻省理工学院公开课:计算机科学及编程导论 (第8课)

 

转载于:https://www.cnblogs.com/HuZihu/p/7614460.html

用大O记号法测量算法的效率(Algorithm efficiency Asymptotic notation Big O notation)相关推荐

  1. 干支纪年法简便算法_传感智库丨流速面积法测量明渠断面流量

    随着工农业生产和生活用水量的增加,水资源供需矛盾日益尖锐,计划用水和水量调配工作显得越来越重要,很多场合都需要能够迅速.准确地测量明渠断面流量. 目前,国内外研究水流流量的方法主要有:垂直多普勒法.流 ...

  2. 三维数组怎么排列_【连载5.3】三维测量算法GPU实现

    5 第五章 三维测量算法实时化研究 5.3三维测量算法GPU实现 本研究尝试使用CPU+GPU异构并行计算方法实现基于运动补偿的高速视觉三维测量算法,实现原理框图如图5.3所示.由基于GPU的CUDA ...

  3. 一种基于图像识别的水位测量算法

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 一.引言 我国是一个水灾频发的国家,水安全问题已成为影响经济和社会 ...

  4. (转)回溯法-算法框架及基础

    好,顶 原文地址:(转)回溯法-算法框架及基础作者:jinyang6655 转自http://lilongfei1030.blog.163.com/blog/static/86015282008720 ...

  5. Java 二分查找算法及效率比较

    1.前提:二分查找的前提是需要查找的数组必须是已排序的,我们这里的实现默认为升序 2.原理:将数组分为三部分,依次是中值(所谓的中值就是数组中间位置的那个值)前,中值,中值后:将要查找的值和数组的中值 ...

  6. opencv 卡尺法 测量边缘距离

    opencv 卡尺法 测量边缘距离 参考来源 :https://github.com/crackwitz/metrology-demo 文章目录 opencv 卡尺法 测量边缘距离 前言 一.测量方法 ...

  7. 用四级法测量计算机土壤电阻率,土壤电阻率的原理及测量土壤电阻率的测量方法...

    土壤电阻率的原理及测量土壤电阻率的测量方法 1.土壤电阻率的原理及测量 ◆土壤电阻率是土壤的一种基本物理特性,是土壤在单位体积内的正方体相对两面间在一定电场作用下,对电流的导电性能.一般取1m的正方体 ...

  8. 热分析技术清单:导热材料热扩散系数闪光法测量中的样品厚度选择

    本文由"上海依阳实业有限公司"原创 原文网址:http://www.eyoungindustry.com/2013/1024/45.html 摘要:本文主要针对各向同性.有限尺寸. ...

  9. 闪光法测量高导热碳化硅(4H-SiC、6H-SiC)圆晶中存在的问题

    摘要:对于高导热碳化硅(4H-SiC.6H-SiC)圆晶的导热系数测试,目前普遍都采用闪光法,但都存在测试结果偏低的现象.本文基于这种高导热碳化硅特性和闪光法,解释了这种测试误差较大的原因,并通过相关 ...

  10. “马的遍历”问题的贪婪法解决算法

    /**//*    标题:<<系统设计师>>应试编程实例-[递推算法程序设计]     作者:成晓旭     时间:2002年09月14日(18:20:00-20:18:00) ...

最新文章

  1. C++ 笔记(28)— C++ 中 NULL和 nullptr 的区别
  2. SpringBoot 2.0 多图片上传加回显
  3. 互联网团队协作:可追溯【连载三】
  4. QQ牧场在高速模式下的一些小bug
  5. 【caffe解读】 caffe从数学公式到代码实现3-shape相关类
  6. 手机定位和什么有关?关机后的手机还能被定位吗?
  7. PWN-PRACTICE-BUUCTF-25
  8. Spark集群,多个版本Python/Python Package管理
  9. Java中各种引用(Reference)解析
  10. 【工程项目经验】函数编译可见性
  11. 正确选择报表工具的十大标准
  12. KL散度、JS散度以及交叉熵对比
  13. matlab 换热器仿真,基于MATLAB的换热器温度控制仿真研究.doc
  14. Oracle查询语句中SYSDATE与HIRE_DATE的区分
  15. CVE-2017-0199——首个Microsoft Office RTF漏洞
  16. android 安装界面关闭程序,Android安装apk文件,不弹出安装完成的界面
  17. 理解LINQ预编译查询(Compiled LINQ)
  18. 二级路由当作交换机,与一级路由同一个局域网
  19. 插值、拟合和逼近的对比
  20. 豪掷 5 亿美元,国外支付巨头 CEO 帮助斯坦福女友实现科研自由!

热门文章

  1. 小学生python编程教程-python 小学生教程|怎么让一个小学生学会Python?
  2. batchplot插件用法_怎么使用Batchplot命令批量打印CAD图纸
  3. mysql 拖库_【渗透测试】温故知新之拖库七种方法
  4. wpf 复制到粘贴板_将WPF UI单元复制到剪贴板-阿里云开发者社区
  5. centos7服务器安装无线网卡,CentOS 7 安装无线网卡驱动方法实例教程
  6. 9、Ubuntu控制Android系统设备(Android手机)应用(图形化界面和访问文件系统及启动App)
  7. 开发者经验谈:如何一天时间搞定iOS游戏开发?
  8. EEPROM、FLASH、NOR FLASH、NAND FLASH 区别、关系总结
  9. php怎么调用php语言包,thinkphp里怎么调用语言包
  10. JAVA中读写文件操作