为什么需要复杂度分析?

  1. 测试结果非常依赖测试环境
    2测试结果受数据规模的影响很大

    大 O 复杂度表示法

    所有代码的执行时间 T(n) 与每行代码的执行次数成正比。
    表示代码执行时间随数据规模增长的变化趋势,所以,也叫作渐进时间复杂度(asymptotic time complexity),简称时间复杂度。
    O.png

    时间复杂度分析

  2. 只关注循环执行次数最多的一段代码
    在分析一个算法、一段代码的时间复杂度的时候,也只关注循环执行次数最多的那一段代码就可以了。这段核心代码执行次数的 n 的量级,就是整段要分析代码的时间复杂度。
    2. 加法法则:总复杂度等于量级最大的那段代码的复杂度
    总的时间复杂度就等于量级最大的那段代码的时间复杂度
    3. 乘法法则:嵌套代码的复杂度等于嵌套内外代码复杂度的乘积
    3723793cc5c810e9d5b06bc95325bf0a.jpg
    分为两类,多项式量级和非多项式量级。其中,非多项式量级只有两个:O(2n) 和 O(n!)。
    把时间复杂度为非多项式量级的算法问题叫作 NP(Non-Deterministic Polynomial,非确定多项式)问题。
    当数据规模 n 越来越大时,非多项式量级算法的执行时间会急剧增加,求解问题的执行时间会无限增长。所以,非多项式时间复杂度的算法其实是非常低效的算法

  3. O(1)
    int i = 8;
    int j = 6;
    int sum = i + j;
    一般情况下,只要算法中不存在循环语句、递归语句,即使有成千上万行的代码,其时间复杂度也是Ο(1)。
    2. O(logn)、O(nlogn)
    在采用大 O 标记复杂度的时候,可以忽略系数,即 O(Cf(n)) = O(f(n))。所以,O(log2n) 就等于 O(log3n)。因此,在对数阶时间复杂度的表示方法里,我们忽略对数的“底”,统一表示为 O(logn)。
    归并排序、快速排序的时间复杂度都是 O(nlogn)。
    3. O(m+n)、O(mn)
    T1(m) + T2(n) = O(f(m) + g(n))
    T1(m)
    T2(n) = O(f(m) * f(n))。

    空间复杂度分析

    时间复杂度的全称是渐进时间复杂度,表示算法的执行时间与数据规模之间的增长关系。类比一下,空间复杂度全称就是渐进空间复杂度(asymptotic space complexity),表示算法的存储空间与数据规模之间的增长关系。
    总结
    越高阶复杂度的算法,执行效率越低
    497a3f120b7debee07dc0d03984faf04.jpg