算法复杂度评价一例

问题
  数据结构课堂上抛出一个问题,下面一段算法,复杂度是_______?

i=1;
while(i<=n)
   i=i*3;

A. O(3n)
B. O(n)
C. O(n3)
D. O(log3n)

意外
  连叫三位同学回答,列一例外选B,让我有些吃惊。看来这是老师的问题,大家的思维没有到位。

分析及解答
  所谓复杂度,是要对关键运算的次数进行计数。关键运算的次数,与问题规模有关。在这里,就是要考察循环了。关键运算是乘法,我们看执行算法中,需要多少次乘法。而问题规模呢?显然,执行多少次循环,与n的初值有关。这里设循环执行的次数为T(n)。
  这里循环次数首先可以确定不是B所指定的线性关系。为直观起见,我们设n足够大,用于控制循环的变量 i 的变化过程是:
  1(初值,由i=1
  3(第1次循环:i=i*3
  9(第2次循环:i=i*3
  27(第3次循环:i=i*3
  81(第4次循环:i=i*3
  273(第5次循环:i=i*3
  819(第6次循环:i=i*3
  2457(第7次循环:i=i*3
  ……
  可以看到 i 的值就这样,按着指数级的速度,向着(i<=n)这个使循环结束的条件奔去。
  我们已经设循环执行的次数为T(n)。可以发现,当3T(n)≤n时,循环继续,循环结束时,恰 3T(n)>n,容易得到 T(n)≈log3(n),论及复杂度,我们常只考察量级,故有T(n)=O(log3n)。

后续的疑问
  课堂中我讲了这个结论得出的过程,大多数同学接受了。个别同学还在继续思考(好习惯,就着热乎劲,有质疑,有思考,学习的优良品质!)。问得最多的问题是:当n=3(或某一个具体的数)时,循环的次数不等于log3n!
  对此,暴露出同学们对复杂度的理解中,还有两点不到位:
  1. 复杂度只作粗略的,在定性(量级)上的考察,而不是定量(精确的计数算式)的计算,多几次少几次,不要细究了。注意说复杂度是O(log3n),而不是log3n。要深刻理解这儿运用的“大O”的目的。
  2. 复杂度只在意定性,而不在定量,为此,在衡定量级时,只保留高阶部分,低阶部分统计统不管,高阶式子的系数统统去掉。例如,关键运算的执行频度计数为10000n3+200n2+1000,在“取量级”的大方针下,也是O(n3)。因为在 n 值取很大的这个前提下,200n2+1000再大,在n3 面前也别抬头;n3前的系数再大,也不是主要因素。这是复杂度分析中,我们在抓主要矛盾。
  3. 学计算机,计数是个很重要很重要的问题,计数的理论,也是深不可测。精确的计数,感兴趣的同学可以关注,但在算法的复杂度分析上,适应“就到量级”的处理,这里也有大学问,这也是实用的处理。

拓展
(1)下面一段算法,复杂度是_______?

i=n;
while(i>1)
   i=i/3;

A. O(3n)
B. O(n)
C. O(n3)
D. O(log3n)
E. O(1)

(2)下面一段算法,复杂度是_______?

i=1;
while(i<=n)
   i=i+3;

A. O(n/3)
B. O(n)
C. O(3n)
D. O(log3n)

(3)下面一段算法,复杂度是_______?

i=1;
while(i<=n)
   n=i*3;

A. O(∝)
B. O(n)
C. O(3n)
D. O(log3n)

解析
  (1)D。和原问题其实一样,照文章中的思路做一遍即可得到答案。若关键运算执行次数与问题规模n无关时,复杂度为E. O(1),显然,这里 i 的初值是 n ,并非无关。
  (2)B。最迷惑人的,是A。循环的次数,循环次数约是 n3,但是,系数13是要去掉的,选B。
  (3)错题!这段代码若执行,是个死循环,终止于内存溢出,或者有些对溢出不处理的语言,就真的一直会不停地执行下去。从算法角度,由于违反了“有穷性”,这也根本称不上是“算法”了。

时间: 2024-09-30 06:08:55

算法复杂度评价一例的相关文章

跪求:算法复杂度最低的算法

问题描述 算法题:两个数组,M和N,分别存了任意个整数,从M中取一个数,从N中取一个数,如果相加等于1000,则计数为1,以此类推,求M和N中和为1000的数的个数.(M×N的复杂度的就算了,大家都知道),求算法复杂度最低的算法 解决方案 解决方案二:我对算法的复杂度不太了解,不知道怎么算的.如果先对某个数组排序,算法复杂度是O(N·logN)的话然后再遍历另一个数组,那复杂度是O(N),再用1000减去遍历出来的那个数得到差,再到排序数组中使用二分法找这个数,复杂度为O(logN)我不知道这样

每个程序员都应该收藏的算法复杂度速查表

算法复杂度这件事 这篇文章覆盖了计算机科学里面常见算法的时间和空间的大 OBig-O 复杂度.我之前在参加面试前,经常需要花费很多时间从互联网上查找各种搜索和排序算法的优劣,以便我在面试时不会被问住.最近这几年,我面试了几家硅谷的初创企业和一些更大一些的公司,如 Yahoo.eBay.LinkedIn 和 Google,每次我都需要准备这个,我就在问自己,"为什么没有人创建一个漂亮的大 O 速查表呢?"所以,为了节省大家的时间,我就创建了这个,希望你喜欢! --- Eric  图例 绝

一个关于算法复杂度的问题

问题描述 一个关于算法复杂度的问题 以下是一个计算a的b次幂的算法: 假定我已有一个质数表,里面包含所有需要用到的质数,并且从小到大排序 定义函数 幂(a,b): 如果 b是0: 返回 1 质数检查范围 = b的平方根向上取整 依次取出质数表中的质数: 如果 质数超出检查范围: 跳出循环 如果 质数整除b: 返回 幂( 幂(a,质数), b/质数 ) 返回 a * 幂( a, b-1 ) 这个算法的复杂度应该怎样衡量? 解决方案 复杂度是logN 解决方案二: 算了一下,logN 解决方案三:

【NIPS2017现场+数据也疯狂】最佳论文大奖公布,算法关注度超越深度学习排第一

本次直播由CMU计算机学院副教授马坚.斯坦福AI博士生.李飞飞教授的学生Jim Fan.杜克大学温伟为大家带来NIPS 2017全程直播.特别感谢Jim 提供照片. 参会人数从100激增到8500,不变的是创造智能的梦 三十一年,一代科学巨匠们的辉煌历史!主席说,他当年在Denver参加第一届NIPS的时候只有一百多人,而今年有超过8500人注册.人数在逐年指数增长,而唯一不变的是那古老的创造智能的梦. 这次大会共有2个并行的track,都分别包括oral和spotlight.新增了艺术创作大赛

算法-九度oj 题目1144:Freckles,不能通过,为什么超时间?

问题描述 九度oj 题目1144:Freckles,不能通过,为什么超时间? #include #include #include using namespace std; const int maxn = 5000; const double INF = 1000000000; bool vis[maxn] = {false}; double x[maxn],y[maxn]; int n ; int father[maxn]; struct Node{ double u,v; double c

圈复杂度评价及工具

转载请注明出处:http://blog.csdn.net/horkychen 圈复杂度用来评价代码复杂度,以函数为单位,数值越大表示代码的逻辑分支越多,理解起来也更复杂.圈复杂度可以成为编码及重构的重要参考指标,以指导撰写可读性高的代码.有关圈复杂度的定义,可以自行搜索.<代码大全>有如下的定义: 计算子程序中决策点数量的技术 (代码大全2,19章P458) 1.由1计数,一直往下通过程序. 2.一旦遇到以下关键字,或者其同类的词,就加1:   if, while, repeat, for,

李彦宏高度评价首位女性高管

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 北京时间2008年3月21日,全球最大的中文搜索引擎百度(NASDAQ:BIDU)宣布任命李昕晢女士为公司新的首席财务官,任期从2008年3月31日起正式生效. 加入百度之前,李昕晢在全球最大的汽车信贷机构通用汽车金融服务公司北美区担任总会计师,为将通用汽车金融服务公司打造成集团内部最具盈利能力的实体做出重要贡献.更早前,李昕晢女士也曾担任中

什么是算法的复杂度?

算法复杂度分为时间复杂度和空间复杂度.下面摘录其含义: 时间复杂度: 时间复杂度是指执行算法所需要的计算工作量. 重点在其计算方法: 一个算法中的语句执行次数称为语句频度或时间频度.记为T(n). 一般情况下,算法的基本操作重复执行的次数是模块n的某一个函数f(n),因此,算法的时间复杂度记做:T(n)=O(f(n)). 在计算时间复杂度的时候,先找出算法的基本操作,然后根据相应的各语句确定它的执行次数,再找出T(n)的同数量级(它的同数量级有以下:1,Log2n ,n ,nLog2n ,n的平

深入排序算法的多语言实现

 1 排序的基本概念 排序: 所谓排序,就是要整理文件中的记录,使之按关键字递增(或递减)次序排列起来.其确切定义如下: 输入:n个记录R1,R2,-,Rn,其相应的关键字分别为K1,K2,-,Kn. 输出:Ril,Ri2,-,Rin,使得Ki1≤Ki2≤-≤Kin.(或Ki1≥Ki2≥-≥Kin). 排序的稳定性:当待排序记录的关键字均不相同时,排序结果是惟一的,否则排序结果不唯一.在待排序的文件中,若存在多个关键字相同的记录,经过排序后这些具有相同关键字的记录之间的相对次序保持不变,该排序方