复杂度

时间复杂度

局限性

一些数据,如n较小时,不能仅凭时间复杂度判断算法效率的高低。尽管如此,复杂度分析仍然是评判算法效率最有效且常用的方法。

统计方式

忽略掉变化较小的,

类型

𝑂(1) 常数阶

𝑂(log 𝑛) 对数阶
“每轮缩减到一半”

𝑂(𝑛) 线性阶

𝑂(𝑛 log 𝑛) 线性对数阶

𝑂(𝑛^2) 平方阶

𝑂(2^𝑛) 指数阶

𝑂(𝑛!) 阶乘阶

空间复杂度 space complexity

内存空间分类

  • 输入空间。
  • 暂存空间:用于存储算法在运行过程中的变量、对象、函数上下文等数据。
    • 暂存数据:各种常量、变量、对象等。
    • 栈帧空间:调用函数的上下文数据。系统在每次调用函数时都会在栈顶部创建一个栈帧,函数返回后,栈帧空间会被释放。
    • 指令空间:在实际统计中通常忽略不计
  • 输出空间

通常统计的是: 暂存数据 + 栈帧空间 + 输出空间

通常只关注最差空间复杂度,因为需要保证所有的数据都能够有足够的空间

常见复杂度类型

𝑂(1) < 𝑂(log 𝑛) < 𝑂(𝑛) < 𝑂(𝑛^2) < 𝑂(2^𝑛)

尾递归的空间复杂度

理论上,尾递归函数的空间复杂度可以被优化至 𝑂(1) 吗? 𝑂(1) 。不过绝大多数编程语言(例如 Java、Python、C++、Go、C# 等)都不支持自动优化尾递归,因此通常认为空间复杂度是 𝑂(𝑛)