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)
注意:
还有一些其他的时间复杂度,这里就不赘述了;
关于时间复杂度的计算,我认为主要是看程序执行的次数,然后在转换成为时间复杂度。当然,真正的程序比上述要复杂很多,这里只是一个自我学习总结和概述。
参考书目:
大话数据结构 陈杰著
浙公网安备 33010602011771号