算法与数据结构系统概览 | [算法]-[基础]-[通用]
一、算法分类与应用
1. 硬计算类算法 | [算法]-[中级]-[通用]
特点 | 应用场景 | 复杂度特征 |
---|---|---|
- 精确求解问题 - 可能带来较高计算复杂度 |
- 大厂笔试/面试 - ACM竞赛 - 所有程序员岗位必考 |
⏱️ 通常为 O(n)~O(n²) |
// [示例] 快速排序算法 - 分治思想核心实现
public void quickSort(int[] arr, int left, int right) {
if (left < right) {
// [关键] 随机选择基准点可避免最坏情况
int pivotIndex = partition(arr, left, right);
quickSort(arr, left, pivotIndex - 1);
quickSort(arr, pivotIndex + 1, right);
}
}
2. 软计算类算法 | [算法]-[高级]-[AI/机器学习]
特点 | 应用场景 | 复杂度特征 |
---|---|---|
- 逼近解而非精确解 - 计算时间可控 |
- 算法工程师额外掌握 - 机器学习/AI领域 |
⏱️ 通常为多项式时间 |
# [示例] 梯度下降算法 - 机器学习基础优化方法
def gradient_descent(X, y, theta, alpha, iterations):
m = len(y) # 样本数
cost_history = []
for i in range(iterations):
# [关键] 向量化计算提高效率
prediction = X.dot(theta)
error = prediction - y
gradient = X.T.dot(error) / m
theta = theta - alpha * gradient # 更新参数
# 记录代价函数
cost = (1/(2*m)) * np.sum(np.square(error))
cost_history.append(cost)
return theta, cost_history
二、数据结构底层分类
1. 连续结构 | [数据结构]-[基础]-[存储]
核心原理 | 常见结构 | 优缺点 |
---|---|---|
内存物理连续存储 | 数组、顺序栈、队列 | ✅ 随机访问快 O(1) ❌ 插入删除慢 O(n) |
// [示例] 数组实现的栈 - 连续存储结构典型应用
public class ArrayStack<T> {
private Object[] elements; // [核心] 连续内存存储
private int size;
public ArrayStack(int capacity) {
elements = new Object[capacity];
size = 0;
}
public void push(T item) {
// [警告] 未检查栈溢出 → 应添加扩容机制
elements[size++] = item;
}
@SuppressWarnings("unchecked")
public T pop() {
if (isEmpty()) throw new EmptyStackException();
T item = (T) elements[--size];
elements[size] = null; // 避免内存泄漏
return item;
}
public boolean isEmpty() {
return size == 0;
}
}
2. 跳转结构 | [数据结构]-[中级]-[引用]
核心原理 | 常见结构 | 优缺点 |
---|---|---|
通过指针/引用逻辑关联 | 链表、二叉树、哈希表 | ✅ 插入删除快 O(1) ❌ 随机访问慢 O(n) |
// [示例] 二叉树的层序遍历 - BFS通用模板
// ▶ JDK8+
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> res = new ArrayList<>();
Queue<TreeNode> queue = new LinkedList<>();
if (root != null) queue.offer(root);
while (!queue.isEmpty()) {
int levelSize = queue.size();
List<Integer> level = new ArrayList<>();
for (int i = 0; i < levelSize; i++) {
TreeNode node = queue.poll();
level.add(node.val);
// [关键] 按层扩展
if (node.left != null) queue.offer(node.left);
if (node.right != null) queue.offer(node.right);
}
res.add(level);
}
return res;
}
3. 高阶数据结构 | [数据结构]-[高级]-[竞赛]
结构名称 | 核心应用 | 复杂度 |
---|---|---|
可持久化线段树 | 区间查询与历史版本 | ⏱️ 构建 O(n log n),查询 O(log n) |
树链剖分 | 树上路径操作 | ⏱️ 预处理 O(n),查询 O(log n) |
后缀数组 | 字符串匹配 | ⏱️ 构建 O(n log n),查询 O(m log n) |
三、关键结论与实战应用
1. 硬计算类算法是程序员的通用基础
- 所有技术岗(前端/后端/算法)必须掌握
- 决定代码核心效率的基石
2. 数据结构本质是两大结构的组合
任何数据结构 = 连续结构 + 跳转结构
↑↑↑
没有例外(从链表到后缀数组均遵循此规律)
技术决策树:
3. 算法工程师的进阶能力
- 硬计算类:解决精确问题(如:LeetCode题目)
- 软计算类:处理现实复杂问题(如:推荐系统/图像识别)
四、学习路径与工具
1. 学习建议
- 优先掌握硬计算类算法,再拓展软计算应用
- 数据结构需理解组合本质而非死记硬背
- 通过实战题目巩固理论知识
🚀 效率工具:VisuAlgo - 数据结构和算法可视化学习平台