如何分析、统计算法的执行效率和资源消耗?

104 阅读2分钟

1.为什么需要复杂度分析?

虽然跑性能测试可以得到算法的执行时间和占用内存空间大小,但是这种方式有两个局限。

第一个,测试结果非常依赖测试环境,不同硬件性能的测试环境跑出来的结果也是不同的

第二个,测试时结果受数据规模的影响很大。

我们需要一个不需要具体的测试数据来测试。就可以粗略的估算算法的的执行效率和资源消耗的方式。

这就是复杂度分析的由来。

2.大O复杂度表示法

T(n)=O(f(n))

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

大O时间复杂度度实际并不具体代表代码的真正执行时间,只是表示代码执行时间随数据规模增长的变化趋势。

3.时间复杂度分析

3个分析技巧

  • 1)只关注循环次数最多的一段代码

    因为大O复杂度表示的是一种变化趋势,忽略表达式中的常量,低阶,系数,只需要记录一个最大阶的量级就可以了。

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

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

4.几种常见的时间复杂度分析

复杂度量级由低到高

  • O(1)常量阶复杂度
  • O(logn)对数阶复杂度
  • O(n)线性阶复杂度
  • O(nlogn)线性对数阶复杂度
  • O(n^2)平方阶复杂度
  • O(n^3)立方阶复杂度
  • O(n^k)K次方阶复杂度
  • O(2^n)指数阶复杂度
  • O(n!)阶乘阶复杂度

复杂度量级.webp

5.空间复杂度分析

空间复杂度表示算法存储空间和数据规模增长的变化趋势。 常见的空间复杂度:O(1),O(n),O(n^2)