一、算法基础
- 算法特征
| 特征 |
说明 |
| 有穷性 |
有限时间内完成 |
| 确定性 |
无歧义的明确定义 |
| 输入 |
0个或多个输入(0输入指内置参数) |
| 输出 |
≥1个输出 |
| 可行性 |
符合计算规则,可执行有限次实现 |
- 常见算法类型
- 基础算法:穷举、高精度计算
- 核心算法:排序、递推、递归
- 优化算法:贪心、分治、搜索(DFS/BFS)、动态规划
- 算法复杂度
时间复杂度(常见阶数升序):
O(1) < O(log n) < O(n) < O(n log n) < O(n²) < O(n³) < O(2ⁿ)
空间复杂度:算法运行所需内存空间
- 常见算法的算法复杂度
| 算法类别 |
最佳情况 |
平均情况 |
最坏情况 |
空间复杂度 |
备注 |
| 哈希查找 |
O(1) |
O(1) |
O(n) |
O(n) |
冲突时退化为链表 |
| 二分查找 |
O(1) |
O(log n) |
O(log n) |
O(1) |
要求有序数组 |
| 快速排序 |
O(n log n) |
O(n log n) |
O(n²) |
O(log n) |
最坏情况需优化枢轴选择 |
| 归并排序 |
O(n log n) |
O(n log n) |
O(n log n) |
O(n) |
稳定排序 |
| 堆排序 |
O(n log n) |
O(n log n) |
O(n log n) |
O(1) |
原地排序 |
| 冒泡排序 |
O(n) |
O(n²) |
O(n²) |
O(1) |
优化后可提前终止 |
| 选择排序 |
O(n²) |
O(n²) |
O(n²) |
O(1) |
不稳定 |
| 插入排序 |
O(n) |
O(n²) |
O(n²) |
O(1) |
对小规模数据高效 |
| DFS/BFS |
O(V+E) |
O(V+E) |
O(V+E) |
O(V) |
V:顶点数,E:边数 |
| Dijkstra |
O(V²) |
O(E log V) |
O(E log V) |
O(V) |
优先队列优化后 |
| 动态规划 |
O(子问题数) |
O(子问题数) |
O(子问题数) |
O(状态空间) |
依赖问题分解 |
| 回溯算法 |
O(解空间大小) |
O(解空间大小) |
O(解空间大小) |
O(递归深度) |
指数级复杂度常见 |
二、数据结构基础
- 数组特性
| 特性 |
说明 |
时间复杂度 |
| 同类型元素 |
存储相同数据类型 |
- |
| 随机访问 |
通过下标直接访问 |
O(1) |
| 插入/删除 |
需移动元素 |
O(n) |
优化方向:通过限制操作类型定制高效结构 → 栈、队列、堆
三、栈(Stack)
- 核心特性
- LIFO/FILO:后进先出原则
- 高效操作:push/pop/getTop均为O(1)
- 核心组件:栈顶指针(counter)
- 操作清单
| 操作 |
功能描述 |
时间复杂度 |
| init() |
初始化空栈 |
O(1) |
| push(x) |
元素x入栈 |
O(1) |
| pop() |
移除栈顶元素 |
O(1) |
| getTop() |
获取栈顶元素(不移除) |
O(1) |
| empty() |
检测栈是否为空 |
O(1) |
| display() |
输出栈内所有元素 |
O(n) |
| setNull() |
清空栈 |
O(1) |
四、队列(Queue)
- 核心特性
- FIFO:先进先出原则
- 双指针管理:队首指针f(指向头元素前),队尾指针r(指向最后元素)
- 初始状态:f = r = 0
- 操作清单
| 操作 |
功能描述 |
时间复杂度 |
| init() |
初始化空队列 |
O(1) |
| enqueue(x) |
元素x入队 |
O(1) |
| dequeue() |
移除队首元素 |
O(1) |
| isEmpty() |
检测队列是否为空 |
O(1) |
| isFull() |
检测队列是否已满 |
O(1) |
| display() |
输出队列所有元素 |
O(n) |
特殊变种:循环队列、双端队列、优先队列