复杂度分析(二)

126 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第8天,点击查看活动详情

前言

从上一篇文章中,我们了解了为什么要引入时间复杂度的原因,那我们今天就来继续了解时间复杂度的概念。以及它的推导过程。

时间复杂度的简要推导

首先我们来看一段非常简单的代码。一个从1累加到n的求和函数。我们根据代码的层次来估计这段代码的执行时间。

1 int sum(int n) {
2    int sum = 0;
3    int i = 1;
4    for (; i <= n; i++) {
5        sum += i;
6    }   
7    return sum;
8}

在上一篇文章中我们有提到的,代码在不同配置下的物理设备运行,其运行的结果会有较大的差异。所以我们忽略在分析求和函数的时候。忽略一切的物理层面的影响,执行一段代码把它归结为消耗了一个单位的时间,使用符号UnitTime来表示。现在我们来分析求和函数:

第2行,第3行代码执行各需要1个UnitTime时间,第4行和第5行运行则会根据我们传入的参数决定的,假如传入的是100,就是100次。假如传入的是10000,就是执行10000次。所以需要2n*UnitTime的执行时间。我们可以得到总的执行时间为 T(n) = (2n+2) * UnitTime。由这个公式得知,代码的执行时间和代码的执行次数是成正比的。

根据这个分析思路我们继续来分析一段新的代码,计算乘积。

1 int product(int n) {
2    int sum = 0;
3    int x = 1;
4    int y = 1;
5    for (; x <= n; x++) {
6        y = 1;
7        for (; y <= n; y++) {
8            sum = sum + x * y;
9        }
10    }
11 }

首先第2,3,4行的代码的执行时间分别是1个UnitTime。第5,6行的代码分别执行n个UnitTime,我们关注的重点来了。第7,8行的代码,抛去上下文,单单只看这两行的话肯定也是n个UnitTime,但是它是嵌套在上一个for循环中,所以可以得知执行时间为n的平方。从这次的分析还是可以得知代码的执行时间和代码的执行次数是成正比的。

由此我们可以得知公式T(n) = O(f(n))。O代表的含义是代码执行时间T(n)与f(n)表达式是成正比的。这就是我们的大O时间复杂度表示法。

总结

今天我们了解了时间复杂度的一个简要的推导过程。