算法笔记:复杂度分析复盘

把常见数据结构操作的复杂度整理成一张表,顺便记几个容易记混的点。

计算机基础1 分钟
目录

常见操作复杂度

数据结构查找插入删除
数组O(n)O(n)O(n)O(n)O(n)O(n)
有序数组O(log⁡n)O(\log n)O(n)O(n)O(n)O(n)
哈希表O(1)O(1) 均摊O(1)O(1) 均摊O(1)O(1) 均摊
平衡二叉搜索树O(log⁡n)O(\log n)O(log⁡n)O(\log n)O(log⁡n)O(\log n)

容易记混的点

快速排序的平均复杂度是 O(nlog⁡n)O(n \log n),但最坏情况会退化到 O(n2)O(n^2);归并排序稳定在 O(nlog⁡n)O(n \log n),代价是需要 O(n)O(n) 额外空间。

堆排序是 O(nlog⁡n)O(n \log n) 且原地,但它不稳定,实际运行常数往往比快排大。

复杂度是增长趋势,不是运行时间。nn 很小的时候常数项说了算。

主定理

对于形如 T(n)=aT(n/b)+O(nd)T(n) = aT(n/b) + O(n^d) 的递推:

T(n)={O(nd)d>log⁡baO(ndlog⁡n)d=log⁡baO(nlog⁡ba)d<log⁡baT(n) = \begin{cases} O(n^d) & d > \log_b a \\ O(n^d \log n) & d = \log_b a \\ O(n^{\log_b a}) & d < \log_b a \end{cases}