您的位置:首页 > 理论基础 > 数据结构算法

考研中的算法时间复杂度求解

2016-04-13 17:29 405 查看

考研中的算法时间复杂度求解

今天刚刚开始复习了考研的数据结构,结果在第一篇绪论就遇到问题了,哈哈哈,就是求解算法的时间复杂度问题,刚一开始有点蒙,不知道怎么做,相信很多考研的小伙伴一开始都会遇到这个问题吧,这里总结了一点个人心得,分享给要考研的小伙伴。

对于一些基本概念这里主要介绍一些最重要的,不关紧要的就不说啦~

- 求解步骤

1、找到基本语句:
就是程序中出现次数最多的那句代码啦,比如一层for循环就是循环中那句代码,多层循环就是**最内层循环的那句代码**

2、计算基本语句的执行次数的数量级:
其实在做题的时候基本就等同于求出基本语句执行次数,至于数量级是什么意思呢,就比如我现在求出来一个基本语句的执行次数是(n+3*n^2),那么这个基本语句的实行次数数量级就是n^2,即我们只需要关心**幂次最高的那一项**,并且这一项前面的系数也可忽略。

3、用大Ο记号表示算法的时间性能:
就是把我们在第2步求出的基本语句执行次数的数量级放在O()的括号中。


常见算法时间复杂度及其大小比较

- 来看看例题吧

1.

void fun(int n){
int i=1;
while(i<=n)
i=i*2;
}


我们先来看一下这道题,我们按照上面讲的步骤,首先找到基本语句,就是循环最内层的语句,即i=i*2;  接下来我们来计算这个语句的执行次数,其实我们可以看出这个语句就是很多个2 相乘,但是很多是多少呢,千万不要误以为是n,我第一次做的时候就以为是n,然后就做错了,既然不知道我们就假设是t个2相乘,即i=i*2执行了t次,也就是最后的结果为i=2^t=n;可以得出t=log2 (n);   第三步就是把log2 (n)用O()括起来就行了。


2.

x=2;
while(x<n/2)
x=x*2;


这个题和上面做法一样,设2^t=n\2;得t=log2(n)-1;得到最后时间复杂度为O(log2(n))。

3.

cnt=0;
for(k=1;k<=n;k*=2)
for(j=1;j<=n;j++)
cnt++;


刚才上面的两道题都是一层循环,现在我们来看看多层循环的题目。对于这道题,我们呀偏向计算基本语句cnt++;的执行次数只需计算外层循环和内层循环的乘积即可。对于外层循环的循环次数有上面两个题的方法可求出为log2(n) ,内层循环的次数为n,所以该算法的时间复杂度为O(nlog2(n))。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  数据结构 考研 算法