- 基本概念
-
一个程序或算法的时间效率,“时间复杂度”,“复杂度”
-
大写字母O和小写字母n表示,例O(n),O(n²)。n:问题的规模
-
问题的复杂度==解决该问题的最好算法的复杂度
2.计算
-
度量:算法运行过程中,某种时间的固定操作需要被执行的次数和n的关系。例如:在无序数列中查找某个数,复杂度是O(n)。//与n成正比
-
计算:只统计执行次数最多的固定操作的次数(n足够大时)
“固定操作”——广义理解
例:插入排序
void InsertionSort(int a[],int size)
{
for(int i = 1; i < size; ++i){
//a[i]是最左的无序元素,每次循环将a[i]放到合适位置
for(int j = 0; j < i; ++j)
if(a[j] > a[i]){ //操作1
//要把a[i]放到位置j,原下标j到i-1的元素都往后移一个位子
int temp = a[i];
for(int k = i; k > j; --k)
a[k] = a[k-1]; //操作2
a[j] = temp;
break;
}
}
} //复杂度O(n2) ,操作1+2
- 如果复杂度是多个n的函数之和,则只关心随n的增长增长得最快的那个函数
O(n³+n²) => O(n³)
O(2^n +n³) => O(2^n)
O(n!+3^n) => O(n!) - 复杂度有“平均复杂度”和“最坏复杂度”两种。可能一致,也可能不一致
3.几种算法的时间复杂度
- 在无序数列中查找某个数(顺序查找) O(n)
- 平面上有n个点,要求出任意两点的距离 O(n²)
- 插入排序、选择排序、冒泡排序 O(n²)
- 快速排序、归并排序 O( n*log(n) )
- 二分查找 O(log(n))