美文网首页
《数据结构与算法之美》02——复杂度分析

《数据结构与算法之美》02——复杂度分析

作者: 大杂草 | 来源:发表于2020-07-21 17:23 被阅读0次

大O复杂度表示法

大O复杂度表示法,表示代码执行时间随数据规模增长的变化趋势,也叫作渐进时间复杂度,简称时间复杂度。

时间复杂度分析

1.只关注循环执行次数最多的一段代码

T(n)=O(2+n+1)=O(n)

2.加法法则:总复杂度等于量级最大的那段代码的复杂度

如果T1(n)=O(f(n)),T2(n)=O(g(n));那么T(n)=T1(n)+T2(n)=max(O(f(n)), O(g(n)))=O(max(f(n), g(n)))

3.乘法法则:嵌套代码的复杂度等于嵌套内外代码的复杂度的乘积

如果T1(n)=O(f(n)),T2(n)=O(g(n));那么T(n)=T1(n)T2(n)=O(f(n))O(g(n))=O(f(n)*g(n))

常见时间复杂度实例分析

1.O(1)

一般情况下,只要算法中不存在循环语句、递归语句,即使有成千上万行的代码,其时间复杂度也是Ο(1)。

2.O(logn)、O(nlogn)

非常常见的算法时间复杂度,比如归并排序、快速排序的时间复杂度是O(nlogn)

3.O(m+n)、O(m*n)

代码复杂度由两个数据的规模决定。

空间复杂度

全称是渐进空间复杂度,表示算法的存储空间与数据规模之间的增长关系。

常见的空间复杂度有O(1)、O(n)、O(n2)

课后思考

有人说,我们项目之前都会进行性能测试,再做代码的时间复杂度、空间复杂度分析,是不是多此一举呢?而且,每段代码都分析一下时间复杂度、空间复杂度,是不是很浪费时间呢?你怎么看待这个问题呢?

相对于做性能测试,时间复杂度、空间复杂度分析更加便捷、不需要额外的资源。在代码层面就已经做出判断,时间复杂度和空间复杂度不达标,重写代码即可。

而且性能测试是受测试环境影响,配置不一样,得出的结果不一样。

最好、最坏情况时间复杂度

// n表示数组array的长度
int find(int[] array, int n, int x) {
    int i = 0;
    int pos = -1;
    for (; i < n; ++i) {
        if (array[i] == x) pos = i;
    }
    return pos;
}

以上代码是无序数组里查找变量x的位置 ,时间复杂度是O(n)

代码进行优化后:

// n表示数组array的长度
int find(int[] array, int n, int x) {
    int i = 0;
    int pos = -1;
    for (; i < n; ++i) {
        if (array[i] == x) {
            pos = i;
            break;
        }
    }
    return pos;
}

最好情况时间复杂度是第一个元素刚好是要查找的变量x,这时候的时间复杂度是O(1),如果数组里不存在变量x,那么时间复杂度是O(n)。

最好情况时间复杂度

在最理想的情况下,执行这段代码的时间复杂度。

最坏情况时间复杂度

在最糟糕的情况下,执行这段代码的时间复杂度。

平均情况时间复杂度

按上面的例子,把所有情况(有n+1种):在数组的0~n-1位置中和不在数组中,把每种情况查找要遍历的元素个数累加起来,再除以n+1,就是平均遍历的元素个数的平均值:

image

时间复杂度的大O标记法中,可以省略掉系数、低阶、常量,所以,公式简化之后,得到的平均时间复杂度就是O(n)。

实际上还要考虑每种情况的出现的概率,比如每种情况出现的概率都是1/2,那么平均时间复杂度的推导公式:

image

引入概率之后,前面那段代码的加权平均值为(3n+1)/4。用大O表示法来表示,去掉系数和常量,这段代码的加权平均时间复杂度仍然是O(n)。

均摊时间复杂度

// array表示一个长度为n的数组
// 代码中的array.length就等于n
int[] array = new int[n];
int count = 0;
void insert(int val) {
    if (count == array.length) {
        int sum = 0;
        for (int i = 0; i < array.length; ++i) {
            sum = sum + array[i];
        }
        array[0] = sum;
        count = 1;
    }
    array[count] = val;
    ++count;
}

这段代码实现了一个往数组中插入数据的功能。当数组满了,就把数组里的求和,并清空数组,然后将求和放在数组的第一位。

最好情况时间复杂度:O(1)

最坏情况时间复杂度:O(n)

平均情况时间复杂度:O(1)。假设数组元素个数从0~n的概率一样,即1/(n+1),那平均情况时间复杂度公式如下:

image

均摊时间复杂度:

看上面的例子(插入数据),每一次O(n)的插入操作,都会跟着n-1次O(1)的插入操作,把耗时多的那次操作均摊到接下来的n-1次耗时少的操作上,均摊下来的均摊时间复杂度是O(1)。

均摊时间复杂度是一种特殊的平均时间复杂度。

课后思考

我们今天学的几个复杂度分析方法,你都掌握了吗?你可以用今天学习的知识,来分析一下,下面这个add()函数的时间复杂度。

// 全局变量,大小为10的数组array,长度len,下标i。
int array[] = new int[10];
int len = 10;
int i = 0;

// 往数组中添加一个元素
void add(int element) {
    if (i >= len) { // 数组空间不够了
        // 重新申请一个2倍大小的数组空间
        int new_array[] = new int[len*2];
        // 把原来array数组中的数据依次copy到new_array
        for (int j = 0; j < len; ++j) {
            new_array[j] = array[j];
        }
        // new_array复制给array,array现在大小就是2倍len了
        array = new_array;
        len = 2 * len;
    }
    // 将element放到下标为i的位置,下标i加一
    array[i] = element;
    ++i;
}
  • 最好时间复杂度:O(1)。数组空间不满,直接插入。
  • 最坏时间复杂度:O(n)。数组空间满了,复制数组。
  • 平均时间复杂度:O(1)。假设数组元素个数(0~n)的概率相同(1/n+1),那么计算公式为:1/(n+1)+1/(n+1)+.......+n/(n+1)=2n/(n+1)=O(1)
  • 均摊时间复杂度:O(1)。每次的复制数组操作(O(n))都有n次的直接插入的操作(O(1)),均摊后是O(1)。

相关文章

  • 数据结构与算法

    数据结构与算法之美 数据结构与算法之美1--如何学数据结构与算法之美2--复杂度分析(上)数据结构与算法之美3--...

  • 《数据结构与算法之美--复杂度分析》

    《数据结构与算法之美--复杂度分析》 keyword: ​ 概念,大O表示法,常见的时间复杂度,最好、最坏、平...

  • 算法的复杂度分析

    本文是对极客时间《数据结构与算法之美》03-04 节课关于算法复杂度分析的小结。 前面:为什么要学习数据结构与算法...

  • 重温:数据结构与算法 - 02复杂度分析(二)

    数据结构与算法之美-学习大纲 上一节,学习了什么是大O复杂度分析、有哪些复杂度分析技巧、什么是时间复杂度、什么是空...

  • 数据结构与算法之美(一):复杂度分析

    本章内容源于笔者对极客时间《数据结构与算法之美》以下章节的学习笔记: 复杂度分析(上):如何分析、统计算法的执行效...

  • 数据结构与算法-复杂度分析

    时间、空间复杂度:衡量算法执行小路的指标,数据结构与算法离不开时间、空间复杂度分析,复杂度分析是算法的精髓。 为什...

  • 数据结构与算法之时间复杂度分析

    复杂度分析,是所有数据结构与算法的重中之重,复杂度分析是整个算法学习的精髓,只要掌握了它,可以说数据结构和算法的内...

  • 数据结构学习大纲

    第一章 绪论 数据结构基本概念数据结构基本概念算法的基本概念算法的时间复杂度与空间复杂度分析基础时间复杂度分析空间...

  • 复杂度分析(上)

    +文本内容是对王争《数据结构与算法之美》课程的笔记, 如果有任何侵权行为, 请联系博主删除 为什么需要复杂度分析?...

  • 数据结构与算法 - 查找

    数据结构与算法系列文章数据结构与算法 - 时间复杂度数据结构与算法 - 线性表数据结构与算法 - 树形结构数据结构...

网友评论

      本文标题:《数据结构与算法之美》02——复杂度分析

      本文链接:https://www.haomeiwen.com/subject/fihwkktx.html