03-复杂度分析(上):如何分析、统计算法的执行效率和资源消耗?

复杂度分析(上):如何分析、统计算法的执行效率和资源消耗?

  • 把代码跑一遍,通过统计、监控得到算法执行时间和占用内存大小的方法叫作事后统计法。事后统计法的局限性:

    • 测试结果非常依赖测试环境
    • 测试结果受数据规模的影响很大
  • 时间、空间复杂度分析法,不用具体测试数据来测试,就可以粗略地估计算法的执行效率。

大 O 时间复杂度表示法

大 O 时间复杂度表示法:所有代码的执行时间 T(n) 与每行代码的执行次数 n 成正比。

T(n):代码执行时间 n:数据规模大小 f(n):每行代码执行的次数总和 O:表示 T(n) 与 f(n) 成正比

大 O 时间复杂度表示法实际上并不具体表示代码真正的执行时间,而是表示代码执行时间随数据规模增长的变化趋势,所以也叫做渐进时间复杂度,简称时间复杂度

时间复杂度分析

  • 只关注循环执行次数最多的一段代码
  • 加法法则:总复杂度等于量级最大的那段代码的复杂度
  • 乘法法则:嵌套代码的复杂度等于嵌套内外代码复杂度的乘积

几种常见时间复杂度实例分析

03-复杂度分析(上):如何分析、统计算法的执行效率和资源消耗?_第1张图片

以上复杂度量级可以粗略地分为两类,多项式量级非多项式量级

  • 其中,非多项式量级只有:,当数据规模 n 越来越大时,非多项式量级算法的执行时间会急剧增加,求解问题的执行时间会无限增长。所以,非多项式时间复杂度的算法其实是非常低效的算法

  • 多项式时间复杂度

    • O(1):一般情况下,只要算法中不存在循环语句、递归语句,即使有成千上万行的代码,其时间复杂度也是Ο(1)。
    • O(logn)、O(nlogn):不管是以 2 为底、以 3 为底,还是以 10 为底,因为对数可以相互转化,同时又要忽略常数,我们可以把所有对数阶的时间复杂度都记为 O(logn)。
    • O(m+n)、O(m*n):无法事先评估 m 和 n 谁的量级大来决定省略哪个,所以代码的复杂度由两个数据的规模来决定。

空间复杂度分析

空间复杂度分析全称就是渐进空间复杂度(asymptotic space complexity),表示算法的存储空间与数据规模之间的增长关系。

空间复杂度是指算法在计算机内执行时所需存储空间的度量。一般所讨论的是除正常占用内存开销后额外的内存消耗规模

常见的空间复杂度就是 $ O(1)、O(n)、O(n^2 ),像O(logn)、O(nlogn) 这样的对数阶复杂度平时都用不到。

小结:

复杂度也叫渐进复杂度,包括时间复杂度和空间复杂度,用来分析算法执行效率与数据规模之间的增长关系,可以粗略地表示,越高阶复杂度的算法,执行效率越低。常见的复杂度并不多,从低阶到高阶有:

03-复杂度分析(上):如何分析、统计算法的执行效率和资源消耗?_第2张图片

你可能感兴趣的:(03-复杂度分析(上):如何分析、统计算法的执行效率和资源消耗?)