大O表示法

习题

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=12T(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:晚上补充)

  • 最大子序列和问题
  • 二分查找

你可能感兴趣的:(数据结构)