← 2026-04-07 📂 All Days 2026-04-09 →

🔄 复习日 / Review Day

今天是复习日!回顾过去4天的内容。

📝 Quick Quiz — 3 Mini-Reviews

Pick 3 topics from 3 different sections.

Q1: [🏗️ System Design] 设计 URL Shortener 时,为什么「短链 → 长链」映射通常不能只放在单机内存里?如果你改成分布式缓存(如 Redis)+ 持久化数据库,你会如何处理:一致性、缓存穿透/击穿、以及读写高峰?

<details><summary>显示答案 / Show Answer</summary>

单机内存会成为单点故障且容量/扩展受限,一旦重启映射丢失会直接导致短链失效。常见做法是“缓存读为主、DB 为真源”:写入时先生成唯一 code(如雪花/号段/哈希+冲突处理),写 DB 成功后再写缓存;读取时走缓存未命中再查 DB 并回填缓存(cache-aside)。为防穿透可对不存在的短码做短 TTL 的 negative cache 或 Bloom Filter;为防击穿/热点可加互斥锁/请求合并、并对热点 key 做预热与更长 TTL;一致性上接受短暂不一致(最终一致)通常更划算,但要确保“写后读”路径可通过写穿/双写顺序与幂等更新降低概率。

</details>

Q2: [💻 Algorithms] 在「Permutation in String」里,用滑动窗口比较频次时,为什么很多实现会维护一个 matches(或 need)计数,而不是每次都比较 26 个字符计数?你需要小心哪些边界更新才能保证 matches 不出错?

<details><summary>显示答案 / Show Answer</summary>

维护 `matches` 的核心是把“是否全等”从 O(26) 的全量比较降到 O(1) 的增量更新:窗口右移时只会影响进入和移出的两个字符。每次只在某个字符计数从“等于目标”变为“不等于目标”(或反过来)时调整 `matches`,最终当 `matches == 26`(或等价条件)即可判定成功。边界上要确保:更新计数前后顺序一致(先增/减再判断,或先判断再改,但要成对)、处理从 `target-1 → target` 与 `target → target+1` 两种跨越、以及窗口长度固定为 `len(s1)` 时每一步都同时处理进出字符。任何漏掉的跨越都会导致 `matches` 偶尔“卡住”或提前满足。

</details>

Q3: [🤖 AI] 你在做一个基于 RAG 的问答系统:为什么单纯“把更多文档塞进向量库”往往不会让答案更好?请用 3 个维度说明(检索、生成、评估),并给出你会优先做的 2 个改进动作。

<details><summary>显示答案 / Show Answer</summary>

文档越多不等于命中率更高:检索层会面临噪声增大、相似度分数更难区分、以及 chunk 粒度/重叠不合理导致关键信息被切碎;生成层则会遇到上下文拥挤(有效信息被淹没)、模型对冲突信息无法仲裁、以及引用不稳定;评估层如果没有“可量化”的离线集与指标(如 answer correctness、citation faithfulness、latency),你很难知道到底是检索还是生成在拖后腿。优先改进通常是:① 做检索质量工程(更好的 chunking + metadata 过滤 + 关键词/向量混合检索 + reranker);② 建立评估闭环(黄金问答集、自动评测+人工抽检),用数据驱动地迭代提示词、检索 top-k、与 rerank 策略。

</details>

💡 复习巩固记忆,螺旋式上升。

📅 明天继续新内容!