2.8 函数的渐近增长

我们现在来判断一下,两个算法A和B哪个更好。假设两个算法的输入规模都是n,算法A要做2n + 3次操作,你可以理解为先有一个n次的循环,执行完成后,再有一个n次循环,最后有三次赋值或运算,共2n + 3次操作。算法B要做3n + 1次操作。你觉得它们谁更快呢?
        准确说来,答案是不一定的(如表2-8-1所示)。

当n = 1时,算法A效率不如算法B(次数比算法B要多一次)。而当n = 2时,两者效率相同;当n > 2时,算法A就开始优于算法B了,随着n的增加,算法A要越来越好过算法B了(执行的次数比B要少)。于是我们可以得出结论,算法A总体上要好过算法B。
        此时我们给出这样的定义,输入规模n在没有限制的情况下,只要超过一个数值N,这个函数就总是大于另一个函数。我们称函数是渐近增长的。

函数的渐近增长:给定两个函数f(n)和g(n),如果存在一个整数N,使得对于所有的n > N,f(n)总是比g(n)大,那么,我们说f(n)的增长渐近快于g(n)。

从中我们发现,随着n的增大,后面的 +3还是 +1其实是不影响最终的算法变化的,例如算法A’与算法B’。所以,我们可以忽略这些加法常数。后面的例子,这样的常数被忽略的意义可能会更加明显。
        我们来看第二个例子。算法C是4n + 8,算法D是2n2 + 1(如表2-8-2所示)。

当n < = 3的时候,算法C要差于算法D(因为算法C次数比较多),但当n > 3后,算法C的优势就越来越优于算法D了,到后来更是远远胜过。而当后面的常数去掉后,我们发现其实结果没有发生改变。甚至我们再观察发现,哪怕去掉与n相乘的常数,这样的结果也没发生改变,算法C’ 的次数随着n的增长,还是远小于算法D’。也就是说,与最高次项相乘的常数并不重要。
        我们再来看第三个例子。算法E是2n2 + 3n + 1,算法F是2n3 + 3n + 1(如表2-8-3所示)。

当n = 1的时候,算法E与算法F结果相同,但当n > 1后,算法E的优势就要开始优于算法F,随着n的增大,差异非常明显。通过观察发现,最高次项的指数大的,函数随着n的增长,结果也会变得增长特别快。
        我们来看最后一个例子。算法G是2n2,算法H是3n + 1,算法I是2n2 + 3n + 1(如表2-8-4所示)。

这组数据应该就看得很清楚。当n的值越来越大时,你会发现,3n+1已经没法和2n2的结果相比较,最终几乎可以忽略不计。也就是说,随着n值变得非常大以后,算法G其实已经很趋近于算法I。于是我们可以得到这样一个结论,判断一个算法的效率时,函数中的常数和其他次要项常常可以忽略,而更应该关注主项(最高阶项)的阶数。
        判断一个算法好不好,我们只通过少量的数据是不能做出准确判断的。根据刚才的几个样例,我们发现,如果我们可以对比这几个算法的关键执行次数函数的渐近增长性,基本就可以分析出,某个算法,随着n的增大,它会越来越优于另一算法,或者越来越差于另一算法。这其实就是事前估算方法的理论依据,通过算法时间复杂度来估算算法时间效率。

出处:http://www.cnblogs.com/cj723/archive/2011/03/05/1964884.html

《大话数据结构》第2章 算法基础 2.8 函数的渐近增长相关推荐

  1. 程序算法艺术与实践:基础知识之函数的渐近的界

    众所周知,算法所需的时间应当是随着其输入规模增长的,而输入规模与特定具体问题有关.对大多数问题来说其最自然的度量就是输入中的元素个数.算法的运行时间是指在特定输入时所执行的基本操作数.我们可以得到关于 ...

  2. 读书笔记-《大话数据结构》第二章算法

    2.3两种算法的比较 #include <iostream> #if 0 //需要运行 100次 int main() {int i,sum=0,n=100;for(i=1;i<=n ...

  3. 大话数据结构 第七章 图(二) 最小生成树、最短路径、拓扑排序、关键路径算法

    大话数据结构 第七章 图(二) 最小生成树.最短路径.拓扑排序.关键路径算法 最小生成树 定义 Prim算法 Kruskal算法 最短路径 Dijkstra算法 Floyd算法 拓扑排序 AOV网 拓 ...

  4. 《大话数据结构》样章试读

    <大话数据结构>样章试读 各位童鞋,<大话数据结构>从写作到出版,虽然经历了一些坎坷,但终于还是在今天正式在一些网店发售了.现在提供两章的完整版试读PDF文件,希望能给您有所 ...

  5. 【算法导论】笔记-第一章 算法基础

    第1章 算法基础 1.1 插入排序 关键词:我们要排序的数. 伪代码:我们使用最清晰,最简洁的表示方法来说明给定的算法. 约定: 缩进表示块结构 while,for与repeat-until等循环结构 ...

  6. 大话数据结构之图-查找算法(C++)

    大话数据结构 Unit7 查找 查找算法举例 代码 #include<iostream> using namespace std;//顺序查找 //a为数组,n为数组长度,key为关键字 ...

  7. 【算法设计与分析】算法的时间复杂度(介绍O渐近上界,Ω渐近下界,θ准确的界)

    什么是时间复杂度? 我们先看看一些函数的渐近表达式: 关于时间复杂度的基本要点: 时间复杂度反映的是随着问题规模的变大,计算所需的时间的增长速度,与系数的多少关系不大 算法的渐近时间复杂度,简称时间复 ...

  8. 《算法导论》算法分析 5种渐近记号 Θ O o Ω ω

    当输入规模足够大,使得运行时间只与增长量级有关时,需要研究算法的渐近效率.也就是,当输入规模无限增加时,在极限中,算法的运行时间如何随着输入规模的变大而增加.本文中所用插图来自<算法导论> ...

  9. 《大话数据结构》第2章 算法基础 2.9 算法的时间复杂度

    2.9 算法的时间复杂度 2.9.1 算法时间复杂度定义 在进行算法分析时,语句总的执行次数T(n)是关于问题规模n的函数,进而分析T(n)随n的变化情况并确定T(n)的数量级.算法的时间复杂度,也就 ...

最新文章

  1. 适合自学python的图书-有哪些适合零编程基础的人学习Python的书?
  2. Java集合:List转数组互转
  3. c++怎么保留小数位数
  4. JavaScript实现euclideanDistance欧氏距离算法(附完整源码)
  5. flink实时同步mysql_基于Canal与Flink实现数据实时增量同步(一)
  6. 0074 几道面试题
  7. 【BZOJ3226】【codevs2297】校门外的区间,线段树
  8. 怎么看待传菜机器人_比拼食材原料、使用机器人传菜,餐饮业如何把握大消费时代的机遇...
  9. linux开机出现repaire filesystem
  10. 游戏热更新:游戏客户端热更新那点事
  11. android 熄屏后仍然可以点击,Android - 在不触发睡眠/锁定屏幕的情况下关闭显示屏 - 使用触摸屏打开...
  12. Android:TextView和EditText
  13. 自然图像抠图/视频抠像技术梳理(image matting, video matting)
  14. 华为荣耀note10计算机在哪找,华为荣耀note10如何使用电脑模式-华为云电脑使用方法介绍 - Iefans...
  15. HIT-CSAPP大作业程序人生
  16. 《Flask Web开发——基于Python的Web应用开发实践》一字一句上机实践(下)
  17. xbox one怎样设置html5,如何安装设置XBOX ONE?XBOX ONE怎么用?
  18. 2021浙江理工大学新生赛被毒打记录
  19. JVM调优系列--Java命令选项(参数)--大全/详解/常用
  20. 二值图像分析:二值图像轮廓提取

热门文章

  1. Redis进阶-Redis键值设计及BigKey问题
  2. HashMap 的设置值,取值,遍历等
  3. 【JavaScript】比较 var 和 let 关键字的作用域
  4. matlab 生成不重复的随机整数 打乱数据排列 生成深度学习数据集
  5. android 地图相册,时光地图相册
  6. python判断点在矩形内_Python测试点是否在矩形中
  7. 本地仓库管理权限问题
  8. 湖南vb程序设计二级计算机考试题库答案,计算机二级VB语言程序设计考试题及答案...
  9. 离散事件模拟-银行管理
  10. 【数学和算法】最小二乘法理论(附c++代码)