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

广义上数据结构指的是一组数据的存储形式,算法则是操作这组数据的行为,算法构建与于数据结构之上,具体来讲,不同的算法需要依赖特定的数据结构才能发挥作用,例如二分查找算法需要依赖数组的随机访问特性。

高效的算法能够节省大量计算资源(CPU,内存),一般通过复杂度分析来衡量算法高效与否。当然也可以通过统计代码运行时间来直观地判断算法优劣,称为事后统计法,但这种方式具备一定局限性,运行环境,数据规模,数据分布情况都会影响测量结果,而复杂度分析则是从更为抽象的层面进行评估,忽略了具体 runtime 过程的影响,评估结果更具备通用性。

渐进时间复杂度(常用)

假设每一行代码的执行时间都等于 unit_time,n 为数据规模,整体执行时间 T(n) = O(f(n)),通过大O复杂度表示法,时间复杂度与数据规模(代码执行次数)成正比。

另外时间复杂度只关注最高阶项(最大影响),可以忽略低阶,系数,常量部分,例如:

T(n) = O(2n^2+2n+3) 可以简化为 T(n) = O(n^2)

常见的时间复杂度(效率由高到低):O(1),O(logn),O(n),O(n^2),另外还有指数阶复杂度 O(2^n),这种复杂度效率极低(复杂度会随数据规模增加发生剧变),比较少见。

另外还有更细致的复杂度分析,考虑具体场景:

  • 最坏,最好时间复杂度
  • 平均时间复杂度
  • 均摊时间复杂度