考研中的算法时间复杂度求解
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))。
相关文章推荐
- 书评:《算法之美( Algorithms to Live By )》
- 动易2006序列号破解算法公布
- C#数据结构之顺序表(SeqList)实例详解
- Ruby实现的矩阵连乘算法
- C#插入法排序算法实例分析
- Lua教程(七):数据结构详解
- 解析从源码分析常见的基于Array的数据结构动态扩容机制的详解
- 超大数据量存储常用数据库分表分库算法总结
- C#数据结构与算法揭秘二
- C#冒泡法排序算法实例分析
- C#数据结构之队列(Quene)实例详解
- C#数据结构揭秘一
- C#数据结构之单链表(LinkList)实例详解
- 算法练习之从String.indexOf的模拟实现开始
- C#算法之关于大牛生小牛的问题
- C#实现的算24点游戏算法实例分析
- c语言实现的带通配符匹配算法
- 数据结构之Treap详解
- 浅析STL中的常用算法
- 算法之排列算法与组合算法详解