时间复杂度
- 度量程序的执行时间的方法:
1). 事后统计:通过使用计算机内部的计时功能。但是该方法有两个明显缺陷:一是程序需要提前运行,二是计算的时间不仅仅依赖于算法本身,还依赖于计算机的硬件,软件等环境。
2). 事前估计:由算法策略,问题规模,程序的语言,编译程序产生的机器码质量,机器执行指令速度决定。
度量算法的时间执行效率不应该与计算机软硬件,程序执行时间相关,而应该仅依赖于问题的规模(通常用n来表示)。
一个算法由控制结构(顺序,分支和循环)和原操作(对数据的操作)构成的,算法时间由二者的综合效果来决定。为了便于比较对同一问题的不同算法,时间度量通常由最深层循环内的原操作的重复执行次数决定。
例子-最深层循环内的原操作:“val+1”。
```java
int n = 100;
int val = 0;
int t = 0;
for(int i=0; i<n; i++){
t++;
for(int j=0; j<=i;j++){
val = val+1;
}
}
```
-
时间复杂度定义: 若算法中的基本操作重复执行的次数为问题规模为n的某个函数f(n), 则算法的时间度量记作:T(n) = O(f(n)), 它表示随问题规模n的增大,算法执行时间的增长率和f(n)的增长率相同。
由于算法的执行时间还随着输入数据的不同而发生变化,所以时间复杂度通常讨论的是最坏情况下的时间复杂度。 -
时间复杂度的值:
O(1), O(logn), O(n), O(nlogn), O( n k n^{k}\, nk), O( k n k^{n}\, kn), O(n!)
通常够忽略常数和只保留方根数最大的项:如果一个算法得基本操作得执行次数为3 n 2 n^{2}\, n2+2n+n, 通常会认为它得时间复杂度为O( n 2 n^{2}\, n2)。二分法的执行时间为log2n, 时间复杂度记为O(logn)。
来源: