一、什么是时间复杂度


计算机科学中,时间复杂性,又称时间复杂度,算法的时间复杂度是一个函数,它定性描述该算法的运行时间。这是一个代表算法输入值的字符串的长度的函数。时间复杂度常用大O表述,不包括这个函数的低阶项和首项系数。使用这种方式时,时间复杂度可被称为是渐近的,亦即考察输入值大小趋近无穷时的情况。

二、常见的时间复杂度

1.O(1) 常数阶

没有循环这些复杂结构

int i;
i=5;
a=i;
i++;
++a;
int b=a*i;

2.O(n)线性阶

代码随着变量增长而增长

for(i=1; i<=n; i=i+2)
{
   j=i;
}

此时在for循环中,每次i+2,i在累加靠近n的值,当循环x次,i>n时,循环结束,此时x=n/2,我们也称,当循环n/2次,代码结束,因此这个代码的时间复杂度为:O(n)。

遍历算法是O(n)的时间复杂度。

3.O(logn)对数阶

int i = 1;
while(i<n)
{
    i = i * 2;
}

在while循环里面,每次都将 i*2,i在累加靠近n的值,当循环x次,i>n时,循环结束,也就是说 2 的 x 次方等于 n,那么 x = log2n,也就是说当循环 log2n 次以后,这个代码就结束了。因此这个代码的时间复杂度为:O(logn)。

二分查找就是O(logn)的算法,每找一次排除一半的可能,256个数据中查找只要找8次就可以找到目标。

4.O(nlogN)线性对数阶

  线性对数阶O(nlogN) 其实非常容易理解,将时间复杂度为O(logn)的代码循环N遍的话,那么它的时间复杂度就是 n * O(logN),也就是O(nlogN)。如:

for(m=1; m<n; m++)
{
    i = 1;
    while(i<n)
    {
        i = i * 2;
    }
}

归并排序就是O(nlogn)的时间复杂度。

5、平方阶O(n²)

  平方阶O(n2)也好理解,把 O(n) 的代码再嵌套循环一遍,它的时间复杂度就是 O(n²) 了。

for(x=1; i<=n; x++)
{
   for(i=1; i<=n; i=i+2)
    {
       j = i;
    }
}

冒泡排序,就是典型的O(

MySQL中时间复杂度和空间复杂度 时间复杂度数据结构_数据结构

)的算法,对n个数排序,需要扫描

MySQL中时间复杂度和空间复杂度 时间复杂度数据结构_数据结构

次。

三、时间复杂度的优劣对比

常见的数量级大小:越小表示算法的执行时间频度越短,则越优;

O(1)<O(logn)<O(n)<O(nlogn)<O(

MySQL中时间复杂度和空间复杂度 时间复杂度数据结构_数据结构

)<O(

MySQL中时间复杂度和空间复杂度 时间复杂度数据结构_数据结构_04

)<O(

MySQL中时间复杂度和空间复杂度 时间复杂度数据结构_时间复杂度_05

)<O(n!)<O(

MySQL中时间复杂度和空间复杂度 时间复杂度数据结构_时间复杂度_06

)

MySQL中时间复杂度和空间复杂度 时间复杂度数据结构_算法_07

 

 四、如何计算时间复杂度

⑴ 找出算法中的基本语句;

算法中执行次数最多的那条语句就是基本语句,通常是最内层循环的循环体。

⑵ 计算基本语句的执行次数的数量级;

只需计算基本语句执行次数的数量级,这就意味着只要保证基本语句执行次数的函数中的最高次幂正确即可,可以忽略所有低次幂和最高次幂的系数。这样能够简化算法分析,并且使注意力集中在最重要的一点上:增长率。

⑶ 用大Ο记号表示算法的时间性能。

将基本语句执行次数的数量级放入大Ο记号中。

加法规则:T(n)=T1(n)+T2(n)+T...(n)=O(f(n))+Og((n))+O(...(n))=O(max(f(n),g(n),...(n)))

乘法规则:T(n)=T1(n)*T2(n)*T...(n)=O(f(n))*Og((n))*O(...(n))=O(f(n)*g(n)*...(n))