【数学基础】复杂度理论
1. 常数级复杂度(O(1))
- 特征:计算量与输入规模无关
- 举例:
- 哈希表查询:通过键的哈希值直接定位存储位置(如
HashMap.get(key)
)。 - 数组下标访问:通过索引直接读取元素(如
arr[5]
)。
- 哈希表查询:通过键的哈希值直接定位存储位置(如
2. 对数级复杂度(O(log n))
- 特征:计算量随规模增加呈对数增长
- 举例:
- 二分查找:在排序数组中每次排除一半数据(时间复杂度为 O(log₂n))。
- B树索引查询:数据库索引只需遍历树高(如 MySQL B+Tree)。
3. 线性级复杂度(O(n))
- 特征:计算量与输入规模呈正比
- 举例:
- 数组遍历:完整扫描所有元素(如
for(int i=0; i<n; i++)
)。 - 过度拆分带来的JOIN操作:Cjoin∝M×N(线性关系)
- 数组遍历:完整扫描所有元素(如
4. 线性对数级复杂度(O(n log n))
- 特征:计算量介于线性与平方之间
- 举例:
- 快速排序:递归分治(最优时间复杂度 O(n log₂n))。
- 归并排序:分组合并排序结果。
5. 多项式级复杂度(O(nᵏ), k≥2)
- 特征:计算量随规模幂次增长
- 举例:
- 平方级 O(n²):
- 冒泡排序:两层嵌套循环(比较次数 ≈ n²/2)。
- 全表扫描JOIN:未使用索引的SQL关联(如
SELECT * FROM a,b WHERE a.id=b.id
)。
- 立方级 O(n³):
- 矩阵乘法:三重循环计算(朴素算法)。
- 平方级 O(n²):
6. 指数级复杂度(O(kⁿ), k>1)
- 特征:计算量呈指数爆炸式增长
- 举例:
- 暴力穷举密码:8位字母密码的组合数为 26⁸ ≈ 209亿种。
- 旅行商问题(TSP):遍历所有路径组合(解空间大小为 n!)。
在分库分表场景中:
- 过度拆分,则是Cjoin∝M×N 属于线性级复杂度(非指数级)
- 实际工程风险点:当 M=1000 且 N=3 时,计算量达 3000 次分片操作 → 需通过设计规避:
重要总结:
- 指数级复杂度(如O(2ⁿ)) 是系统设计的“灾难性陷阱”(如无剪枝的递归回溯)。
- 分库分表的核心优化目标:通过架构设计(冗余/分片键策略),将分布式操作复杂度从 O(M×N) 降为 O(1)(如单分片内完成查询)。
- 终极实践原则:在编写高复杂度代码时(如嵌套循环),必须立即追问——是否存在更优的数学逻辑可降维?