习题
1.求整数n阶乘
int fact(int n)
{
if(n<=1) return 1;
else return n*fact(n-1);
}
时间复杂度?O(n)
求阶乘的时候n次递归调用fact(n)
对比:斐波那契数列 随着输入数据的每次增加而增大两倍
2.计算
T(n)=1,n=1;2T(n/2)+n,n>1
n为问题的规模
提示:设n=2^k,代入,得到递推式
一般法则
1.for循环 :至多是该for循环内语句的运行时间×迭代次数
嵌套for同理~
2.顺序语句
将各个语句运行时间求和
T1(N)+T2(N)=max(O(f(N),O(g(N)))
(选其中的最大值)
3.if/else
运行时间小于判断和条件语句中较长者
对数情况
如果一个算法用常数时间O1 将问题的大小削减为其一部分(通常为1/2),那么该算法就是O(log N)的—eg. 分治算法,对分查找,欧几里得算法
如果一个算法用常数时间O1 将问题的大小减少一个常数,那么O(N)
总结
O(1)
O(1)表示该算法的执行时间(或执行时占用空间)总是为一个常量,不论输入的数据集是大是小。
O(N)
O(N)表示一个算法的性能会随着输入数据的大小变化而线性变化。
O(N^2)
O(N^2)表示一个算法的性能将会随着输入数据的增长而呈现出二次增长。最常见的算法就是对输入数据进行嵌套循环
O(2^N)
O(2^N)表示一个算法的性能将会随着输入数据的每次增加而增大两倍。 O(2^N)
的增长曲线是一条爆炸式增长曲线——开始时较为平滑,但数据增长后曲线增长非常陡峭。一个典型的O(2^N)方法就是裴波那契数列的递归计算实现。
O(nlog2n)
线性对数级:快速排序
O(nlog2n)表示一个算法的性能会随着输入数据的大小变化而线性对数级变化。
O(log N)
分治算法,对分查找,欧几里得算法
(flag:晚上补充)
- 最大子序列和问题
- 二分查找