1.定义

T(n)=O(f(n))

T(n)表示随着问题规模n的增大,算法执行时间的增长率和f(n)的增长率相同,称为算法的渐进时间复杂度。其中f(n)是问题规模n的某个函数。

 

2.时间复杂度计算方法(推导大O阶方法)

步骤:

(1)用常数1取代运行时间中的所有加法常数

(2)在修改后的运行次数函数中,只保留最高阶项

(3)如果最高阶项存在且不是1,则去除与这个项相乘的常数

 

3.常见时间复杂度

(1)常数阶O(1)

eg:

int sum = 0, n = 100;      /*执行一次*/

sum = (1+n)*n/2;          /*执行一次*/

printf("%d",sum);          /*执行一次*/

计算:

算法运行次数f(n)=3。根据大O阶方法(见点2),时间复杂度是O(1)。

 

(2)线性阶O(n)

eg:

int i;

for(i = 0; i < n; i++)       /*执行n次*/

{

   i++;                           /*执行一次*/

}

计算:

算法运行次数f(n)=n。根据大O阶方法(见点2),时间复杂度是O(n)。

 

(3)对数阶O(logn)

eg:

int count = 1;

while (count < n)

{

  count = count * 2;

}

计算:

运行次数假设为x,则运行次数建立的函数关系是2x=n,x=log2n(即是f(n)=log2n);根据大O阶方法(见点2),时间复杂度是O(log2n)。

 

(4)平方阶O(n2)

eg:

int count = 0;

int i, j;

for(i = 0; i < n; i++)              /*执行n个n次,所以总共是n2次*/

{

  for (j = 0; j < n; j++)      /*执行n次*/

  {

    count++;

  }

}

计算:

运行次数为n2次;根据大O阶方法(见点2),时间复杂度是O(n2)。

 

(5)其他

常用的时间复杂度所耗费时间从小到大排序:

O(1) < O(logn) < O(n) < O(nlogn) < O(n2) < O(n3) < O(2n) < O(n!) < O(nn)

 

注意:

还有一些其他的时间复杂度,这里就不赘述了;

关于时间复杂度的计算,我认为主要是看程序执行的次数,然后在转换成为时间复杂度。当然,真正的程序比上述要复杂很多,这里只是一个自我学习总结和概述。

 


参考书目:

大话数据结构  陈杰著

 

posted on 2013-06-18 19:36  野田妹  阅读(141)  评论(0)    收藏  举报