算法,初识时间复杂度

时间复杂度是用来估计算法运行时间的一个式子(单位)

举例:

print('Hello World')        时间复杂度为O(1)

for i in range(n):

    print('Hello World')

时间复杂度为O(n)

for i in range(n):

    for j in range(n):

        print('Hello World') 

时间复杂度为O(n^2)

for i in range(n):

    for j in range(n):

        for k in range(n):

             print('Hello World') 

时间复杂度为O(n^3)

print('Hello World')  

print('Hello Python')  

print('Hello Algorithm') 

时间复杂度为O(3)

for i in range(n):        时间复杂度为O(n)

    print('Hello World')        时间复杂度为O(1)

    for j in range(n):        时间复杂度为O(n)

        print('Hello World')        时间复杂度为O(1)

时间复杂度为O(n^2)

while n > 1:

print(n)

n = n // 2

n = 64 输出:

64,32,16,8,4,2

2^6=64 log2^64=6

时间复杂度为O(log2^n)或O(logn)

当算法过程出现循环折半的时候,复杂度式子中会出现logn

一般来说,时间复杂度高的算法比复杂度低的算法慢

常见的时间复杂度(按效率排序)

O(1) < O(logn) < O(n)< O(nlogn) < O(n^2) < O(n^2logn) < O(n^3)

        1、常数阶O(1)

无论代码执行了多少行,只要是没有循环等复杂结构,那这个代码的时间复杂度就都是O(1),如:

int i = 1;
int j = 2;
++i;
j++;
int m = i + j;

上述代码在执行的时候,它消耗的时候并不随着某个变量的增长而增长,那么无论这类代码有多长,即使有几万几十万行,都可以用O(1)来表示它的时间复杂度。

        2、线性阶O(n)

如:

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

这段代码,for循环里面的代码会执行n遍,因此它消耗的时间是随着n的变化而变化的,因此这类代码都可以用O(n)来表示它的时间复杂度。

        3、对数阶O(logN)

还是先来看代码:

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

从上面代码可以看到,在while循环里面,每次都将 i 乘以 2,乘完之后,i 距离 n 就越来越近了。我们试着求解一下,假设循环x次之后,i 就大于 2 了,此时这个循环就退出了,也就是说 2 的 x 次方等于 n,那么 x = log2^n
也就是说当循环 log2^n 次以后,这个代码就结束了。因此这个代码的时间复杂度为:O(logn)

        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;
    }
}

       5 、平方阶O(n²)

平方阶O(n²) 就更容易理解了,如果把 O(n) 的代码再嵌套循环一遍,它的时间复杂度就是 O(n²) 了。
举例:

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

这段代码其实就是嵌套了2层n循环,它的时间复杂度就是 O(n*n),即 O(n²)
如果将其中一层循环的n改成m,即:

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

那它的时间复杂度就变成了 O(m*n)

复杂问题的时间复杂度

O(n!)、O(2^n)、O(n^n)...


版权声明:本文为a768818702原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。