2026/4/4 2:24:16
网站建设
项目流程
中装建设网站,phpmysql网站开发全程实例,大学选修课网站建设,成都网站维护公司相关内容地址#xff1a;算法复杂度分析 —形式化的均摊复杂度证明和 Master 定理示例#xff08;2#xff09;
一、常见空间复杂度#xff08;Space Complexity#xff09;
空间复杂度衡量 算法额外占用的内存大小随输入规模 n 的增长关系。 常见阶如下#xff1a;
空…相关内容地址算法复杂度分析 —形式化的均摊复杂度证明和 Master 定理示例2一、常见空间复杂度Space Complexity空间复杂度衡量算法额外占用的内存大小随输入规模 n 的增长关系。常见阶如下空间复杂度说明示例O ( 1 ) O(1)O(1)常数空间不随 n 增长双指针、原地排序部分步骤O ( log n ) O(\log n)O(logn)通常来自递归深度二分查找、平衡树操作O ( n ) O(n)O(n)线性辅助数组/链表/栈BFS 队列、前缀和数组O ( n log n ) O(n\log n)O(nlogn)分治产生多个子结构归并排序递归树的额外空间O ( n 2 ) O(n^2)O(n2)二维矩阵、DP 表Floyd、棋盘 DPO ( 2 n ) O(2^n)O(2n)状态压缩枚举子集枚举、回溯状态树O ( n ! ) O(n!)O(n!)全排列空间回溯输出所有排列补充“input size” 不算空间复杂度重点分析额外空间auxiliary space二、实际代码示例分析示例 1双指针常数空间O ( 1 ) O(1)O(1)inttwoSumClosest(vectorinta){intl0,ra.size()-1;intbestINT_MAX;while(lr){intsuma[l]a[r];bestmin(best,abs(sum));if(sum0)r--;elsel;}returnbest;}空间复杂度只用了l, r, best等常量变量 →O ( 1 ) O(1)O(1)示例 2递归 DFS空间O ( n ) O(n)O(n)voiddfs(intu,vectorvectorintg,vectorboolvis){vis[u]true;// 共享内存不算额外空间for(intv:g[u])if(!vis[v])dfs(v,g,vis);}空间复杂度递归深度最深可能 n→ 栈空间O ( n ) O(n)O(n)额外空间取决于图形结构不包括输入图本身示例 3归并排序O ( n ) O(n)O(n)归并需要临时数组voidmerge(vectorinta,intl,intr){vectorinttmp(r-l1);// 临时空间 O(n)...}→ 额外空间 O ( n ) O(n)O(n)注意递归深度O ( log n ) O(\log n)O(logn)但临时数组占主导三、复杂度分析技巧1. 循环分析法则非常常用(1) 单层循环for(inti0;in;i){// O(1)}空间O ( 1 ) O(1)O(1)时间 循环次数 × 循环体耗时 n ⋅ O ( 1 ) O ( n ) n \cdot O(1) O(n)n⋅O(1)O(n)(2) 嵌套循环 循环次数的乘积for(inti0;in;i)for(intj0;jn;j)...时间O ( n 2 ) O(n^2)O(n2)空间O ( 1 ) O(1)O(1)(3) 递归算法空间 递归深度 × 每帧额外空间例如intf(intn){if(n1)return1;returnf(n-1)f(n-2);}深度 n每帧空间 常数→ 总空间O ( n ) O(n)O(n)2. 递归Recursion空间复杂度分析步骤递归空间来自调用栈call stack。通用步骤Step 1写出递归深度例如二分深度log n \log nlogn线性递归深度n nn分治树深度log n \log nlognStep 2计算每层额外空间例如函数参数 局部变量通常常数Step 3相乘Space depth × per-call space \text{Space} \text{depth} \times \text{per-call space}Spacedepth×per-call space示例快速排序递归深度分析最坏情况单支树 → 深度 n → 空间O ( n ) O(n)O(n)平均情况深度log n \log nlogn→ 空间O ( log n ) O(\log n)O(logn)因此快速排序空间复杂度最坏O ( n ) O(n)O(n)平均O ( log n ) O(\log n)O(logn)示例二分搜索深度 log n \log nlogn每次常数空间 →O ( log n ) O(\log n)O(logn)四、总结可直接加入文档常见空间复杂度O ( 1 ) O(1)O(1)双指针、原地算法O ( log n ) O(\log n)O(logn)二分、平衡树O ( n ) O(n)O(n)DFS 栈、线性 DPO ( n 2 ) O(n^2)O(n2)矩阵 DPO ( 2 n ) O(2^n)O(2n)/O ( n ! ) O(n!)O(n!)回溯生成所有子集/排列分析技巧循环法则单层、嵌套、组合递归 深度 × 每帧空间注意区分输入空间 vs 额外空间Aux Space均摊空间例如动态数组不涉及空间扩容开销分析五、标准库算法复杂度C STL算法 / 操作时间复杂度空间复杂度额外空间说明std::sortO ( n log n ) O(n \log n)O(nlogn)O ( log n ) O(\log n)O(logn)使用 introsort快排 堆排 插入排序递归深度为log n \log nlognstd::stable_sortO ( n log n ) O(n \log n)O(nlogn)O ( n ) O(n)O(n)归并排序实现必须使用额外数组保证稳定性std::partial_sortO ( n log k ) O(n \log k)O(nlogk)O ( log n ) O(\log n)O(logn)取前 k 小元素堆 排序std::nth_elementO ( n ) O(n)O(n)期望O ( 1 ) O(1)O(1)快速选择QuickSelect原地进行std::binary_searchO ( log n ) O(\log n)O(logn)O ( 1 ) O(1)O(1)数组二分查找不需额外空间工程提示std::sort的空间复杂度非常低接近原地是工程上最常用排序。std::stable_sort若数据量巨大会因线性额外空间消耗而不适用于嵌入式或内存敏感场景。六、容器操作复杂度C STL 容器以下为常见容器的典型操作复杂度 空间分析。1.std::vector动态数组操作时间复杂度空间复杂度说明随机访问O ( 1 ) O(1)O(1)O ( 1 ) O(1)O(1)连续内存支持数组式访问尾部 push_backO ( 1 ) O(1)O(1)均摊容量按倍增策略扩展尾部 pop_backO ( 1 ) O(1)O(1)—不复制元素中间插入/删除O ( n ) O(n)O(n)—需要 memmove 移动大量数据扩容摊还O ( 1 ) O(1)O(1)单次最坏O ( n ) O(n)O(n)新容量通常为 2 倍空间特点capacity ≥ size可能有额外未使用的内存保留增长空间2.std::list双向链表操作时间复杂度说明任意位置插入O ( 1 ) O(1)O(1)已知迭代器即可插入任意位置删除O ( 1 ) O(1)O(1)不需要移动其它节点随机访问O ( n ) O(n)O(n))只能顺序遍历查找某元素O ( n ) O(n)O(n))不支持二分查找空间特点每个节点独立分配额外成本较高强依赖指针降低缓存友好性3.std::map/std::set红黑树操作时间复杂度说明查找O ( log n ) O(\log n)O(logn)平衡二叉树插入O ( log n ) O(\log n)O(logn)需保持平衡删除O ( log n ) O(\log n)O(logn)—遍历O ( n ) O(n)O(n)中序遍历空间特点每个节点分配内存 指针结构复杂CPU 缓存局部性较差相较于 vector4.unordered_map/unordered_set哈希表操作平均复杂度最坏情况说明查找O ( 1 ) O(1)O(1)O ( n ) O(n)O(n)哈希冲突大量堆积时退化插入O ( 1 ) O(1)O(1)O ( n ) O(n)O(n)可能 rehash删除O ( 1 ) O(1)O(1)O ( n ) O(n)O(n)—空间特点需要维护桶bucket数组典型情况下 bucket 数量 ≈ 元素数量 → 空间常为O ( n ) O(n)O(n)工程注意哈希表很快但 rehash 代价扩容可能导致卡顿实时系统要谨慎使用。七、空间复杂度分析技巧适用于所有算法技巧 1循环结构空间分析单层循环额外空间一般为常数O ( 1 ) O(1)O(1)嵌套循环空间仍为O ( 1 ) O(1)O(1)除非显式申请数组。技巧 2递归的空间复杂度核心公式Space max recursion depth × space per call \text{Space} \text{max recursion depth} \times \text{space per call}Spacemax recursion depth×space per call常见递归深度递归类型深度空间复杂度二分log n \log nlognO ( log n ) O(\log n)O(logn)快速排序平均log n \log nlognO ( log n ) O(\log n)O(logn)快速排序最坏n nnO ( n ) O(n)O(n)DFS链状图n nnO ( n ) O(n)O(n)技巧 3容器的空间分析动态数组size 与 capacity 分离链表每节点额外指针开销哈希表桶数组 元素链平衡树节点 多个指针“空间复杂度 每个节点大小 × 节点数”