您当前的位置:首页 > 计算机 > 编程开发 > C语言

数据结构基础知识总结,时间复杂度是重点

时间:02-21来源:作者:点击数:

本章的重点是分析程序的时间复杂度。一定要掌握分析时间复杂度的方法和步骤,很多同学在做题时一眼就能看出程序的时间复杂度,但就是无法将其推导过程规范地表述出来。为此,编者查阅众多资料,总结出此类题型的两种形式,供大家参考:

一是循环主体中的变量参与循环条件的判断。

此类题应该找出主体语句中与T(n)成正比的循环变量,将之带入条件中进行计算。例如:

// 程序①
int i=1;
while (i<=n) 
i=i*2;   
// 程序②
int y=5;
while((y+1)*(y+1)<n)
y=y+1;

程序①中,i乘以2的次数正是主体语句的执行次数T(n),因此有2T(n)<=n,取对数后,即得 T(n)<=log2n。

程序②中,y加1的次数恰好与T(n)成正比,则令T(n)=y-5,即y=T(n)+5,(T(n)+5+1) *(T(n)+ 5+1)<n,得出,即

二是循环主体中的变量与循环条件无关。

此类题可采用数学归纳法,或直接累计循环次数;多层循环时从内到外分析,忽略单步语句、条件判断语句,只关注主体语句的执行次数。此类问题又可分为递归程序和非递归程序。

递归程序一般使用公式进行递推。例如习题5的时间复杂度分析如下:
         T(n)=1+T(n-1)=1+1+T(n- 2)=...=n-1+T(1)
         即
         T(n)=O(n)。

非递归程序比较简单,可以直接累计次数。例如习题7、8等。

思维拓展

求解斐波那契数列有两种常用的算法:递归算法和非递归算法。试分别分析两种算法的时间复杂度。

(提示:请结合归纳总结中的两种方法进行解答。)

方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门