phase 5 part 5: cs algorithms, network-os, web-security topics with tested examples; all 43 stacks pass --strict

This commit is contained in:
Shikui Wang committed 2026-10-23 16:47:11 +08:00
1 parent f695bbd7cc
commit 691f738f5f
22 files changed
+1955 -37

No files matched your search

@@ -0,0 +1,104 @@
---
id: cs.algorithms.complexity-patterns
title: 复杂度分析和九个高频模式:哈希、滑动窗口、二分、堆、BFS、拓扑排序、动态规划、LRU、区间合并
type: lesson
domain: cs
stack: [algorithms]
tags: [时间复杂度, 哈希表, 滑动窗口, 二分查找, 堆, Top K, BFS, DFS, 拓扑排序, 动态规划, LRU]
level: basic
prerequisites: [python.python.index]
est_hours: 6
related: [cs.algorithms.scenario.business-algorithms, cs.algorithms.interview]
week: [16]
order: 1
---
# 复杂度分析和九个高频模式:哈希、滑动窗口、二分、堆、BFS、拓扑排序、动态规划、LRU、区间合并
> BOSS直聘 2026-10-23 的调研中有少数岗位明确提到算法 / 数据结构基础,笔试和一面中出现手写题的情况也不少。目标不是刷几百题,而是**掌握模式、能讲复杂度、写出无 bug 的中等题**。练习平台可用 LeetCode 中国站(力扣)。
## 解释说明
### 复杂度
| 复杂度 | 典型操作 | n = 10⁶ 时的感受 |
| --- | --- | --- |
| O(1) | 哈希表查找、数组下标 | 瞬间 |
| O(log n) | 二分查找、堆操作 | 约 20 步 |
| O(n) | 遍历 | 很快 |
| O(n log n) | 排序 | 可以接受 |
| O(n²) | 双重循环 | 太慢(10¹² 次) |
面试时先说暴力解及其复杂度,再优化,最后说明时间和空间复杂度。
### 九个模式(何时想到它)
| 模式 | 信号 | 例题 |
| --- | --- | --- |
| 哈希表 | “是否出现过”、“计数”、“配对” | 两数之和 |
| 滑动窗口 | 连续子数组 / 子串 + 最长 / 最短 | 无重复字符的最长子串 |
| 二分查找 | 有序、单调、“第一个满足条件的” | lower_bound、搜索旋转数组 |
| 堆 | Top K、动态取最值、合并 K 个有序 | 前 K 个高频元素 |
| BFS | 最短步数、层序遍历 | 网格最短路径 |
| DFS / 拓扑排序 | 依赖关系、是否有环、所有方案 | 课程表 |
| 动态规划 | 最优值 / 方案数、子问题重叠 | 编辑距离、爬楼梯、背包 |
| 设计题 | 要求 O(1) 操作 | LRU 缓存 |
| 排序 + 扫描 | 区间、会议室 | 合并区间 |
### 答题步骤
1. 复述题目,问清边界(空输入、重复、负数、数据规模);
2. 说思路和复杂度,得到认可后再写;
3. 写代码时变量命名清楚;
4. 用一两个例子手动走一遍,包括边界;
5. 说明可以改进的地方。
## 案例
这些模式在业务中经常出现:热门问题统计(堆)、限流的滑动窗口、任务编排的依赖顺序(拓扑排序,LangGraph / CI 流水线都用到)、文本纠错与相似度(编辑距离)、缓存淘汰(LRU)、排班时间段合并(区间合并)。见[企业场景](scenarios/business-algorithms.md)。
## 代码示例
[examples/patterns](examples/patterns/):9 个模式的实现 + 13 个测试(其中二分查找与标准库 `bisect` 随机对拍 200 次)。
滑动窗口:
```python
def longest_unique_substring(s: str) -> int:
last: dict[str, int] = {}
left = best = 0
for right, ch in enumerate(s):
if last.get(ch, -1) >= left:
left = last[ch] + 1
last[ch] = right
best = max(best, right - left + 1)
return best
```
二分查找(左闭右开,最不容易写错的模板):
```python
def lower_bound(arr: list[int], target: int) -> int:
lo, hi = 0, len(arr)
while lo < hi:
mid = (lo + hi) // 2
if arr[mid] < target:
lo = mid + 1
else:
hi = mid
return lo
```
## 易错点
- 二分查找的区间定义混乱(左闭右闭和左闭右开混用),导致死循环或越界。
- 滑动窗口中,重复字符在窗口左边界之外时也移动左边界(例如 "abba")。
- BFS 出队时才标记已访问,导致同一个节点多次入队。
- 递归 DFS 在深度很大时栈溢出(Python 默认递归深度约 1000)。
- 只写出代码不说复杂度。
## 面试常问
- 手写:两数之和、最长无重复子串、二分查找、Top K、LRU、合并区间、课程表、编辑距离 / 爬楼梯。
- 哈希表的原理和冲突处理?
- 快速排序的平均和最坏复杂度?