分析时间复杂度

版权声明:私藏源代码是违反人性的罪恶行为!博客转载无需告知,学无止境。 https://blog.csdn.net/qq_41822235/article/details/85320679

目录

一、度量

1.1 定义

1.2 思路

二、实战

2.1 例一

2.2 例二求n!的递归函数的时间复杂度

2.3 例三 


一、度量

1.1 定义

将算法中基本操作执行次数作为算法时间复杂度的度量。这里所讨论的时间复杂度不是执行完一段程序的总时间,而是其中基本操作的总次数。这很好理解:程序运行环境不同,运行的总时间是不同的,正如在银河系列巨型计算机和普通的个人用计算机运行同样的程序,总时间肯定不同。所以时间复杂度是一个抽象的概念,不指时间而是次数

1.2 思路

分两步:1)找出基本操作,确定问题规模n。基本操作就是其重复执行次数和算法的执行时间成正比的操作。问题规模n唯一决定了基本操作的执行次数。2)计算出n的函数f(n)。有时候可以很清楚地将表达式给出,有时候只能以隐函数的形式给出(俗称待定系数法),往往后者是更常见的。

二、实战

2.1 例一

void fun(int n)
{
    int i = 0, s = 0;
    while(i < n)
    {
        ++i;    ------(1)
        s = s + i; ------(2)
    }
}

对于例1 而言,我们可以很明确知道f(n)的表达式,故而时间复杂度是O(√n) 。

2.2 例二求n!的递归函数的时间复杂度

int factorial(int n)
{
    if(n <= 1)
        return 1; ------(1)
    else 
        return n * f(n-1); ------(2)
}

 涉及到递归函数,就没有明确的基本操作了:需要转换思路。设T(n)为factorial(n)的时间开销函数。T(1)=O(1)。(1)的开销为O(1),递归调用factorial(n-1)的时间开销为T(n-1);故而有关系式T(n) = O(1) + T(n-1) (n > 1)成立。

下面进行数学演算:

从例2我们可以看到:这一次我们并没有求出确切的表达式,只是给出了数量级而已。

2.3 例三 

切记形而上学

void fun()
{
    int i = 1, k = 0, n = 10;
    while(i <= n-1)
    {
        k += 10 * i;
        ++i;
    }
}

n指的是问题规模而不是程序中出现的n,要明确其深刻含义。 

猜你喜欢

转载自blog.csdn.net/qq_41822235/article/details/85320679