1.算法的时间复杂度取决于一段程序中基本运算的频度
2.基础规则
1.加法:O(n) = O(max(F(n),G(n))
2.乘法:O(n) = O(F(n)*G(n))
3.取基本运算中n增长最快的项:F(n) = an³+bn²+cn 时间复杂度为O(n³)
3. 例子
接下来举几个例子以及如何去算一段程序的时间复杂度O()。
1.
i = n;
while(i > 0 && A[i] != 10) //A[i]是一个数组
i --;
return i;
a.当A[i]中没有数字10时,i - -共执行了n次,则这段代码的F(n) =n
b.当这段代码A[i] = 10,则程序不会进入循环,i - -执行0次
此程序的最坏时间复杂度是O(n),最好时间复杂度是O(1),平均时间复杂度是O(n/2)也就是O(n)。
2.递归
int test(int n)
{
if(n > 0)return 1;
else return n * test(n - 1);
}
求的是一个简单的递减数列,n*(n-1)(n-2)…*1;当n是10时,test(int 10)一共运行10次。即此算法的时间复杂度是O(n)
3.log₂n
a.
int i = 1;
while(i <= n)
{
i = i * 2;
}
设程序i = i * 2;运行的次数是t,则
其中i = 1,则 t <= log₂n 即最坏运行log₂n次,其时间复杂度为O(log₂n)。
b.折半查找
int low = 0,high = array.length() - 1,mid;
while(low <= high)
{
mid = (low + high) / 2; // 向下取整
if(array[mid] == key)return mid;
else if(array(mid) < key){
low = mid + 1;
}
eles high = mid - 1;
}
return -1; // 查找失败
每次查找不成功,问题的规模就会缩减原来的一半,与上一例同理,所以是最坏的情况的时间复杂度依然是 O(log₂n)。