数据结构考研时间复杂度分析学习
2016-08-25 20:37
281 查看
几种排序算法的思想很容易掌握,就是对应的时间复杂度,究其原因就是对时间复杂度是什么,如何定义计算还不知道,那么时间复杂度是如何计算的呢?请看下文。
在说时间复杂度之前要说一下算法,算法是为解决某问题而采取的具体的,有限的操作步骤,既然算法是操作步骤,那么步骤占用计算机资源的多少就决定了算法的效率。而计算机资源中有时间资源(处理器)和空间资源(存储器),因此时间复杂度是描述算法效率的标准中的一种。
设f(n)为描述一个算法重复执行次数的函数,这个算法的时间复杂度即为O(f(n))。这里只需求的函数(f(n))的增长率。
例题1:
f(n)=n^3+3n O(f(n))=n^3
f(n)=2 O(f(n))=1
f(n)=logn+n O(f(n))=logn
如下:
例题2.1:
[csharp] view
plain copy
print?
<span style="font-size:18px">for(i=1;i<=n;++i){
for(j=1;j<=n;++j){
++x;
s+=x;
}
} </span>
分析: 1)第一个for循环重复的次数为n
2)第二个for重复的次数也为n
3)两个for是嵌套的,程序总的重复次数为n^2
4)时间复杂度即为n^2
例题2.2:
[csharp] view
plain copy
print?
<span style="font-size:18px">i=1;
while(i<=n){
i=i*2;
}</span>
分析:1)设重复的次数为m
2)i=1 循环一次i的值都乘以2, m次循环后i的值就不满足小于等于n了,得函数i*(2^m)>n (i=1)
3)求得重复次数m=log2(n/i),即得时间复杂度
说明:上题中i如果不为1时,时间复杂度还是log2(n/i),原因是求的是函数的增长率。
好了,现在我们知道了如何去求时间复杂度的函数及时间复杂度,单个的函数能求出来,那么多个函数在一块呢?就好比我们会算加法、减法和乘法,那么混合运算怎么算呢? 复合的程序中就能写出多个时间复杂度的函数,整个函数的时间复杂度如何计算就好比混合运算的优先级,是有规则的,请继续看:
O(f(n1))+O(f(n2))=O( max(f(n1),f(n2)) )
O(f(n1))*O(f(n2))=O( f(n1)*f(n2) )
特例:若其中有一个为常数c
f(n1)=c O(f(n1))*O(f(n2))=O( c*f(n2) ) = O( f(n2) )
例3:
[csharp] view
plain copy
print?
<span style="font-size:18px">{
for ( int i = 0; i < m; i++ ) {
sum[i] = 0;
for ( int j = 0; j < n; j++ ) {
sum[i] += x[i][j];
}
}
for ( i = 0; i < m; i++ ) {
System.out.println(i);
}
}</span>
分析: 1)嵌套的两个for循环,用乘法法则得:O(m*n)
2)第三个for循环,时间复杂度为O(m)
3)利用加法法则得:时间复杂度为O( max(O(m*n),O(m)) )
在说时间复杂度之前要说一下算法,算法是为解决某问题而采取的具体的,有限的操作步骤,既然算法是操作步骤,那么步骤占用计算机资源的多少就决定了算法的效率。而计算机资源中有时间资源(处理器)和空间资源(存储器),因此时间复杂度是描述算法效率的标准中的一种。
什么是时间复杂度
算法中,操作重复执行的次数为算法的时间度量。设f(n)为描述一个算法重复执行次数的函数,这个算法的时间复杂度即为O(f(n))。这里只需求的函数(f(n))的增长率。
例题1:
f(n)=n^3+3n O(f(n))=n^3
f(n)=2 O(f(n))=1
f(n)=logn+n O(f(n))=logn
如何求解
现在如果给定我们一个算法的函数,我们肯定可以特别轻松的写出时间复杂度,但是,函数往往不直接给我们,给我们的是一段代码,我们是否很容易的求出时间复杂度呢?如下:
例题2.1:
[csharp] view
plain copy
print?
<span style="font-size:18px">for(i=1;i<=n;++i){
for(j=1;j<=n;++j){
++x;
s+=x;
}
} </span>
分析: 1)第一个for循环重复的次数为n
2)第二个for重复的次数也为n
3)两个for是嵌套的,程序总的重复次数为n^2
4)时间复杂度即为n^2
例题2.2:
[csharp] view
plain copy
print?
<span style="font-size:18px">i=1;
while(i<=n){
i=i*2;
}</span>
分析:1)设重复的次数为m
2)i=1 循环一次i的值都乘以2, m次循环后i的值就不满足小于等于n了,得函数i*(2^m)>n (i=1)
3)求得重复次数m=log2(n/i),即得时间复杂度
说明:上题中i如果不为1时,时间复杂度还是log2(n/i),原因是求的是函数的增长率。
好了,现在我们知道了如何去求时间复杂度的函数及时间复杂度,单个的函数能求出来,那么多个函数在一块呢?就好比我们会算加法、减法和乘法,那么混合运算怎么算呢? 复合的程序中就能写出多个时间复杂度的函数,整个函数的时间复杂度如何计算就好比混合运算的优先级,是有规则的,请继续看:
时间复杂度的表示法则
加法法则:
针对并列程序O(f(n1))+O(f(n2))=O( max(f(n1),f(n2)) )
乘法法则:
针对嵌套程序O(f(n1))*O(f(n2))=O( f(n1)*f(n2) )
特例:若其中有一个为常数c
f(n1)=c O(f(n1))*O(f(n2))=O( c*f(n2) ) = O( f(n2) )
例3:
[csharp] view
plain copy
print?
<span style="font-size:18px">{
for ( int i = 0; i < m; i++ ) {
sum[i] = 0;
for ( int j = 0; j < n; j++ ) {
sum[i] += x[i][j];
}
}
for ( i = 0; i < m; i++ ) {
System.out.println(i);
}
}</span>
分析: 1)嵌套的两个for循环,用乘法法则得:O(m*n)
2)第三个for循环,时间复杂度为O(m)
3)利用加法法则得:时间复杂度为O( max(O(m*n),O(m)) )
相关文章推荐
- MySQL 索引背后的数据结构及算法原理
- SDUTACM 数据结构实验之串一:KMP简单应用
- 【STL】集合set
- 单链表的就地逆转 -- 浙大《数据结构》第二版 例2.4
- SDUTACM 双向队列
- day02运算及运算符,简单if swith for while dowhile语句数据结构
- 数据结构栈之javascript实现
- 分布式缓存技术redis学习系列(二)——详细讲解redis数据结构(内存模型)以及常用命令
- 算法 与 数据结构 学习笔记
- 数据结构实验之排序六:希尔排序
- [转]数据结构--树形结构(1)--作者:深挖三尺--抓狂
- 鞍点的求解以及对称矩阵的存储和数据的获取
- 数据结构实验之栈二:一般算术表达式转换成后缀式
- 数据结构实验之排序七:选课名单
- 队列、栈的区别
- 3340数据结构实验之二叉树一:树的同构
- poj3468 A Simple Problem with Integers(zkw区间修改模板)
- SPFA算法
- 数据结构之链表:链表指定值清除
- 数据结构之线性结构--数组