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

来源:互联网 发布:软件外包网站 编辑:程序博客网 时间:2024/05/16 15:47

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

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

- 求解步骤

 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))。

0 0
原创粉丝点击