时间复杂度是用肉眼就能看出一段代码的执行效率。从效率高到效率低的几种常见表示法:
O(1)、O(logn)、O(n)、O(nlogn)、O(n^2 )
通常我们时间复杂度用大写的O表示,省略掉系数、低阶、常量。在衡量计算机算法复杂度时,科学家们不关心几倍的差别,因此,在用数学公式表达复杂度的时候,计算机科学家(高德纳)干脆删除了前面的常数因子,只保留后面的变量,他用了微积分中的一个概念大写的O的概念,所有同等复杂度的算法,都被认为它们在"大O的概念"下是相等的。
1.O(1)
void test1()
{
int n = 1000;
int sum =0;
for(int i = 0; i < n; i++)
{
sum+=i;
}
}
n是一个常量,是时间复杂度可以记为O(1),n如果是一个常量不管是1W、100W、1000W都可以记为O(1)。
2.O(logn)
void test2(int n)
{
int i=1;
while (i <= n)
{
i = i*2;
}
}
这里由i来决定循环次数的运行过程是2^1 2^2 2^3…2^x=n = 2^x 。
2^x=n对数相应公式转换等于 x=log2^n 时间复杂度记为O(log2^n)。
在时间复杂度中底数可以去掉,不管底数log3^n 还是log10^n 都记为logn 所以简化为O(logn)。
3.O(n)
void test3(int n)
{
int sum =0;
for(int i = 0; i < 1000; i++)
{
sum+=i;
}
for(int k = 0; k < n; k++)
{
sum+=k;
}
}
时间复杂度为O(n), 前面第一个循环可以忽略掉,取函数中,会随着变量增大的循环体来计算时间复杂度,所以是O(n)。
4.O(nlogn)
在logn 例子2中在外层再加个n的for循环,时间复杂度记为O(n logn)。
5.O(n^2 ) 嵌套循环
void test5(int n)
{
int sum =0;
for(int i = 0; i < n; i++)
{
for(int k = 0; k < n; k++)
{
sum+=i*k;
}
}
}
这里i循环n 次为 O(n) ,k循环n次为O(n*n), 结果为O(n)*O(n^2)=O(n+n^2) 取最大量级所以时间复杂度为O(n^2)。
以上就是一些常见的时间复杂度计算。