1 时间复杂度概述
- 当一个程序产生的时候,就自然而然产生了执行时间,我们不可能每次都去一个一个运行进行比较。于是一种省时省力的方法产生了,这就是时间复杂度的来源。总的来说:
时间复杂度简化了我们的比较方法。
2 时间复杂度计算
- 时间复杂度与执行次数有关。于是流程为:
1.找出所有语句的频度并组成执行次数T(n)
2.T(n)的数量级,忽略常量、低次幂和最高次幂的系数,f(n)=T(n)的数量级
3.T(n)=O(f(n))
举例:
int num1, num2;
for(int i=0; i<n; i++){
num1 += 1;
for(int j=1; j<=n; j*=2){
num2 += num1;
}
}
1.语句int num1, num2;的频度为1;
语句i=0;的频度为1;
语句i<n; i++; num1+=1; j=1; 的频度为n;
语句j<=n; j=2; num2+=num1;的频度为n*log2(n)*;
(为什么会出现log2(n)呢?是因为循环x次,j=2^x ,当j=n时停止循环,就是2^x=n则有log2(n)=x时停止 ,即循环次数为log2(n)。)
**T(n) = 2 + 4n + 3n*log2n
2.忽略掉T(n)中的常量、低次幂和最高次幂的系数。
f(n) = n*logn
3.代入公式
T(n) =O(f(n))= O(n*logn)
3.时间复杂度比较
- 常数阶O(1), 对数阶O(logn), 线性阶O(n), 线性对数阶O(nlogn), 平方阶O(n^2), 立方阶O(n^3),..., k次方阶O(n^k), 指数阶O(2^n) 。
Ο(1)<Ο(logn)<Ο(n)<Ο(nlogn)<Ο(n2)<Ο(n3)<…<Ο(2^n)和Ο(n!)
一些大小需要根据问题的规模n来进行判断。
- Ο(1)表示基本语句的执行次数是一个常数。
- O(logn)、Ο(n)、Ο(nlog2n)、Ο(n2)和Ο(n3)称为多项式时间。
- Ο(2n)和Ο(n!)称为指数时间。(它们的大小和n有关。)