在了解时间复杂度之前,先了解一下原操作和时间频度
一.原操作
原操作是指固有的数据类型的操作,可以理解为基本运算,下面的代码块中 3,6,7,9 都是原操作
例1
1. void foo (int a[],int n)
2. {
3. int i;
4. for(i = 0;i < n;i++)
5. {
6. a[i] = i + 1;
7. printf("%d",a[i]);
8. }
9. printf("\n");
10.}
二.时间频度 T(n)
时间频度是该算法所有原操作的执行次数,它是问题规模n的函数,用T(n)表示.下面采用简化方法去分析,即只考虑算法内最深层循环内的原操作
例2
void foo (int n)
{
int i,j;
for(i = 0;i < n;i++) //循环n次
{
for(j = 0;j < n+10;i++) //循环n+10次
{
printf("%d",i+j); //即深层原操作次数为n^2+10n
}
}
}
即 T(n) = n^2+10n
三.时间复杂度 O(n)
时间复杂度是用时间频度的最大数量级表示: O(n) = ( T(n)的数量级 )
例2中,T(n) = n^2+10n,其最大数量级为 n^2 (即忽略其常数和低级次幂)
最后 O(n) = n^2
四.时间复杂度对照表
O(1) < O(log2 N) < O(n) < O(nlog2 N) < O(n^2) < O(n^3) < O(2^n) < O(n!)