后续章节制作草稿:从第 5 章散列沉淀出的规范

这个文件只给课程制作阶段使用,不进入学生版 PPT。正式页面中不要出现“原 PPT”“补充”“正确讲法”“制作提示”等教师侧措辞。

总体目标

  • 每章都先形成“学生能顺着学下去”的课堂讲义,而不是给教师看的重构说明。
  • 原始 slide 的有用内容要融合进新讲义,不能简单抛弃;但错误、拼写、代码、逻辑跳跃必须修正。
  • 每章需要有现代学术风格,但不要做成花哨网页。主视觉保持黑色边框、黑色文字、白色背景,用少量强调色突出关键概念。
  • 所有算法讲解都要尽量绑定可视化演示:学生看到的不只是定义,而是状态如何一步步变化。
  • 章节开头和结尾要联系业界或前沿使用场景,让学生知道本节知识在哪里真实出现。

Quarto / revealjs 使用原则

  • 使用 Quarto + revealjs 作为 HTML PPT 框架。
  • QMD 里不要堆大量原始 HTML tag。布局优先使用 Markdown、Quarto fenced div、columns 和统一 CSS class。
  • 复杂图和动画用 JavaScript 组件渲染;QMD 只保留占位 div 与必要参数。
  • 课程品牌信息集中放在 course-branding-data.js,每章加载统一脚本,不要在每个章节手写署名、二维码、logo。
  • 标题区固定在顶部,内容区在剩余空间中纵向居中。这样如果内容过多,会自然溢出到标题区域,便于一眼发现。
  • 页面正文的字号和行距要克制。代码和图中的字号可以保持可读,但普通正文不要太大,否则 slide 很快爆版。
  • 数学公式的上下空白要单独控制;注意 Quarto/MathJax 可能同时有外层段落 margin 和公式自身 margin。

学生版内容要求

  • 每一章按 4 小时课堂容量设计。宁可拆成更多页面逐步讲透,也不要为了页数少而压缩关键推理、边界条件、代码过程和习题答案。
  • 学生版 PPT 中只能出现面向学生的课堂讲义语言。不得出现心理活动、制作判断、教师侧 comment、覆盖校验、返工记录、TODO、内部命名解释或“原 PPT / 补充 / 正确讲法 / 后续实现”等草稿痕迹。
  • 所有制作讨论、覆盖清单、质量判断、重写策略和返工记录只写在 drafts/ 下的草稿或进度文件中。
  • 大段文字必须拆成可逐行出现的讲解流。不要一页堆满多个段落或长列表;每一步内容应能和当页动画或代码高亮同步推进。
  • 讲算法时顺序固定为:先给场景和任务,再给步骤或伪代码,再演示动画,最后回到代码和复杂度分析。不得让学生一上来只看到动画而不知道目标。
  • 所有动态数据结构演示必须逐帧展开。查找、插入、删除、递归调用、元素移动、指针改变、栈帧变化都要拆开;不能把多个关键动作合成一帧。
  • 涉及元素移动时,必须优先使用同一画布中的轨迹动画,而不是重建整个图后让元素“跳变”。Cuckoo kick、数组交换、链表节点移动、树旋转、堆上滤/下滤都按这一标准执行。
  • 所有代码语法点最终要反向收集:完成全部章节后,汇总各章 C++/Java 代码实际使用到的语法,再回到第一章语法复习部分补齐,而不是预先凭感觉遗漏或堆砌。
  • 每章首页包含章节标题、署名、二维码、学年、学期、课程号。
  • 每页标题左侧显示南京大学 logo,但 logo 不能挤占标题文本排版。logo 应脱离标题文字流或使用稳定的布局。
  • 开头页要回答“为什么本章重要”,最好从学生熟悉的系统或工程场景进入。
  • 路线图不要只是列表,优先做成思维导图或可跳转结构图。
  • 学习目标应是学生完成本章后能回答的问题,而不是教师侧教学安排。
  • 每个核心概念尽量配图。图不是装饰,而要承担讲解步骤、对比关系或状态变化。
  • 例题和思考题必须附答案;答案尽量使用同一套图形语言表达,不要退回纯表格。
  • 讲完一个算法后,应给出多维度分析:正确性、复杂度、空间代价、工程约束、边界条件、失败场景、适用场景。
  • 代码部分不能只贴片段。需要先分段讲解,再展示完整代码,最后提供可直接编译运行的工程包。

图形风格

  • 图形以白底、黑边框、黑字为主。
  • 强调色少用且一致,目前蓝色用于当前步骤、命中、关键路径等。
  • 桶、节点、数组格子等基础元素要统一样式,避免每页重新发明一种视觉语言。
  • 哈希桶示意图在散列章节中统一使用 7 个桶,除非教学目的明确要求改变桶数。
  • 图的目标是让学生“看出过程”,所以探测、查询、插入等多步过程要有顺序数字、箭头和高亮。
  • 箭头、标签和计算结果不能挤压主体图。计算结果尽量固定在图下方,避免换行导致画面跳动。
  • 简单对比图可以静态呈现,但仍应统一使用图形而不是松散表格。
  • 页内大框图需要按一页规划版面,不要出现“大图很空,小字很挤”的情况。

动画设计原则

  • 每个可交互动画都应包含 PrevNextRunFinalReset
  • Next 要体现一步一步变化,不要一次性把多次 probe 或多次比较全部显示出来。
  • Run 用于连续推进;Final 用于直接看最终状态;Reset 应清空高亮、箭头和临时状态。
  • 多次插入或查询时,每个新 key 开始前要清空上一轮的箭头和高亮,只保留必要的已插入数据结构状态。
  • 动画中要明确当前任务,例如“插入 key=13”“查找 key=24”,避免学生不知道正在看哪一步。
  • 对探测类算法,左侧或附近要显示数字顺序与箭头,当前探测位置使用高亮。
  • 对有公式的动画,要显示当前步骤的中间变量,例如 H(key)ih+i^2、双散列步长等。
  • 概率类动画要能展示随机过程和统计结果。例如碰撞不可避免可以用扔球入桶:先少量插入观察碰撞,再展示大量插入后的涨落分布。

代码讲解规范

  • 课堂主代码展示 C++,动画可以用等效 JavaScript 渲染。二者不需要运行时 trace 同步,但概念和步骤必须手动保持一致。
  • C++ 示例必须能编译。避免模板参数、类型、函数签名和 main 测试之间不一致。
  • 代码中的 key/value 类型要语义正确。例如 Entrykey 可以是模板变量,value 示例可用 int,不要出现无法编译的 int/string 混用。
  • 每个算法的代码讲解要使用“同一份代码逐步高亮”的方式:高亮一段,显示对应解释;下一段出现时,上一个解释消失。
  • 不要硬编码高亮行号。使用脚本通过字符串锚点定位,再生成行号,避免后续改代码导致高亮错位。
  • 查找失败、删除、再散列等边界逻辑必须讲准确。不要把“查找失败时再哈希”这类错误解释带入学生版。
  • 章节提供的下载代码应包含本章讲过的所有变体,并在 main 中全部测试过。
  • 文件名、类名、下载包内容要和 PPT 中展示一致,避免学生下载后对不上。

散列章节中特别确认过的教学判断

  • “从查找问题开始”应横向展示三种方法:顺序查找、二分查找、散列查找;每一项内部的数组/桶竖向排列,与后续哈希表图一致。
  • 散列查找示例不要设计成查到链表末尾才成功,否则不像平均意义上的常数时间查找。可以保留一个冲突元素,让学生意识到冲突存在,但不要让第一印象变成“散列也很慢”。
  • “散列表的基本图像”不是只讲 collision,而是展示一次基本插入和查找过程。
  • “碰撞不可避免”适合用概率视角讲。桶数太少会失真;可以用 20 个桶,先播放少量插入,再展示 500 次后的非均匀涨落。
  • “为什么常选质数”用合数表长和质数表长对同一组 key 的分布对比来讲,避免纯表格。
  • 平方取中法要展示竖式或对齐计算,让学生看到“取中间位”为什么可能比简单取低位更均匀;计算必须反复核对。
  • 字符串散列要解释为什么需要乘以基数或滚动累积,否则简单求和的取值空间和排列敏感性都很差。
  • 线性探测演示不宜插入太多 key。先展示几个直接成功,再展示一次跳跃探测即可。
  • 聚集问题要接着已有线性探测状态展示,让学生看到 cluster 如何扩大。
  • 删除不能简单清空桶,必须说明原 home bucket 和探测路径,否则墓碑的必要性会显得突兀。
  • 再散列适合静态紧凑图:先画旧表装载过高,再画迁移到更大表后的状态。不一定需要动画。
  • 双散列演示必须附公式和步长约束,尤其要说明步长与表长互质的重要性。

版面和可维护性

  • 不要让单页承担太多目标。一个核心图或一个核心代码讲解往往就足够一页。
  • 表格要松,不要把多维分析塞成密集小字。必要时拆成多页或改成卡片/矩阵图。
  • 相同用途使用统一 CSS class,例如演示容器、三列布局、对比 panel、bucket row、token、公式说明等。
  • 数据结构绘图组件要抽象为可复用函数,支持容量、内容、当前高亮、探测顺序、成功/失败状态、计算说明等参数。
  • 后续章节也应像散列章节一样,把“绘图逻辑”和“章节内容”分离:QMD 管讲义结构,JS 管动态可视化,CSS 管视觉系统。
  • 每次新增章节或重构样式后,至少运行 Quarto render 和必要的脚本检查。

验证习惯

  • 修改代码高亮后运行:
python scripts/resolve_code_walks.py chapters/05-hashing.qmd --check
  • 修改 QMD、CSS、JS 后运行:
quarto render chapters/05-hashing.qmd
  • 视觉检查优先看是否溢出、标题是否被挤压、动画状态是否清空、计算说明是否跳动。
  • 如果使用浏览器自动验证,优先检查 DOM 结构和关键 class;截图只在确实需要视觉判断时使用。

后续章节建议流程

  1. 先读原始 slide,列出必须保留的知识点、例题和思考题。
  2. 单独写教师侧草稿:纠错、重排逻辑、确定例子、规划动画。
  3. 写学生版章节骨架:动机、路线图、目标、核心概念、算法、代码、分析、习题答案。
  4. 为每个核心概念设计图形或动画,先保证讲解正确,再追求视觉细节。
  5. 抽象可复用 JS 绘图组件,不在 QMD 中堆 HTML。
  6. 逐页检查是否是学生会看到的讲义语言,删除所有制作痕迹。
  7. 渲染验证,修正溢出、行距、公式间距、代码高亮和资源路径。

逐章制作进度

本节是后续章节制作的唯一进度真源。正式学生版 PPT 中不得出现本节中的制作说明、原始 PPT 批注、纠错说明或内部判断。

全局步骤规则

每一章必须按以下步骤顺序推进,且同一章不得跳步:

  1. 分析并制定教学目标。
  2. 制定详细的动图图解计划。
  3. 生成习题的答案,尽可能包括动图图解。
  4. 生成 PPT。
  5. 校验是否完整覆盖原始 PPT 内容,并在逻辑、代码、动画、算法分析和风格上超过原始 PPT。

执行规则:

  • 任何章节进入下一步之前,必须在本文件中明确记录上一步完成。
  • 不同章节可以并行推进同一类分析任务,但每个章节内部必须严格保持 Step 1 -> Step 2 -> Step 3 -> Step 4 -> Step 5。
  • 原始 PPT 中有用内容必须融合进学生版讲义,但错误定义、过时代码、拼写错误和逻辑跳跃必须修正。
  • 哈希章节已有初版,后续主要任务是把所有动画迁移到标准模板,并做最终覆盖校验。

章节队列

章节 原始文本 当前状态 下一步
第 1 章 绪论 reference-text/chapter1.0_Introduction.md Step 4 基线已生成 Step 5:覆盖与质量校验
第 2 章 算法分析 reference-text/chapter2_AlgorithmAnalysis.md Step 4 基线已生成 Step 5:覆盖与质量校验
第 3.0 章 线性表 reference-text/chapter3.0_List.md Step 4 基线已生成 Step 5:覆盖与质量校验
第 3.1 章 栈和队列 reference-text/chapter3.1_StackQueue.md Step 4 基线已生成 Step 5:覆盖与质量校验
第 4.0 章 树 reference-text/chapter4.0_Tree.md Step 4 基线已生成 Step 5:覆盖与质量校验
第 4.1 章 特殊树 reference-text/chapter4.1_SpecialTree.md, reference-text/chapter4.1_SpecificTrees.md Step 4 基线已生成 Step 5:覆盖与质量校验
第 5 章 散列 reference-text/chapter5_Hashing.md Step 4 初版已存在,迁移未完成 Step 5:覆盖与质量校验
第 6 章 优先队列 reference-text/chapter6_PriorityQueue.md Step 4 基线已生成 Step 5:覆盖与质量校验
并查集 reference-text/chapter7_DisjointSet.md Step 4 基线已生成 Step 5:覆盖与质量校验
排序 reference-text/chapter7_Sorting.md, reference-text/chapter9.0_Sorting.md Step 4 基线已生成 Step 5:覆盖与质量校验
reference-text/chapter8_Graph.md Step 4 基线已生成 Step 5:覆盖与质量校验

第 1 章 绪论

Step 1:分析并制定教学目标

状态:已完成。

完成日期:2026-07-17。

原始文本:reference-text/chapter1.0_Introduction.md,共 88 页。

原始内容覆盖清单:

  • 课程目标与内容:常用数据结构与算法、后续课程先修、算法分析、Java/C++ 回顾。
  • 数据结构动机例子:游戏下一步选择使用树、图书目录管理使用线性表、交通灯/道路冲突使用图。
  • 后续课程联系:编译原理中的栈、操作系统中的队列、数据库中的 B-tree/B+tree。
  • 算法分析入口:排序例子、时间复杂度、空间复杂度、正确性。
  • 数据与数据结构定义:数据、数值/非数值数据、Data_Structure = {D, R}、线性结构与非线性结构。
  • 数据结构的三个层面:逻辑结构、物理结构、相关操作及实现;学生表的逻辑结构、数组/链式存储、插入/删除/查找。
  • 数据类型、ADT 与 OO:数据类型的值集合和操作集合、抽象数据类型、信息隐藏、自然数 ADT、对象、类、继承、消息通信。
  • 算法定义:算法和程序的区别、有限性、确定性、输入/初始动作、终止/输出、选择排序示例。
  • 数学基础:指数、对数、级数、模运算、数学归纳法、反证法。
  • 递归基础:递归定义、终止条件、递归必须推进、直接/间接递归、阶乘、Fibonacci、数组求和、全排列、Hanoi 塔。
  • 泛型与语言基础:Java IntCell、访问控制、构造函数、thisstatic main、对象创建、方法调用。
  • 泛型对象与模板:C++ template、Java 5 前 Object 方案、强制类型转换、包装类、Java 泛型、自动装箱/拆箱。
  • 泛型比较:Comparable、泛型 findMax、接口/约束。
  • 异常处理:语法错误、运行时错误、逻辑错误;error 与 exception;try/catch/finallythrowthrows
  • Java 输入输出:标准输入/输出/错误、BufferedReaderreadLineparseIntStringTokenizer、顺序文件读取。
  • 代码组织:package、DataStructures 包、Overflow / Underflow 异常类。
  • 习题:二进制表示中 1 的个数、字符串全排列、递归求数组最大值和平均值、递归求链表长度、递归判断回文、从 1..n 中取 r 个数组合、Hanoi 塔。

需要修正和现代化的点:

  • 原始英文存在拼写和语法错误,例如 solutingstaptempletememblemeanimgNaturalNunber 等,学生版统一改为准确中文讲义表述。
  • 原始递归代码混用 Java/C++ 风格,部分代码无法编译;学生版代码必须统一、可编译,并明确区分伪代码、C++、Java。
  • 原始 Fibonacci 定义中 fib(0)=0, fib(1)=1,但后续代码对 n==0 返回 1,这是错误;学生版必须修正。
  • 原始算法特征缺少更标准的表述;学生版采用标准定义:输入、输出、确定性、有限性、可行性/有效性。
  • 原始数据结构定义中只给出 {D, R},需要补充“操作集合”视角,避免学生误以为数据结构只有元素和关系。
  • 原始 ADT/OO 讲法较旧,需要强调“接口/行为契约”和“表示隐藏”,并把 ADT 与后续容器实现联系起来。
  • 原始 Java 泛型内容较旧,但仍要覆盖;学生版应以“为什么需要泛型”为主线,兼顾 C++ templates 与 Java generics,而不是堆砌旧代码。
  • 原始异常和 I/O 章节偏 Java 语法复习,学生版需要压缩成“课程代码如何处理错误与输入输出”的工程基础。
  • 原始 B-tree 与 B+tree 在课程介绍中只作为数据库例子出现;后续特殊树章节必须分开讲标准 B-tree 与 B+tree,不能混淆。

本章教学定位:

  • 本章不是简单“课程介绍”,而是建立全课程的三条主线:问题如何抽象为数据对象、关系和操作;算法如何在抽象数据类型上定义、证明和分析;代码如何把抽象落实为可复用、可检查、可处理异常的程序组件。
  • 学生版应以“一个工程问题如何变成数据结构和算法设计”为主线,而不是按原 PPT 的语言知识点顺序平铺。

学生学习目标:

  • 能解释为什么同一个问题会因为数据结构选择不同而得到完全不同的算法思路。
  • 能从真实场景中识别线性表、树、图、队列、栈等结构的影子。
  • 能区分数据、数据对象、关系、操作,并说明为什么数据结构不能只看“存了什么”。
  • 能说明逻辑结构、物理结构和操作实现分别回答什么问题。
  • 能解释 ADT 如何把“使用方式”和“内部表示/实现”分开。
  • 能区分算法与程序,并用输入、输出、确定性、有限性和有效性检查一段描述是否是算法。
  • 能解释为什么复杂度分析要同时考虑时间、空间和正确性。
  • 能说明指数、对数、级数、模运算、归纳法和反证法在后续算法分析中的用途。
  • 能用调用树和调用栈解释递归的 base case、progress 和终止性。
  • 能用递归描述阶乘、Fibonacci、数组求和、全排列和 Hanoi 塔,并比较这些递归结构的差异。
  • 能解释泛型/模板为什么对数据结构课程重要。
  • 能区分 Java Object 泛化、包装类、泛型、Comparable 与 C++ template 的作用和代价。
  • 能区分语法错误、运行时错误、逻辑错误、error、exception、try/catch/finallythrowthrows
  • 能说明课程代码为什么需要清晰的包/模块组织、输入输出边界和异常边界。

面向 PPT 的逻辑重排建议:

  1. 为什么学习数据结构:从游戏、图书目录、交通路口到真实系统。
  2. 数据结构是什么:数据对象、关系、操作;逻辑结构、物理结构、操作实现。
  3. ADT 与算法:把“能做什么”和“怎么做”分开;算法定义与选择排序。
  4. 数学和分析工具:复杂度入口、指数/对数/级数/模运算、证明方法。
  5. 递归作为第一种算法设计范式:base case、progress、调用树、调用栈、典型例子。
  6. 代码工程基础:泛型、比较接口、异常、I/O 与代码组织。

Step 1 结论:

  • 第 1 章应重建为“课程地图 + 抽象建模 + 算法定义 + 递归和代码基础”的开篇章节。
  • 后续 Step 2 需要围绕上述六个单元制定逐帧图解计划,尤其要把原始 PPT 中静态或跳跃的例子改造成可视化过程。

下一步只允许推进 Step 2:制定详细的动图图解计划。

Step 2:制定详细的动图图解计划

状态:已完成。

完成日期:2026-07-17。

全章图解主线:

  • 用一张可跳转课程地图贯穿:真实问题 -> 抽象结构 -> ADT -> 算法 -> 分析 -> 可运行代码。
  • 所有图使用标准白底黑线风格;场景图可以更具象,但最终必须收束到数据结构图。

动图和图解计划:

  • intro-scenario-map:三栏场景映射图。游戏下一步选择逐步展开为树,图书目录逐步整理为线性表,交通路口冲突逐步抽象为图。
  • course-dependency-map:课程依赖图。栈连接编译原理,队列连接操作系统,B/B+tree 连接数据库,图连接网络和路径规划。
  • data-structure-tripleD / R / Ops 分层图。先出现数据对象,再出现关系边,最后出现操作接口。
  • logical-vs-physical:学生表例子。逻辑上线性表,物理上数组与链式存储并排,插入删除操作在两个物理表示上产生不同代价。
  • adt-boundary:ADT 使用者和实现者隔离图。左侧是调用者只看接口,右侧切换数组/链表实现,接口保持不变。
  • algorithm-checklist:算法定义检查器。给出选择排序、操作系统循环两个例子,逐项检查输入、输出、确定性、有限性、有效性。
  • selection-sort-intro:选择排序小数组逐帧比较、更新最小值、交换,为第 2 章复杂度分析铺垫。
  • growth-curves-litenn log nn^2 小规模曲线,展示排序算法增长差异。
  • math-toolbox:指数、对数、级数、模运算、归纳法、反证法作为后续章节工具箱卡片,点击或分帧展开用途。
  • recursion-rules:递归规则动画。base case 高亮,progress 箭头向更小规模移动,bad recursion 展示规模不下降导致无限递归。
  • factorial-call-stack:阶乘调用树与调用栈联动,从 factorial(5) 下探到 base case,再回填返回值。
  • fib-call-tree:Fibonacci 调用树,突出重复子问题,并纠正 fib(0)=0
  • array-sum-recursion:数组求和,数组区间逐步缩短,调用栈累加返回。
  • permutation-treeabc 全排列递归树,swap/restore 动画展示回溯。
  • hanoi:三柱移动动画,先 3 个盘逐帧,再抽象为 move(n-1), move(1), move(n-1)
  • generic-containerIntCell -> MemoryCell<Object> -> GenericMemoryCell<T> 演化图,展示类型安全逐步增强。
  • comparable-findmax:数组扫描找最大,比较接口 compareTo 高亮,说明泛型算法对类型的约束。
  • exception-flow:异常传播图。语句触发异常,沿调用链上传,匹配 catch,finally 总执行。
  • io-pipelineSystem.in -> InputStreamReader -> BufferedReader -> parseInt 数据流图。

代码讲解计划:

  • 代码 1:选择排序 C++17,分段高亮“外层循环”“寻找最小值”“交换”。
  • 代码 2:递归阶乘/Fibonacci/数组求和,强调 base case 和 progress。
  • 代码 3:全排列回溯,逐段高亮 swap、递归、restore。
  • 代码 4:泛型 findMax<T> 与比较器/operator<
  • 代码 5:异常和输入解析示例,保持简短,作为工程边界而非 Java 语法课。

习题图解预留:

  • 二进制 1 的个数:递归除以 2 的调用链。
  • 全排列:复用 permutation-tree
  • 数组最大值和平均值:数组递归缩短图。
  • 链表长度:链表节点递归推进图。
  • 回文:双指针向中间收缩图。
  • 组合问题:选择/不选择递归树。
  • Hanoi:复用 hanoi

Step 2 结论:

  • 第 1 章的动图目标是让学生看到“抽象如何发生”和“递归如何展开/回收”,不追求算法数量,而追求课程心智模型建立。

Step 3:生成习题答案与图解方案

状态:已完成。

完成日期:2026-07-17。

答案方案:

  • 二进制 1 的个数:递归 ones(n)=ones(n/2)+(n%2)ones(0)=0。图解使用除 2 调用链和二进制位回填。
  • 字符串全排列:driver 将字符串转字符数组,递归 permute(a, low, high);每层固定 low 位,遍历交换 low..high,递归后 swap restore。图解复用全排列递归树。
  • 递归求数组最大值:max(a,n)=max(max(a,n-1),a[n-1]),base 为 n=1。图解用数组前缀收缩。
  • 递归求平均值:先递归求和再除以 n;或返回 (sum,count),避免每层重复除法。图解用返回值气泡。
  • 链表长度:len(p)=0 if p==nullptr else 1+len(p->next)。图解逐节点推进。
  • 回文:预处理忽略空格、标点、大小写,递归比较首尾字符;若相等则检查中间区间。图解用双指针收缩。
  • 组合 C(n,r):递归分支“选当前数/不选当前数”;当 r=0 输出组合,当剩余数不足剪枝。图解用二叉选择树。
  • Hanoi:move(n,A,C,B)=move(n-1,A,B,C), A->C, move(n-1,B,C,A);移动次数 2^n-1。图解复用 Hanoi 动画。

答案页要求:

  • 每题给出递归定义、终止条件、推进条件和 C++17 代码。
  • 每题答案至少配一个调用树、指针图或状态变化图。

第 2 章 算法分析

Step 1:分析并制定教学目标

状态:已完成。

完成日期:2026-07-17。

原始文本:reference-text/chapter2_AlgorithmAnalysis.md,共 46 页。

原始内容覆盖清单:

  • 算法分析的定义:程序/算法运行所需的时间和存储空间。
  • 空间复杂度:固定空间、可变空间、输入规模相关空间、环境栈空间、递归栈空间。
  • 时间复杂度:基本操作计数、语句频度、输入规模 n、渐进增长。
  • 排序算法作为复杂度分析载体:选择排序、冒泡排序、名次排序、插入排序。
  • 多个代码片段的逐句计数和总和推导。
  • 最好、最坏、平均情况的初步讨论。
  • 大 O 及常见增长量级。
  • 递归程序的空间和时间分析入口。

需要修正和现代化的点:

  • 原始 PPT 对“算法分析”有时混用程序、算法、运行环境,需要明确区分理论模型和实际机器常数。
  • 原始代码仍以 Java 片段为主,后续学生版主代码应统一为可编译 C++17,并使用伪代码辅助频度分析。
  • 复杂度讲解不能停留在公式堆叠,需要用同一段程序逐步高亮“哪一行执行多少次”。
  • 排序示例应把第 1 章选择排序延续下来,再引入冒泡、插入等作为比较,不要突然跳算法。
  • 需要明确 OΘΩ 的用途和区别,避免学生只把复杂度理解为“大概上界”。
  • 需要补充工程视角:缓存、常数、输入分布、内存分配、递归栈溢出等不会改变渐进阶但会影响实际性能。

本章教学定位:

  • 本章是全课程的“度量工具箱”,目标是让学生能把算法过程转化为可解释的成本模型。
  • 讲解主线应从“同一个问题为什么代码快慢不同”进入,再训练学生从代码、循环、递归和数据规模中读出增长趋势。

学生学习目标:

  • 能区分固定空间、输入空间、辅助空间、递归调用栈空间。
  • 能对一段含顺序、循环、嵌套循环的代码做基本操作计数。
  • 能解释为什么忽略常数和低阶项,同时知道什么时候常数仍然有工程意义。
  • 能使用 OΘΩ 描述上界、紧确界和下界。
  • 能分析选择排序、冒泡排序、插入排序在不同输入下的比较次数和移动次数。
  • 能用递归树或递推式分析简单递归算法的时间和空间。
  • 能识别最好、最坏、平均情况分别回答的问题。
  • 能从复杂度曲线判断不同算法在规模变化时的交叉点。

面向 PPT 的逻辑重排建议:

  1. 从“为什么同样排序代码差很多”开始,展示不同增长曲线。
  2. 建立成本模型:时间、空间、输入规模、基本操作。
  3. 逐句分析顺序和循环代码。
  4. 用选择排序、冒泡排序、插入排序做完整案例。
  5. 引入渐进符号和增长等级。
  6. 讨论递归栈和递推式。
  7. 总结理论复杂度与工程性能的关系。

Step 1 结论:

  • 第 2 章应重建为“复杂度度量与代码成本阅读训练”,每个公式都必须绑定代码高亮或曲线图,不再让学生只背结论。

Step 2:制定详细的动图图解计划

状态:已完成。

完成日期:2026-07-17。

动图和图解计划:

  • complexity-roadmap:从输入规模到运行资源的路线图,分为时间、空间、正确性。
  • statement-counter:代码行频度计数器,左侧代码逐行高亮,右侧累加执行次数。
  • loop-growth:单循环、嵌套循环、三角循环的网格计数图,逐步形成 nn^2n(n-1)/2
  • space-stack:递归调用栈增长图,对比迭代辅助变量和递归栈空间。
  • selection-sort-cost:选择排序逐帧比较次数计数,复用第 1 章选择排序动画但增加计数条。
  • bubble-sort-cost:冒泡排序比较和交换过程,展示最好情况可提前停止,最坏情况移动多。
  • insertion-sort-cost:插入排序在近乎有序与逆序输入下的差异。
  • rank-sort-cost:名次排序的二维比较矩阵,展示每对元素比较一次。
  • asymptotic-curves1, log n, n, n log n, n^2, 2^n 曲线,可切换线性/对数纵轴。
  • notation-compareO/Theta/Omega 三层界限图,使用函数曲线和上下包络。
  • recurrence-tree-lite:简单递归式的递归树,用于引出后续递归算法分析。

代码讲解计划:

  • 同一份 C++17 排序代码包包含 selection、bubble、insertion、rank sort。
  • 每个算法先动画,再高亮完整代码,再展示频度表。

习题图解预留:

  • 循环频度题使用 statement-counter
  • 排序复杂度题使用对应排序动画最终计数。
  • 递归空间题使用 space-stack

Step 2 结论:

  • 本章所有公式都必须由“代码高亮 + 图形计数”推出,禁止直接给复杂度结论。

Step 3:生成习题答案与图解方案

状态:已完成。

完成日期:2026-07-17。

答案方案:

  • selectkth(a,k,n):外层执行 k 次,第 i 次内层比较 n-i-1 次,总比较次数 sum_{i=0}^{k-1}(n-i-1)=kn-k(k+1)/2,交换 k 次,时间复杂度 Theta(kn);当 k=nTheta(n^2)。图解使用三角计数网格,只涂前 k 行。
  • 四个循环题:按原题各循环分别用计数器图解。典型结论:线性循环 Theta(n),倍增循环 Theta(log n),嵌套三角循环 Theta(n^2),含几何增长内层按求和处理。

答案页要求:

  • 所有答案都显示“精确计数 -> 去低阶项 -> 渐进阶”的三段。
  • 用曲线图展示 k 从小到大时 selectkth 从接近线性到二次的变化。

第 3.0 章 线性表

Step 1:分析并制定教学目标

状态:已完成。

完成日期:2026-07-17。

原始文本:reference-text/chapter3.0_List.md,共 78 页。

原始内容覆盖清单:

  • List ADT:线性表的定义、元素序列、位置、插入、删除、查找等操作。
  • 数组实现:连续存储、按下标访问、插入删除导致移动。
  • 链表实现:节点、指针、头节点、单链表插入删除。
  • Java/C++ 风格类定义与 List 操作代码。
  • 游标实现或数组模拟链表的思想。
  • Josephus 问题示例。
  • 多项式表示与加法/乘法接口。
  • 基数排序作为链表/桶应用示例。
  • 习题:列表差集/交集/并集、排序链表操作、上机实习题。

需要修正和现代化的点:

  • 原始章节标题含 List、Stack、Queue,但实际本文件应聚焦线性表,栈队列在 3.1 章独立讲。
  • 原始代码语言不统一,学生版应统一 C++17,使用模板 List<T> 或示例类型,避免 Java/C++ 混排。
  • 必须明确“逻辑相邻”和“物理相邻”的区别,这是数组表和链表的核心。
  • 插入删除不能只给代码,应逐帧展示指针/元素移动顺序,尤其是链表插入时先连新节点再断旧边。
  • 多项式例子需要解释为什么按指数有序存储,如何合并同类项。
  • Josephus 和基数排序应作为“线性结构应用”,不要抢走线性表基础操作主线。

本章教学定位:

  • 本章是从 ADT 到具体存储表示的第一章,核心问题是“同一个线性表接口,为什么数组和链表的代价不同”。

学生学习目标:

  • 能描述线性表 ADT 的核心操作及其语义。
  • 能区分顺序表和链表在访问、插入、删除、空间局部性上的代价。
  • 能画出数组插入删除的元素移动过程。
  • 能画出单链表查找、插入、删除的指针变化顺序。
  • 能解释头节点、空表、尾插、按值删除等边界情况。
  • 能用线性表表示多项式并执行有序合并。
  • 能解释 Josephus 问题为什么适合用循环链表建模。
  • 能比较数组实现和链式实现在工程中的适用场景。

面向 PPT 的逻辑重排建议:

  1. 从“学生名单/播放列表/浏览记录”引入线性序列。
  2. 定义 List ADT。
  3. 顺序表:地址计算、访问、插入、删除。
  4. 单链表:节点、头指针、查找、插入、删除。
  5. 顺序表 vs 链表多维度分析。
  6. 应用:Josephus、多项式、基数排序桶。
  7. 代码:同一接口的两种实现。
  8. 习题和答案。

Step 1 结论:

  • 第 3.0 章应重建为“线性 ADT 的两种物理实现对比”,图解重点是数组移动和链表指针重连。

Step 2:制定详细的动图图解计划

状态:已完成。

完成日期:2026-07-17。

动图和图解计划:

  • list-roadmap:线性表 ADT -> 顺序表 -> 链表 -> 应用的路线图。
  • list-adt-contract:接口卡片,逐步出现 size/get/insert/remove/find
  • array-list-access:连续数组和下标访问,展示地址计算。
  • array-list-insert:在中间插入元素,右侧元素从后向前移动,目标空位出现后放入新值。
  • array-list-delete:删除元素,右侧元素左移,最后 size 减一。
  • linked-list-node:节点由数据域和指针域组成。
  • linked-list-search:current 指针逐节点移动。
  • linked-list-insert:新节点先孤立出现,再连 new.next,再改 prev.next,强调顺序。
  • linked-list-delete:先定位前驱,再跨过目标节点,最后释放/移除目标。
  • array-vs-linked:多维比较卡片:访问、插入、删除、空间局部性、额外指针。
  • josephus-circle:循环链表报数出列动画。
  • polynomial-list:多项式项按指数排序,两个链表 merge 合并同类项。
  • radix-bucket-list:基数排序桶分配和收集作为扩展图。

代码讲解计划:

  • List<T> ADT 接口。
  • ArrayList<T> 插入/删除。
  • SinglyLinkedList<T> 查找/插入/删除。
  • 多项式 add 作为应用代码。

习题图解预留:

  • 有序链表交并差:双指针合并图。
  • Josephus:复用圆环动画。
  • 多项式加法:复用多项式链表合并图。

Step 2 结论:

  • 本章动画必须严格表现“移动元素”和“改指针”的先后顺序,避免学生误以为链表插入删除是一次性发生。

Step 3:生成习题答案与图解方案

状态:已完成。

完成日期:2026-07-17。

答案方案:

  • 单链表交换相邻结点:给定 prev -> x -> y -> next,依次设置 x->next = y->nexty->next = xprev->next = y。若交换头两个结点,使用哨兵头结点统一处理。
  • 双链表交换相邻结点:同步维护 prev/next 四条边,建议用局部节点 a,b 和左右邻居 L,R,最终 L<->b<->a<->R。图解必须显示旧边何时消失。
  • 两个有序表交集:双指针扫描;相等输出并双进,小者前进。复杂度 O(m+n)
  • 两个有序表并集:双指针扫描;相等输出一次并双进,小者输出并前进。复杂度 O(m+n)
  • 非递归反转单链表:prev=null, cur=head,循环保存 next=cur->next,改 cur->next=prev,推进三指针。图解显示三指针滑动。
  • 多项式相加:按指数降序双指针合并;同指数系数相加,结果为 0 则不生成项。
  • Josephus:数组实现用 visited 或循环下标,链表实现用循环链表删除第 m 个;答案图用圆环出列序列。

答案页要求:

  • 所有链表题用指针图,不用纯文字。
  • 有序表集合运算用双指针动画,底部显示当前比较。

第 3.1 章 栈和队列

Step 1:分析并制定教学目标

状态:已完成。

完成日期:2026-07-17。

原始文本:reference-text/chapter3.1_StackQueue.md,共 61 页。

原始内容覆盖清单:

  • Stack ADT:后进先出,CreateIsEmptyIsFullTopAdd/PushDelete/Pop
  • 栈的链表实现与数组实现。
  • 多栈共享空间问题。
  • 栈应用:表达式求值、递归过程、括号匹配等。
  • Queue ADT:先进先出,入队、出队、队首。
  • 队列的数组实现、循环队列、链表实现。
  • 队列应用:操作系统作业调度、算法设计。
  • 代码骨架和操作片段。

需要修正和现代化的点:

  • 原始术语 Add/Delete 不如 push/popenqueue/dequeue 清晰;学生版保留 ADT 对照,但主讲标准术语。
  • 栈和队列必须和线性表联系起来:它们是受限线性表,不是全新结构。
  • 循环队列最容易出错,需要明确空/满判定、保留一个空位或维护 size 两种方案。
  • 栈数组实现中 topOfStack 的变化必须逐帧展示,避免学生只背 ++toptop--
  • 表达式求值和递归调用栈应作为重点动图,而不是只列应用。

本章教学定位:

  • 本章强调“限制操作带来更强语义”,让学生看到栈和队列虽然简单,却是编译器、操作系统、图算法和递归执行的基础。

学生学习目标:

  • 能说明栈和队列作为受限线性表的操作规则。
  • 能实现数组栈、链式栈、循环队列和链式队列。
  • 能解释栈上溢、下溢、队列假溢出、循环队列空满判定。
  • 能用栈模拟函数调用和递归返回。
  • 能用栈完成括号匹配或表达式求值的核心过程。
  • 能用队列解释 BFS 或作业调度中的先进先出语义。
  • 能比较数组实现和链表实现的空间、时间和边界处理。

面向 PPT 的逻辑重排建议:

  1. 从浏览器后退/撤销操作引入栈,从排队和任务调度引入队列。
  2. 栈 ADT 与两种实现。
  3. 栈应用:括号匹配、表达式求值、递归调用栈。
  4. 队列 ADT 与链式实现。
  5. 循环队列:空满判定和指针绕回。
  6. 栈队列多维度对比与工程应用。
  7. 代码和习题答案。

Step 1 结论:

  • 第 3.1 章应重建为“受限线性表与执行过程建模”,动图重点是栈顶/队首队尾指针和应用过程。

Step 2:制定详细的动图图解计划

状态:已完成。

完成日期:2026-07-17。

动图和图解计划:

  • stack-queue-roadmap:受限线性表路线图,List -> Stack/Queue/Deque。
  • array-stack-push-pop:数组栈 push/pop,top 指针逐步变化。
  • linked-stack-push-pop:链式栈头插/头删。
  • multi-stack-space:多个栈共享数组空间的静态对比图。
  • paren-match:括号匹配,输入流、栈和错误位置联动。
  • expression-eval:中缀/后缀表达式求值,操作数栈和运算符栈。
  • call-stack:函数调用栈,与第 1 章递归栈复用。
  • queue-linked:链式队列 enqueue/dequeue,front/rear 指针变化。
  • circular-queue:循环队列数组,front/rear 绕回,空/满判定对比。
  • queue-scheduler:作业调度队列,展示 FIFO 语义。

代码讲解计划:

  • Stack<T> 接口与数组实现。
  • Stack<T> 链式实现。
  • CircularQueue<T>,重点讲 front/rear/size
  • 括号匹配示例。

习题图解预留:

  • 栈操作序列:复用数组栈动画。
  • 循环队列状态题:复用 circular queue。
  • 表达式求值:复用 expression eval。

Step 2 结论:

  • 本章图解重点是“受限端点”和“指针状态”,所有栈队列动画必须固定显示 top/front/rear。

Step 3:生成习题答案与图解方案

状态:已完成。

完成日期:2026-07-17。

答案方案:

  • 栈出栈序列选择题:用进栈/出栈状态搜索树验证候选序列,并加入“不允许连续三次出栈”的约束;答案页展示每个候选是否可达和失败原因。
  • 中缀转后缀并求值:使用运算符栈和输出流;若要一趟完成,可在生成后缀 token 时同步用值栈求值,或使用双栈直接求值。图解展示 token 流、运算符栈和值栈。
  • 打印缓冲区逻辑结构:队列,原因是主机写入顺序与打印取出顺序保持 FIFO。
  • 栈 S 到队列 Q 的容量题:按目标出队序列反推栈操作,记录最大栈深即最小容量;图解用栈和队列联动。
  • 带头尾结点的单链表在位置前插入/删除:仅给定单向 iterator 到 p 时,严格 O(1) 前插通常需要复制/搬移数据技巧或持有前驱;答案必须说明模型假设。若不能改数据,只给 p 无法 O(1) 前插。
  • 循环队列:若有 rearlength,队首位置为 (rear - length + 1 + m) % m;空条件 length==0,满条件 length==m;入队更新 rear=(rear+1)%m,length++,出队更新 front=(rear-length+1+m)%m 后取出并 length--

答案页要求:

  • 栈队列题必须用状态机或操作序列图。
  • 循环队列答案必须固定画环形数组,不只给公式。

第 4.0 章 树

Step 1:分析并制定教学目标

状态:已完成。

完成日期:2026-07-17。

原始文本:reference-text/chapter4.0_Tree.md,共 124 页。

原始内容覆盖清单:

  • 树的定义、根、子树、结点、父子、兄弟、度、层次、深度/高度。
  • 树与线性结构、图的关系。
  • 二叉树定义及其与普通树的区别。
  • 二叉树性质:结点数、高度、叶子数、分支数等。
  • 满二叉树、完全二叉树定义。
  • 完全二叉树的数组编号与父子关系。
  • 二叉树表示:数组表示、链式表示。
  • 二叉树遍历:前序、中序、后序、层序。
  • 递归遍历和非递归遍历。
  • 线索二叉树或相关扩展内容。
  • 树、森林与二叉树转换。
  • 习题和操作练习。

需要修正和现代化的点:

  • 原始高度/深度定义容易混乱;学生版必须固定约定:根深度为 0,高度按边数或层数需明确。
  • 满二叉树、完全二叉树、完美二叉树在中文教材中术语容易混用,必须给出清晰定义和图。
  • 普通树和二叉树的“有序性”差异必须用图比较。
  • 二叉树性质必须配合归纳证明或图形计数,不要只贴公式。
  • 遍历必须用边上访问/回溯箭头展示,否则学生难以区分三种 DFS 遍历。

本章教学定位:

  • 本章是从线性结构进入层级结构的关键转折,重点是让学生把“递归结构”看成数据结构本身的一部分。

学生学习目标:

  • 能准确使用树的基本术语。
  • 能区分普通树、二叉树、满二叉树、完全二叉树。
  • 能用编号关系解释完全二叉树数组表示。
  • 能画出二叉链表表示并解释左右孩子指针。
  • 能手动执行前序、中序、后序、层序遍历。
  • 能解释遍历递归代码和调用栈的对应关系。
  • 能进行树、森林和二叉树的基本转换。
  • 能用二叉树性质分析结点数、高度和空间表示代价。

面向 PPT 的逻辑重排建议:

  1. 从文件系统/组织结构/语法树引入树。
  2. 树的术语和层级关系。
  3. 二叉树定义与普通树对比。
  4. 二叉树性质和特殊二叉树。
  5. 存储表示:数组与链式。
  6. 遍历:递归视角、非递归视角、层序队列。
  7. 树森林转换。
  8. 习题答案。

Step 1 结论:

  • 第 4.0 章应重建为“层级结构与递归遍历”,动图重点是树的遍历过程、数组编号关系和存储表示转换。

Step 2:制定详细的动图图解计划

状态:已完成。

完成日期:2026-07-17。

动图和图解计划:

  • tree-roadmap:树术语 -> 二叉树 -> 性质 -> 表示 -> 遍历 -> 转换。
  • tree-terminology:根、父子、兄弟、叶子、度、层次、深度、高度逐一高亮。
  • tree-vs-binary:普通树与二叉树对比,强调二叉树左右子树有序。
  • binary-tree-properties:用节点计数和边计数演示叶子数、分支数、高度上界。
  • full-complete-perfect:满/完全/完美二叉树定义对比图,固定术语。
  • complete-tree-array:完全二叉树数组编号,父子下标公式联动。
  • binary-linked-representation:二叉链表节点 data,left,right
  • preorder-traversal:边上访问箭头,节点访问序列实时追加。
  • inorder-traversal:左-根-右过程,回溯箭头显示。
  • postorder-traversal:左右子树完成后访问根。
  • level-order:队列和树联动。
  • recursive-vs-iterative:递归栈与显式栈对比。
  • tree-forest-conversion:左孩子右兄弟转换。

代码讲解计划:

  • 二叉树节点结构。
  • 三种递归遍历同一代码框架。
  • 层序遍历队列实现。
  • 树森林转换伪代码。

习题图解预留:

  • 给树求遍历序列:复用 traversal 组件。
  • 完全二叉树下标题:复用 array numbering。
  • 树森林转换:复用 conversion 动画。

Step 2 结论:

  • 树章节必须用同一棵树贯穿前中后序和层序遍历,减少学生在不同例子间切换成本。

Step 3:生成习题答案与图解方案

状态:已完成。

完成日期:2026-07-17。

答案方案:

  • 后缀表达式构造表达式树:扫描 token,操作数入栈;遇到一元/二元运算符弹出子树并建新根。图解展示栈中树节点变化。
  • 已知先序和中序构造二叉树:先序首元素为根,在中序中分割左右子树,递归构造。图解用区间切分。
  • 建立二叉树并输出前中后序:答案给 C++17 节点结构和递归遍历,配同一棵树三种访问序列。
  • 广义表表示建立树:解析括号层级,原子生成节点,子表递归生成孩子链。图解用解析栈。

答案页要求:

  • 构树题必须显示“序列区间”或“栈内容”变化。
  • 遍历题答案同时给最终序列和访问过程。

第 4.1 章 特殊树

Step 1:分析并制定教学目标

状态:已完成。

完成日期:2026-07-17。

原始文本:reference-text/chapter4.1_SpecialTree.mdreference-text/chapter4.1_SpecificTrees.md

原始内容覆盖清单:

  • 二叉搜索树定义、查找、最小/最大、插入、删除。
  • indexed binary search tree 与 leftSize 字段。
  • BST 高度对查找、插入、删除复杂度的影响。
  • AVL 树概念、平衡因子、四种旋转。
  • B-tree 与 B+tree 相关内容。
  • 多路搜索树、数据库索引场景。
  • 代码骨架和操作片段。

需要修正和现代化的点:

  • 必须明确 BST 的重复 key 策略:不允许、计数、或固定放左/右,不能含糊。
  • BST 删除的三种情况必须逐帧讲清:叶子、单孩子、双孩子替换。
  • AVL 旋转必须按 LL、RR、LR、RL 标准定义展示,并确保旋转方向正确。
  • 原始 PPT 中 B-tree、B+tree 和 m-way tree 定义存在混淆风险,学生版必须分开讲:
    • m-way search tree:每个结点最多 m 个孩子,键分隔子树范围。
    • B-tree:所有叶子同层、非根结点关键字数有上下界、数据可在内部结点。
    • B+tree:数据记录或记录指针只在叶子,内部结点只索引,叶子链表支持范围查询。
  • B-tree/B+tree 阶、关键字数、孩子数的定义要选择一种标准并全章一致。

本章教学定位:

  • 本章是“为了查找效率而维护结构约束”的章节:BST 利用顺序性,AVL 利用高度平衡,B/B+tree 利用多路结点降低外存访问。

学生学习目标:

  • 能执行 BST 查找、插入、删除,并解释复杂度取决于高度。
  • 能解释为什么有序插入会把 BST 退化为链表。
  • 能计算 AVL 平衡因子,并判断 LL、RR、LR、RL 类型。
  • 能逐步执行 AVL 旋转,保持中序序列不变。
  • 能解释 m-way search tree、B-tree、B+tree 的区别。
  • 能说明 B+tree 为什么适合数据库和文件系统范围查询。
  • 能比较 BST、AVL、B-tree、B+tree 的适用场景和代价。

面向 PPT 的逻辑重排建议:

  1. 从有序数据查找引入 BST。
  2. BST 查找、插入、删除。
  3. 退化问题与高度分析。
  4. AVL 平衡因子和旋转。
  5. 多路查找树。
  6. B-tree 标准定义和插入/分裂。
  7. B+tree 标准定义、叶子链表和范围查询。
  8. 多维度对比和习题答案。

Step 1 结论:

  • 第 4.1 章必须拆清 BST、AVL、B-tree、B+tree 的边界,尤其纠正 B-tree/B+tree 混淆问题。

Step 2:制定详细的动图图解计划

状态:已完成。

完成日期:2026-07-17。

动图和图解计划:

  • search-tree-roadmap:BST -> AVL -> m-way -> B-tree -> B+tree。
  • bst-search:从根开始比较 key,路径高亮,失败位置显示插入点。
  • bst-insert:逐步查找插入位置,再放入新节点。
  • bst-delete-leaf:删除叶子。
  • bst-delete-one-child:子树接替父边。
  • bst-delete-two-children:用后继/前驱替换,再删除后继/前驱原节点。
  • bst-degeneration:有序插入导致链状退化,高度曲线随插入增长。
  • indexed-bstleftSize 字段与按排名查找联动。
  • avl-insert-path:插入路径、回溯检查平衡因子。
  • avl-rotations:LL/RR/LR/RL 四类,使用标准模板的渐变移动。
  • mway-search-tree:多关键字节点划分区间。
  • btree-insert-split:B-tree 插入、结点满、分裂、中间 key 上升。
  • btree-delete-brief:删除只做概念图,详细程度按课时控制。
  • bplus-range-query:B+tree 内部索引导航到叶子,叶子链表范围扫描。
  • btree-vs-bplus:内部结点是否存数据、叶子链、范围查询对比。

代码讲解计划:

  • BST 节点和查找/插入/删除。
  • AVL 高度更新和旋转函数。
  • B-tree/B+tree 只给核心伪代码和结构定义,避免篇幅爆炸。

习题图解预留:

  • BST 插入删除:复用 BST 动画。
  • AVL 插入旋转:复用 AVL 模板。
  • B-tree 插入分裂:复用 B-tree split 动画。
  • B+tree 范围查询:复用叶子链扫描图。

Step 2 结论:

  • 特殊树章节的动画必须把“保持有序”和“控制高度/外存访问”作为统一解释线索。

Step 3:生成习题答案与图解方案

状态:已完成。

完成日期:2026-07-17。

答案方案:

  • BST 插入 3,1,4,6,9,2,5,7:逐个插入,最终根 3,左子 1,1 的右子 2,右子 4,4 的右子 6,6 左子 5,右子 9,9 左子 7;删除根 3 时可用后继 4 替换,再删除原 4。
  • IndexBST 查找第 k 小:令 rank = leftSize;若 k==rank 返回当前,k<rank 去左子树,k>rank 去右子树查 k-rank
  • AVL 插入 {16,3,7,11,9,28,18,14,15}:答案页逐次展示平衡因子和旋转类型;生成 PPT 时用 AVL 模板自动列所有中间树。
  • 检测 BST:递归传递合法区间 (low, high),每个节点必须满足 low < key < high,比单纯比较父子更正确。
  • 二分搜索判定树:有序表 14 个元素,按中点递归建判定树;成功 ASL 为所有节点深度加 1 的平均值,答案页用判定树标层求和。
  • 路径划分 S1,S2,S3 命题:不总有对任意 a in S1, b in S2, c in S3 满足 a<=b<=c,需根据路径节点和左右分支具体位置判断;答案用反例树说明。
  • 字符串 AVL 插入 DEC,FEB,NOV,OCT,JUL,SEP,AUG,APR,MAR,MAY,JUN,JAN:逐步插入并标 LL/RR/LR/RL。
  • AVL 最少节点数:N(h)=N(h-1)+N(h-2)+1N(0)=1,N(1)=2;最大高度为满足该递推的最大 h,最小高度约为完全树高度 ceil(log2(n+1))-1

答案页要求:

  • BST/AVL 答案必须用树动画,不用括号文本代替。
  • B-tree/B+tree 若有补充题,必须在答案中先声明采用的阶定义。

第 5 章 散列

Step 1:分析并制定教学目标

状态:已完成。

完成日期:2026-07-17。

原始文本:reference-text/chapter5_Hashing.md,共 44 页。当前已有 chapters/05-hashing.qmd 初版,后续不从零重写,但要迁移到标准模板组件。

原始内容覆盖清单:

  • 散列的基本思想:Address = hash(key),目标是平均常数时间查找。
  • 散列函数、散列表、桶、关键字、装载因子。
  • 取余法、质数表长、平方取中法、字符串散列。
  • 碰撞处理:开放寻址、线性探测、二次探测、双散列。
  • ASL、聚集问题、删除墓碑。
  • 再散列。
  • 分离链接法。
  • C++/Java 代码片段和习题。

需要修正和现代化的点:

  • 现有章节内容逻辑基本可用,但旧 hash-demo.js 动画需要逐步迁移到 course-viz.js 标准组件。
  • 所有开放寻址桶示意图应统一使用连续表格,不使用分离圆角块。
  • 所有探测过程必须逐桶推进,显示当前公式变量和探测序号。
  • Cuckoo、链式哈希等模板页已经沉淀出更好的动画语义,应反向更新正式哈希章节。
  • 原始双散列表长和步长不互质示例要明确指出问题。

本章教学定位:

  • 本章讲“用函数把查找位置直接算出来”,核心冲突是速度、空间、碰撞概率和工程鲁棒性之间的权衡。

学生学习目标:

  • 能解释散列为什么平均可达到常数时间。
  • 能评价散列函数的均匀性、确定性、速度和抗模式能力。
  • 能执行线性探测、二次探测、双散列和分离链接的插入/查找/删除。
  • 能解释装载因子、ASL、聚集和再散列。
  • 能说明开放寻址和分离链接的工程取舍。
  • 能识别双散列步长与表长不互质导致的问题。

Step 1 结论:

  • 第 5 章后续重点不是内容重建,而是动画和代码迁移:用标准 course-viz 组件替换旧版散乱动画,并做完整覆盖校验。

Step 2:制定详细的动图图解计划

状态:已完成。

完成日期:2026-07-17。

动图和图解计划:

  • hash-roadmap:函数映射 -> 碰撞 -> 开放寻址 -> 链式 -> 再散列 -> 工程权衡。
  • search-comparison:顺序/二分/散列查找,迁移到标准数组和哈希表组件。
  • hash-basic-process:基本插入和查找,展示 hash(key)mod m、bucket。
  • mod-hash:取余法和碰撞。
  • collision-probability:20 桶扔球 + 500 次 G2 统计图。
  • prime-vs-composite:质数/合数表长分布对比。
  • middle-square:竖式/二进制对齐计算。
  • string-hash:简单求和 vs 多项式滚动。
  • linear-probing:7 桶逐步探测。
  • clustering:线性探测聚集扩张。
  • tombstone-delete:删除不能清空,墓碑保持探测链。
  • quadratic-probingh+i^2 中间变量。
  • double-hashingh1h2、互质步长。
  • rehash:旧表装载过高到新表的静态迁移图。
  • separate-chaining:链式哈希头插/查找/删除。
  • cuckoo24:仅作为扩展或前沿页,使用模板页当前标准动画。

代码讲解计划:

  • 所有开放寻址代码迁移为同一份 C++17 OpenAddressHashTable
  • 再探测策略用 policy 或枚举实现:linear、quadratic、double hashing。
  • 链式哈希用 std::vector<std::list<Entry>> 或自写节点,和动画语义一致。
  • 代码高亮使用锚点脚本,不硬编码行号。

习题图解预留:

  • 原题所有插入过程使用同一哈希表组件绘制答案。
  • 双散列原题若步长不互质,答案图明确展示无法覆盖全表。

Step 2 结论:

  • 哈希章节 Step 2 是迁移计划,不新发明视觉;目标是把 05-hashing.qmd 中旧动画全部换成 course-viz 标准组件。

Step 3:生成习题答案与图解方案

状态:已完成。

完成日期:2026-07-17。

答案方案:

  • 题 1 输入 {4371,1323,6173,4199,4344,9679,1989}h(x)=x mod 10
    • 分离链接:bucket 1: 4371;bucket 3: 1323 -> 6173;bucket 4: 4344;bucket 9: 4199 -> 9679 -> 1989。
    • 线性探测表长 10:1:4371, 3:1323, 4:6173, 5:4344, 6:4199, 7:9679, 9:1989。
    • 二次探测若按 h+i^2 mod 10,由于表长 10 非质数且探测序列覆盖不足,可能无法插入所有冲突 key;答案必须展示失败路径并说明原题设计不良。
    • 双散列 h2=7-(x mod 7) 配表长 10 时部分步长与 10 不互质,不能保证覆盖全表;答案图展示具体探测路径并提示约束。
  • 题 2 表长 13,线性开放地址插入 12,23,45,57,20,03,78,31,15,36
    • 最终表:0:78, 1:57, 2:15, 3:3, 4:36, 6:45, 7:20, 10:23, 11:31, 12:12,其余空。
    • 成功 ASL 按每个 key 插入/查找探测次数平均:(1+1+1+2+1+1+1+5+2+1)/10 = 1.6
    • 链式散列:bucket 12:12;10:23,36;6:45;5:57;7:20;3:03;0:78;2:15;其余空。若按头插,链顺序反向展示。

答案页要求:

  • 所有答案用标准哈希表组件画过程和最终表。
  • 对原题中不满足双散列/二次探测良好条件的地方,学生版要明确指出,而不是强行给错误表。

第 6 章 优先队列

Step 1:分析并制定教学目标

状态:已完成。

完成日期:2026-07-17。

原始文本:reference-text/chapter6_PriorityQueue.md,共 39 页。

原始内容覆盖清单:

  • 优先队列定义:最小优先队列、最大优先队列。
  • MaxPriorityQueue ADT:创建、大小、插入、删除最大/最小。
  • 堆定义:完全二叉树、最大堆、最小堆。
  • 堆的数组表示。
  • MaxHeap 类成员:数组、容量、当前大小。
  • 插入:上滤/percolate up。
  • 删除最大:下滤/percolate down。
  • 建堆/buildHeap。
  • Java MinHeap/BinaryHeap 片段。

需要修正和现代化的点:

  • 优先队列 ADT 与堆实现要分清:堆只是实现方式之一。
  • 堆的数组采用 1-based 还是 0-based 必须全章一致;课堂可用 1-based 便于父子公式,代码若用 C++ vector 可说明选择。
  • 插入和删除必须同时展示树视图和数组视图联动。
  • DeleteMax 的最后元素下滤过程必须逐步比较左右孩子,不能直接跳到结果。
  • buildHeap 应补充 Floyd 自底向上建堆及 O(n) 分析。

本章教学定位:

  • 本章讲“只关心当前最值”的抽象,说明为什么不需要完全排序也能高效支持调度、事件模拟和图算法。

学生学习目标:

  • 能定义优先队列 ADT,并区分最小/最大优先队列。
  • 能判断一个完全二叉树数组是否满足堆序性。
  • 能执行堆插入的上滤过程。
  • 能执行删除堆顶的下滤过程。
  • 能解释堆操作为什么是 O(log n)
  • 能解释自底向上建堆为什么是 O(n)
  • 能说明堆排序和优先队列的关系。

面向 PPT 的逻辑重排建议:

  1. 从任务调度、医院分诊、Dijkstra 引入优先级。
  2. Priority Queue ADT。
  3. 为什么普通数组/链表不够。
  4. 堆:完全二叉树 + 堆序性。
  5. 数组和树联动表示。
  6. 插入上滤。
  7. 删除堆顶下滤。
  8. 建堆与复杂度。
  9. 应用和习题答案。

Step 1 结论:

  • 第 6 章应以“树数组联动”为核心视觉语言,所有堆操作都必须同步展示数组下标和树节点移动。

Step 2:制定详细的动图图解计划

状态:已完成。

完成日期:2026-07-17。

动图和图解计划:

  • pq-roadmap:优先级抽象 -> 堆实现 -> 插入 -> 删除 -> 建堆 -> 应用。
  • pq-adt:普通队列与优先队列对比。
  • heap-shape-order:完全二叉树性质和堆序性分开高亮。
  • heap-array-link:树节点与数组下标联动,高亮父子公式。
  • heap-insert:新元素放末尾,上滤逐步交换。
  • heap-delete-max:堆顶删除,末尾元素移到根,下滤比较左右孩子。
  • build-heap:从最后一个非叶子结点开始自底向上下滤。
  • heap-sort:可作为排序章节复用,删除最大并放到数组末尾。
  • pq-applications:任务调度和 Dijkstra frontier 概念图。

代码讲解计划:

  • BinaryHeap<T, Compare> C++17。
  • pushpoptopbuildHeap 分段高亮。
  • main 中测试 max-heap 和 min-heap。

习题图解预留:

  • 给定数组建堆:复用 build-heap。
  • 插入/删除序列:复用 heap-insert/delete。

Step 2 结论:

  • 优先队列章节所有堆动画必须双视图联动,树图负责直觉,数组图负责实现。

Step 3:生成习题答案与图解方案

状态:已完成。

完成日期:2026-07-17。

答案方案:

  • 逐个插入 10,12,1,14,6,5,8,15,3,9,7,4,11,13,2 到二叉堆:答案用 heap-insert 动画逐步生成,不手写大表。
  • 线性建堆:从同一数组最后一个非叶结点开始下滤,答案用 build-heap 动画展示每个下滤根。
  • 三次 deleteMin:每次删除根、末尾补根、下滤,答案用 delete-min 动画。
  • 判断序列是否为堆:逐个父节点检查孩子;不是堆的序列用 buildHeap 调整。答案图在违反处用红色标出。
  • 堆排序 {12,2,16,30,28,10,16*,20,6,18}:先建最大堆,再每轮交换根和末尾、缩小堆、下滤;稳定性用 1616* 展示。

答案页要求:

  • 所有堆题同时显示数组下标和树结构。
  • 判断堆题先显示第一个违反堆序的位置,再给调整过程。

并查集

Step 1:分析并制定教学目标

状态:已完成。

完成日期:2026-07-17。

原始文本:reference-text/chapter7_DisjointSet.md,共 22 页。

原始内容覆盖清单:

  • 等价关系与等价类。
  • Disjoint Set ADT:FindUnion
  • 用树表示集合。
  • 简单 union-find 的最坏情况。
  • 按重量/大小合并。
  • 按高度/rank 合并。
  • 路径压缩。
  • 多次 union/find 的复杂度讨论。

需要修正和现代化的点:

  • Union(i, j) 应明确参数是否是元素还是根;课堂和代码必须统一。
  • parent 数组中负数表示大小/高度的约定要讲清楚,否则代码难读。
  • 路径压缩必须逐帧展示 Find(x) 沿路径上溯再回写父指针。
  • 复杂度应现代化说明:按秩合并 + 路径压缩的摊还复杂度接近常数 O(alpha(n))

本章教学定位:

  • 本章讲“动态维护连通分量”,是图算法、网络连通性、Kruskal 最小生成树的基础。

学生学习目标:

  • 能把等价关系划分为互不相交集合。
  • 能用森林和 parent 数组表示并查集。
  • 能执行 FindUnion
  • 能解释简单合并为何会退化。
  • 能执行按大小/按秩合并。
  • 能画出路径压缩前后的父指针变化。
  • 能说明并查集在 Kruskal 和连通性查询中的作用。

面向 PPT 的逻辑重排建议:

  1. 从社交网络连通性/岛屿合并引入。
  2. 等价关系和集合划分。
  3. parent 数组与森林。
  4. 简单 union/find。
  5. 退化问题。
  6. 按大小/按秩合并。
  7. 路径压缩。
  8. 摊还复杂度和应用。

Step 1 结论:

  • 并查集章节应以“森林 + parent 数组联动”为核心动画,突出每个优化如何降低树高。

Step 2:制定详细的动图图解计划

状态:已完成。

完成日期:2026-07-17。

动图和图解计划:

  • dsu-roadmap:等价关系 -> 集合森林 -> union/find -> 优化 -> 应用。
  • equivalence-classes:关系边逐步生成连通分组。
  • parent-array-forest:森林节点和 parent 数组联动。
  • find-simple:从节点沿父指针到根。
  • union-simple:根接到另一个根。
  • worst-chain:连续错误 union 形成长链。
  • union-by-size:按大小合并,根中负数 size 更新。
  • union-by-rank:按高度/rank 合并,rank 相等时增加。
  • path-compression:Find 回溯时路径上节点直接连根。
  • kruskal-preview:边排序后用并查集判断是否成环,为图章铺垫。

代码讲解计划:

  • DisjointSet C++17,包含 finduniteBySizeuniteByRank
  • find 先展示无压缩版本,再展示路径压缩版本。

习题图解预留:

  • union/find 操作序列:森林 + parent 数组逐步更新。
  • Kruskal 成环判断:复用 preview。

Step 2 结论:

  • 并查集动画必须坚持双视图:森林解释结构,parent 数组解释实现。

Step 3:生成习题答案与图解方案

状态:已完成。

完成日期:2026-07-17。

答案方案:

  • 原始并查集章节没有清晰独立习题;学生版补充操作序列题:
    • 给定 Union(1,5), Union(2,1), Union(3,2), Union(4,3), Find(5),分别用普通 union、按大小合并、路径压缩画结果。
    • 给定若干无向边,使用并查集判断是否形成环。
  • 答案统一用森林 + parent 数组联动图,显示每次 Find 的路径和压缩回写。

答案页要求:

  • 明确 Union 参数是元素还是根;学生版采用 unite(x,y) 内部调用 find
  • parent 数组负数含义在答案图旁固定显示。

排序

Step 1:分析并制定教学目标

状态:已完成。

完成日期:2026-07-17。

原始文本:reference-text/chapter7_Sorting.mdreference-text/chapter9.0_Sorting.md,内容高度重叠。

原始内容覆盖清单:

  • 排序基本概念、稳定性、内部/外部排序。
  • 插入排序、折半插入排序、希尔排序。
  • 冒泡排序、快速排序。
  • 选择排序、堆排序。
  • 归并排序。
  • 多种 C++ template 和 Java Comparable 代码。
  • 排序算法比较表:时间、空间、稳定性。
  • 习题。

需要修正和现代化的点:

  • 原始 chapter7_Sortingchapter9.0_Sorting 重复,学生版应合并为一个排序章节。
  • 需要统一排序术语:稳定性、原地排序、比较排序、适应性。
  • 快速排序必须讲 pivot 选择、partition 不变量、最坏情况与随机化/三数取中。
  • 希尔排序增量序列不能只给代码,要解释为什么先粗排再细排。
  • 堆排序应和优先队列章节复用堆视图。
  • 归并排序应展示分治递归树和 merge 过程。
  • 算法比较表不能太挤,应拆成多维分析卡片。

本章教学定位:

  • 排序章节是算法设计范式的集中展示:增量构造、交换、选择、分治、堆结构和工程优化。

学生学习目标:

  • 能解释稳定性、原地性、比较次数、移动次数。
  • 能手动执行插入、冒泡、选择、希尔、快速、堆、归并排序。
  • 能说明每种算法的不变量。
  • 能分析最好/平均/最坏时间复杂度和空间复杂度。
  • 能判断某个应用场景应选择哪类排序。
  • 能解释快速排序最坏情况和归并排序额外空间代价。
  • 能比较稳定排序和不稳定排序的影响。

面向 PPT 的逻辑重排建议:

  1. 从真实数据排序需求引入。
  2. 排序评价维度。
  3. 简单排序:插入、冒泡、选择。
  4. 缩小增量:希尔排序。
  5. 分治:快速排序和归并排序。
  6. 利用数据结构:堆排序。
  7. 多维度比较和选择建议。
  8. 习题答案。

Step 1 结论:

  • 排序章节必须大量依赖条形数组动画,并用统一颜色展示比较、交换、已排序区间、pivot、merge 缓冲区。

Step 2:制定详细的动图图解计划

状态:已完成。

完成日期:2026-07-17。

动图和图解计划:

  • sorting-roadmap:简单排序 -> 改进插入 -> 交换分治 -> 选择堆 -> 归并。
  • sorting-metrics:稳定性、原地性、比较次数、移动次数卡片。
  • insertion-sort:已排序前缀、待插入元素、右移腾空。
  • binary-insertion-sort:二分定位 + 后续移动,突出比较少但移动不变。
  • shell-sort:按 gap 分组,逐步缩小 gap。
  • bubble-sort:相邻比较交换,最大值冒泡到末尾。
  • quick-partition:pivot、左右指针、不变量、一次 partition 后递归区间。
  • quick-worst-random:有序输入退化与随机 pivot/三数取中的改进。
  • selection-sort:选择最小值交换,稳定性反例用 2525*
  • heap-sort:复用堆章节组件,最大值逐步放到末尾。
  • merge-sort-split:递归拆分树。
  • merge-sort-merge:两个有序段合并到临时数组,再拷回。
  • sort-comparison:多维度比较矩阵,拆多页展示。

代码讲解计划:

  • C++17 排序代码包包含 insertion、binary insertion、shell、bubble、quick、selection、heap、merge。
  • 每个算法使用相同数组例子和对应动画。

习题图解预留:

  • 手算排序过程:复用对应动画最终状态。
  • 稳定性判断:使用带星重复元素。
  • 复杂度比较:复用 comparison 矩阵。

Step 2 结论:

  • 排序章节需要统一 SortBars 组件,比较、交换、pivot、已排序区间和临时数组语义必须全章一致。

Step 3:生成习题答案与图解方案

状态:已完成。

完成日期:2026-07-17。

答案方案:

  • 插入排序 3,1,4,1,5,9,2,6,5:逐轮插入,答案显示已排序前缀和元素右移;重复元素用于稳定性说明。
  • Shellsort 输入 9..1,增量 {7,3,1}:按 gap 分组做插入排序;答案图分三页展示 gap 7、gap 3、gap 1。
  • Heapsort 输入 142,543,123,65,453,879,572,434,111,242,811,102:先建最大堆,再逐轮输出末尾;复用堆排序动画。
  • 改写 heapsort 只排序 [low, high]:在子区间上建堆,所有下标映射为 low + localIndex;答案给代码片段和下标映射图。
  • 归并排序 3,1,4,1,5,9,2,6:递归拆分到单元素,再逐层 merge;答案图显示临时数组。

答案页要求:

  • 排序答案不使用静态大表格,全部使用条形数组逐轮图。
  • 每题最后给复杂度、稳定性、额外空间三项结论。

Step 1:分析并制定教学目标

状态:已完成。

完成日期:2026-07-17。

原始文本:reference-text/chapter8_Graph.md,共 134 页。

原始内容覆盖清单:

  • 图定义:G=(V,E),无向图、有向图。
  • 完全图、度、入度、出度、子图、路径、环。
  • 连通图、连通分量、强连通图、强连通分量。
  • 带权图/网络。
  • 图表示:邻接矩阵、邻接表、可能含十字链表/邻接多重表。
  • 图遍历:DFS、BFS。
  • 最小生成树:Prim、Kruskal。
  • 最短路径:Dijkstra、Floyd 等。
  • 拓扑排序、关键路径或相关有向无环图算法。
  • 代码片段和习题。

需要修正和现代化的点:

  • 原始章节编号可能与课程整体不一致,学生版按实际“图”章节重新编号。
  • 图术语必须图文同步,不能只给文字定义。
  • 邻接矩阵不是统计图表,应使用连续网格;邻接表应用链式节点图。
  • DFS/BFS 必须展示 visited/current/frontier/stack/queue,不再用混乱颜色。
  • Dijkstra 必须明确非负权前提,展示 dist 表与图联动。
  • Kruskal 应与并查集联动,Prim 应与优先队列联动。

本章教学定位:

  • 图章节讲“关系网络上的算法”,是前面队列、栈、优先队列、并查集的综合应用场。

学生学习目标:

  • 能准确使用图的基本术语。
  • 能在邻接矩阵和邻接表之间转换。
  • 能执行 DFS 和 BFS,并解释栈/递归与队列的作用。
  • 能用 DFS/BFS 求连通分量或可达性。
  • 能执行 Prim 和 Kruskal,并解释各自依赖的数据结构。
  • 能执行 Dijkstra,并解释松弛、dist、prev、settled。
  • 能说明最短路算法的适用前提。
  • 能执行拓扑排序并识别 DAG。

面向 PPT 的逻辑重排建议:

  1. 从地图、社交网络、依赖关系引入图。
  2. 图的基本术语。
  3. 图表示:邻接矩阵、邻接表。
  4. DFS/BFS 遍历。
  5. 连通性和强连通性。
  6. 最小生成树:Prim 与 Kruskal。
  7. 最短路径:Dijkstra 与 Floyd。
  8. DAG 与拓扑排序/关键路径。
  9. 综合比较和习题答案。

Step 1 结论:

  • 图章节需要最多的联动动画:图 + 队列/栈 + 表格 + 并查集/优先队列,必须复用标准组件,不在每页临时画图。

Step 2:制定详细的动图图解计划

状态:已完成。

完成日期:2026-07-17。

动图和图解计划:

  • graph-roadmap:术语 -> 表示 -> 遍历 -> 连通性 -> MST -> 最短路 -> DAG。
  • graph-terminology:点、边、有向/无向、权重、度、入度/出度逐项高亮。
  • complete-subgraph-path-cycle:完全图、子图、路径、环的对比图。
  • connected-components:无向图 DFS/BFS 染色求连通分量。
  • scc-concept:有向图强连通分量概念图。
  • adjacency-matrix:连续网格表示,行列高亮某条边。
  • adjacency-list:顶点数组 + 链表节点表示。
  • dfs-graph-stack:图和递归栈/显式栈联动,visited/current/frontier 颜色统一。
  • bfs-graph-queue:图和队列联动。
  • prim-mst:当前树、候选边、最小边选择,与优先队列概念联动。
  • kruskal-mst:边排序 + 并查集合并,成环边跳过。
  • dijkstra:图 + dist/prev/settled 表格联动,逐步 relax。
  • floyd:邻接矩阵/距离矩阵按中转点 k 更新。
  • topological-sort:入度表 + 队列 + DAG 输出序列。
  • critical-path:若保留关键路径,则使用 DAG 最早/最迟时间表联动。

代码讲解计划:

  • 图表示:邻接表和邻接矩阵。
  • DFS/BFS。
  • Prim/Kruskal。
  • Dijkstra/Floyd。
  • Topological sort。

习题图解预留:

  • 遍历序列题:复用 DFS/BFS。
  • MST 题:复用 Prim/Kruskal。
  • 最短路题:复用 Dijkstra/Floyd。
  • 拓扑排序题:复用 topological-sort。

Step 2 结论:

  • 图章节是全课程组件联动集大成,必须在生成 PPT 前先保证 Graph、Table、Queue、UnionFind、PriorityQueue 组件接口可复用。

Step 3:生成习题答案与图解方案

状态:已完成。

完成日期:2026-07-17。

答案方案:

  • 无向图 MST 题:分别用 Prim 和 Kruskal。Prim 从指定或默认最小编号顶点开始,逐步选择跨割最小边;Kruskal 先按边权排序,用并查集跳过成环边。答案图必须写出每一步选边和当前总代价。
  • 有向图最短路题:若原题图是非负权,则用 Dijkstra;若包含负权需改用 Bellman-Ford 或说明 Dijkstra 不适用。答案图使用 dist/prev/settled 表。
  • 有向图环路检测实习题:DFS 三色标记,遇到灰色点即发现回边;用递归栈恢复环路。答案图显示 white/gray/black 和当前递归栈。

答案页要求:

  • 图题答案必须保留图结构,不退化成边表。
  • MST 题要同时展示并查集或候选边集合。
  • 最短路题必须标明算法适用前提。

Step 4 基线 PPT 生成记录

状态:基线已生成,但未达到最终质量。

完成日期:2026-07-17。

已新增或已有章节源文件:

  • chapters/01-introduction.qmd
  • chapters/02-algorithm-analysis.qmd
  • chapters/03-list.qmd
  • chapters/03-stack-queue.qmd
  • chapters/04-tree.qmd
  • chapters/04-specific-trees.qmd
  • chapters/05-hashing.qmd
  • chapters/06-priority-queue.qmd
  • chapters/07-disjoint-set.qmd
  • chapters/08-graph.qmd
  • chapters/09-sorting.qmd

已更新:

  • _quarto.yml 导航加入新增章节。
  • scripts/course-viz.js 增加兼容别名:treeTraversalavlRotationadjacencyMatrixgraphBfsdijkstraDemo

已渲染通过:

  • chapters/00-visual-templates.qmd
  • chapters/01-introduction.qmd
  • chapters/02-algorithm-analysis.qmd
  • chapters/03-list.qmd
  • chapters/03-stack-queue.qmd
  • chapters/04-tree.qmd
  • chapters/04-specific-trees.qmd
  • chapters/06-priority-queue.qmd
  • chapters/07-disjoint-set.qmd
  • chapters/08-graph.qmd
  • chapters/09-sorting.qmd

注意:

  • Quarto 渲染不能并行执行。并行渲染会竞争 site_libs.quarto/_freeze 资源,导致文件锁或缺失错误;后续必须顺序渲染。
  • 当前新增章节是可渲染基线,不是最终学生版成稿。它们还没有完整承载原始 PPT 的全部内容、全部动画和全部答案页。

Step 5 覆盖与质量校验

状态:已执行首轮校验,结论为“不通过,需要继续加深”。

完成日期:2026-07-17。

总体验收结论:

  • 当前工程已经具备全章节 Quarto 文件和可渲染 HTML 输出。
  • 当前版本尚未满足“完整覆盖原始 PPT 内容,同时在逻辑流畅、代码风格统一、动画讲解细致、算法分析全面等方面超过原始 PPT”的最终要求。
  • 因此不能标记为最终完成,只能标记为“全课程基线已生成,进入逐章加深返工”。

主要缺口:

  • 多数新章节仍是骨架级讲义,未逐页融合原始 PPT 的全部页面内容。
  • 多数 Step 2 动画仍是计划,未全部实现为 course-viz 标准组件。
  • 多数习题答案仍是答案方案,未全部进入学生版 QMD。
  • C++ 可编译代码包尚未为每章生成。
  • 哈希章节尚未完成旧 hash-demo.jscourse-viz.js 的全面迁移。
  • 第 4.1 章 B-tree/B+tree 仍只有纠错原则和骨架,尚未实现标准插入/分裂和 B+tree 范围查询图。
  • 图章节尚未完整实现 Prim、Kruskal、Floyd、拓扑排序、关键路径等联动动画。
  • 排序章节尚未实现统一 SortBars 组件和全部排序算法逐步动画。

下一轮必须按章节继续执行:

  1. 先以第 1 章为模板加深到正式成稿级别。
  2. 再推进第 2 章算法分析,完成复杂度计数动画和 C++ 代码。
  3. 逐章扩展 course-viz.js 标准组件,不在 QMD 中堆 HTML。
  4. 每完成一章,单独运行 quarto render chapters/<chapter>.qmd
  5. 每章 Step 5 必须重新校验覆盖清单,合格后才能标为最终完成。

第 1 章第二轮返工记录

状态:正式成稿初版已完成,仍需后续视觉运行时抽查与代码包补齐。

完成日期:2026-07-17。

已完成修改:

  • chapters/01-introduction.qmd 从骨架版重写为学生版课堂讲义。
  • 删除教师侧草稿语气,不再出现“后续实现”“原 PPT”“制作提示”等字样。
  • 补齐原始材料中的主要内容线索:课程目的、真实场景、后续课程依赖、数据定义、数据结构定义、线性/非线性结构、逻辑/物理结构、ADT、自然数 ADT、OO、算法定义、选择排序、复杂度入口、数学工具箱、递归、阶乘、Fibonacci、Hanoi、泛型、Java Object/包装类/自动装箱、比较接口、异常、I/O、顺序文件读取、包/命名空间与异常类、习题答案。
  • 新增第一章可视化组件:introScenarioMapcourseDependencyMapdataStructureTriplelogicalVsPhysicaladtBoundaryselectionSortIntrorecursionStackfibCallTreehanoiDemo
  • 运行 quarto render chapters/01-introduction.qmd,渲染通过。

仍需确认:

  • 当前环境没有命令行 node,in-app browser 也不可用,因此本轮未完成浏览器运行时控制台验证。
  • 第一章已有习题答案,但递归习题尚未全部配成独立动图;后续可以继续补 combinationTreepermutationTreelinkedListLength 等组件。
  • 第一章尚未生成独立可编译代码包;后续全章代码包生成时统一处理。

第 1 章 Step 5 结论:

  • 覆盖和讲义逻辑已经显著超过首轮骨架,可以作为后续章节的正式化模板。
  • 由于浏览器运行时校验、习题全动画和代码包仍未完成,暂不标为最终完成。

第 1 章第三轮返工记录

状态:按高细粒度动画标准开始重做,尚未达到 4 小时最终版。

完成日期:2026-07-17。

已完成修改:

  • 修复全局 slide body 包装逻辑:course-branding.js 现在会把每页标题以外的内容统一放入 .slide-body,让“标题固定、正文区域垂直居中”成为默认行为。
  • 调整 course.css:普通正文和列表字号从 0.78em 降到 0.68em,行距从 1.18 降到 1.12,并保留代码和绘图字号。
  • 第一章 front matter 改为 incremental: true,让正文列表按行逐步出现。
  • course-branding.js 增加 applyTeachingFragments():对标题外的普通段落、blockquote、columns、callout、列表项自动加 reveal fragment,使 bullet 之外的正文也能逐步出现;代码块和动画容器默认不自动 fragment。
  • 自动 fragment 必须跳过包含 pre.viz-demo.columns。代码与 X6 动画协同展示区不能被普通正文 fragment 机制隐藏,否则 X6 可能在隐藏状态初始化,导致空白或突然跳到末尾。
  • 代码与动画协同展示统一使用 .code-viz-sync .no-fragment 布局:左侧使用 Quarto 标准代码块,右侧使用 .viz-demo;动画 step 中提供 line 字段,由 course-viz.jssyncCodeVizLine() 同步高亮左侧代码行。
  • 不要在 X6 图里伪造代码块。X6 只画状态、栈帧、数据结构和箭头;代码展示交给 Quarto 代码块和同步高亮机制。
  • 标题区 CSS 增加 user-select: text,保证标题文字可选中、可复制;logo 保持不可选。
  • 将“逻辑结构、物理结构与操作”拆成 10 帧:逻辑插入任务、数组连续存储、S4 右移、S3 右移、Sx 插入、链式存储、定位前驱、设置 Sx.next、设置 S2.next、数组/链表代价对比。
  • “插入操作:逻辑与物理实现”改为累积展示:逻辑结构保持在上方,数组实现继续显示在中间,链式实现继续显示在下方,便于对照;箭头说明统一放到箭头右侧并垂直居中。
  • 新增普通函数调用栈组件 callStackExecution:用 main -> f -> g 示例展示参数、局部变量、返回地址、返回值和栈帧弹出。
  • 新增阶乘递归联动组件 factorialStackLinked:在同一页展示阶乘代码与递归调用栈帧。
  • 调用栈组件改为表格式栈帧:从上到下增长,帧之间无空白,帧外框粗、内部格线细,函数名独占左列,参数/局部变量/返回值/下一步在右侧分行展示,变量值左对齐。
  • 调用栈相关页面改为 Quarto 标准代码块 + 栈帧动画的 columns 对照结构,避免在 X6 图里伪造代码块。
  • selectionSortIntro 从 5 帧粗略示意扩展为 12 帧:逐个比较、更新 min、扫描结束、交换元素、扩大已排序区间;交换阶段使用移动 token 表示轨迹。
  • 修正 hanoiDemo:盘子大小顺序改为最大盘在底部、最小盘在顶部;3 个盘完整展示 7 次合法移动,不再跳步到错误状态。
  • 第一章中动画页前增加任务和步骤铺垫,不再直接进入动画。
  • 运行 quarto render chapters/01-introduction.qmd,渲染通过。

仍需继续:

  • 第一章仍不是完整 4 小时最终版本,需要继续扩写每个概念单元,尤其是场景建模、ADT、OO、泛型、异常、I/O、所有递归习题。
  • selectionSortIntro 已完成第一轮细化,但后续仍可继续增强为完整排序全过程和代码行联动。
  • introScenarioMapdataStructureTripleadtBoundaryfibCallTreehanoiDemo 仍偏简略,需要按同一高标准继续返工。
  • 全课程各章需要在正式返工时逐步启用 incremental: true 或等效逐行 fragment 机制,确保正文展示和动画步骤连贯。

第 1 章第四轮返工记录

状态:继续向 4 小时正式版扩展,仍未最终完成。

完成日期:2026-07-17。

已完成修改:

  • 新增制作草稿 drafts/chapter1-4h-blueprint.md,记录第 1 章 4 小时节奏、学生版语言要求、仍需补强的内容和组件目标。
  • 学生版 QMD 扩展前半部分:真实场景到结构、系统软件和应用软件中的结构用途、游戏搜索、图书目录、交通路口、D/R/O 三元组、结构分类、逻辑/物理/操作三视角、ADT 操作契约、算法性质和算法/程序区别。
  • 新增可视化组件 structureTaxonomy:用线性、树、图三栏图示比较结构差异。
  • 新增可视化组件 algorithmProperties:逐步展示输入、输出、确定性、有限性、有效性。
  • 新增递归习题组件 countOnesTrace:追踪 countOnes(13) 的递归分解和返回结果。
  • 新增递归习题组件 combinationTree:展示组合问题的选/不选递归树。
  • 新增递归习题组件 permutationTree:展示全排列固定位置的递归树。
  • 习题区改为题目、分解、图解、代码、复杂度/边界的流程,不再只给代码答案。
  • chapters/01-introduction.qmd 执行学生版污染词扫描,未发现“学生/课堂/下载/下一页/动画/本课程/后续/我们/制作/草稿”等明显制作语气残留。
  • 运行 quarto render chapters/01-introduction.qmd,渲染通过。

仍需继续:

  • 需要进一步视觉检查是否所有新增页在 1050x700 下不溢出。
  • introScenarioMap 仍需从当前三栏示意升级为更细的场景抽象动画。
  • adtBoundary 仍需细化成接口、表示、数组实现、链表实现和复杂度差异的多帧过程。
  • Hanoi 已修正合法移动,但还需要轨迹动画。
  • 第一章仍需根据全课程最终代码语法反向补齐语言复习部分。

第 1 章第五轮返工记录

状态:继续提升关键动画质量,仍未最终完成。

完成日期:2026-07-17。

已完成修改:

  • introScenarioMap 从一次性三栏示意升级为四步抽象过程:识别对象、识别关系、识别操作、得到结构。三个场景分别展示对象、关系和操作如何导向树、线性表和图。
  • adtBoundary 从静态框图升级为 6 帧:调用者接口、行为契约、数组实现、链表实现、复杂度差异、表示隐藏。
  • ADT 动画明确展示相同接口下数组与链表的操作代价差异:get(i)insert(i)、已知前驱插入、find(i)
  • chapters/01-introduction.qmd 执行学生版污染词扫描,无匹配。
  • 运行 quarto render chapters/01-introduction.qmd,渲染通过。

仍需继续:

  • Hanoi 需要轨迹动画。
  • Fibonacci 调用树需要进一步标出重复子问题并连接动态规划动机。
  • 选择排序需要接入 code-viz-sync 行高亮,形成“代码、状态、复杂度”完整闭环。
  • 第一章仍需视觉溢出抽查和最终语法回填。

第 2 章第二轮返工记录

状态:正式成稿初版已完成,仍需后续视觉运行时抽查、逐段代码高亮和代码包补齐。

完成日期:2026-07-17。

已完成修改:

  • 重建 chapters/02-algorithm-analysis.qmd,避免中断后留下缺失文件。
  • 按 4 小时课堂容量扩写为长版学生讲义,不再使用骨架式压缩讲法。
  • 覆盖原始材料主要内容:性能分析/性能测量、空间复杂度组成、顺序查找空间、递归求和空间、基本操作计数、最大元素、选择排序、冒泡排序、rank sort、最好/最坏/平均情况、顺序查找、插入排序、step counts、Big-O、Big-Ω、Big-Θ、二分查找、最大子段和三种算法、欧几里得算法、selectKth 和循环分析习题答案。
  • 新增第二章可视化组件:growthRatesnestedLoopCountbinarySearchVizmaxSubarrayVizeuclidViz
  • 运行 quarto render chapters/02-algorithm-analysis.qmd,渲染通过。

仍需确认:

  • 第二章当前已包含完整习题答案,但代码讲解还没有全部切换为“同一份代码逐段高亮 + 下方解释”的交互形式。
  • 第二章尚未生成独立可编译 C++ 工程包。
  • 当前只完成 Quarto 构建验证,尚未完成浏览器运行时控制台验证和逐页视觉溢出检查。

第 2 章 Step 5 结论:

  • 覆盖和课堂逻辑已经超过首轮骨架,满足继续作为后续章节长版模板的要求。
  • 由于视觉运行时、高亮讲解和代码包尚未完成,暂不标为最终完成。

第 2 章第三轮返工记录

状态:继续向标准模板靠拢,已完成一次代码/动画联动校正。

完成日期:2026-07-17。

已完成修改:

  • 清理 chapters/02-algorithm-analysis.qmd 中残留的制作性表述,避免学生版出现“我们”“本课程”“下一章开始”等讲义外措辞。
  • 将二分查找的单独动画页和单独代码页合并为 code-viz-sync 联动页。
  • 将二分查找动画拆成取中点、更新 low、再次取中点、更新 high、命中返回、复杂度结论六步。
  • binarySearchViz 每一步绑定对应 C++ 代码行,形成“左侧代码高亮、右侧区间变化、下方计算说明”同步讲解。
  • 对第二章 QMD 和共享可视化脚本执行制作性语言扫描,无匹配。
  • 运行 quarto render chapters/02-algorithm-analysis.qmd,渲染通过。

仍需继续:

  • 最大子段和、欧几里得算法、循环计数等代码页仍需继续改造成同一套代码逐段高亮。
  • 第二章仍缺独立可编译 C++ 工程包。
  • 需要在后续统一视觉 QA 时检查每页是否真正垂直居中且无溢出。

第 3.0 章线性表第一轮正式生成记录

状态:长版学生讲义初版完成,已覆盖原始 PPT 主体内容并可渲染。

完成日期:2026-07-17。

Step 1 教学目标:

  • 准确定义线性表 ADT,区分 ADT 与具体实现。
  • 掌握顺序表的定位、查找、插入和删除。
  • 掌握单链表节点、遍历、插入、删除和前驱查找。
  • 理解头结点、双向链表、循环链表、游标链表的动机。
  • 能够用链表解决 Josephus、多项式相加、倒数第 k 个结点和桶排序桶结构。
  • 能从复杂度、空间、缓存局部性和边界条件比较顺序表与链表。

Step 2 动图图解计划:

  • 新增 listAdtContract:线性表对象、位置关系、操作集合和实现选择。
  • 复用 arraySearch:顺序查找。
  • 新增 arrayInsertDelete:顺序表删除左移和插入右移。
  • 复用 x6Pointer:单链表插入时两条关键指针。
  • 新增 singlyDelete:单链表删除时寻找前驱、保存目标、重连指针。
  • 新增 doubleCircularList:单链表、双向链表、表头结点、循环双向链表。
  • 新增 josephusCircle:Josephus 循环链表逐次出列。
  • 新增 polynomialAddList:两个有序多项式链表按指数归并。
  • 新增 kthFromEnd:快慢指针查找倒数第 k 个结点。
  • 新增 cursorListViz:游标链表的数组下标模拟指针。
  • 新增 bucketListSort:桶排序中桶用链表实现。

Step 3 习题答案:

  • 已生成顺序表删除平均移动次数。
  • 已生成单链表删除代码答案。
  • 已生成多项式相加计算答案。
  • 已生成单链表反转代码答案。
  • 倒数第 k 个结点使用图解和 C++ 代码给出答案。

Step 4 PPT 生成:

  • 重写 chapters/03-list.qmd 为长版学生讲义。
  • 统一将原始 Java 风格代码改为 C++ 模板/指针风格代码。
  • 使用 Graphviz、X6 组件和公式共同组织讲解。
  • 运行 quarto render chapters/03-list.qmd,渲染通过。

Step 5 覆盖与质量校验:

  • 覆盖原始 PPT 主要内容:ADT、数据对象、线性表定义、顺序表、查找平均比较次数、插入/删除平均移动次数、单链表、头结点、迭代器思想、双向链表、循环链表、Josephus、多项式 ADT、多项式相加、游标链表、倒数第 k 个结点和桶排序链表实现。
  • 修正原始材料中的拼写、语义和代码风格问题。
  • 学生版制作性语言扫描仅命中“学生名单”示例,未发现制作语气残留;共享可视化脚本扫描无匹配。

仍需继续:

  • 第 3.0 章还需要浏览器运行时视觉抽查,确认新组件无溢出、按钮联动正常。
  • arrayInsertDeletepolynomialAddList 后续可以继续增强为更多轨迹动画。
  • 需要补齐本章独立可编译 C++ 工程包。

第 3.1 章栈和队列第一轮正式生成记录

状态:长版学生讲义初版完成,已覆盖原始 PPT 主体内容并可渲染。

完成日期:2026-07-17。

Step 1 教学目标:

  • 掌握栈 ADT、数组栈和链式栈。
  • 理解两个栈共享一个数组的空间优化。
  • 使用栈完成括号匹配、后缀表达式求值、中缀转后缀。
  • 掌握队列 ADT、循环队列和链式队列。
  • 使用队列理解杨辉三角生成和网格最短路径标号。
  • 分析栈与队列应用的时间复杂度和空间复杂度。

Step 2 动图图解计划:

  • 新增 stackModelViz:push/pop 展示后进先出。
  • 新增 twoStacksArray:两个栈在同一数组中从两端向中间增长。
  • 新增 parenMatchingViz:括号位置入栈、匹配出栈、错误检测。
  • 新增 postfixEvalViz:后缀表达式求值的操作数栈。
  • 新增 infixPostfixViz:中缀转后缀时的运算符栈和输出流。
  • 新增 circularQueueViz:循环队列的 frontbacksize 和取模。
  • 新增 wireRoutingViz:网格布线 BFS 标号和反向路径重构。

Step 3 习题答案:

  • 已生成打印缓冲区选择队列的答案。
  • 已生成栈容量至少为 3 的操作序列。
  • 已生成循环队列 rearlength 条件、队头公式。
  • 已生成数组循环左移的三次逆置算法和 C++ 代码。

Step 4 PPT 生成:

  • 重写 chapters/03-stack-queue.qmd 为长版学生讲义。
  • 将原始 Java/C 混合代码统一改为 C++ 风格代码。
  • 运行 quarto render chapters/03-stack-queue.qmd,渲染通过。

Step 5 覆盖与质量校验:

  • 覆盖原始 PPT 主要内容:栈模型、链式栈、数组栈、双栈共享数组、括号匹配、表达式求值、中缀转后缀、队列模型、循环数组队列、链式队列、杨辉三角、网格布线、循环左移和队列/栈习题。
  • 修正原始代码中的拼写、大小写、返回值和异常处理混乱问题。
  • 学生版制作性语言扫描无匹配;共享可视化脚本扫描无匹配。

仍需继续:

  • 后续需要浏览器运行时抽查组件布局和全局方向键控制。
  • 表达式处理可以进一步增强为一趟“中缀转后缀并求值”的综合动画。
  • 需要补齐本章独立可编译 C++ 工程包。

第 4.0 章树第一轮正式生成记录

状态:覆盖性长版学生讲义初版完成,已渲染通过。

完成日期:2026-07-17。

Step 1 教学目标:

  • 掌握普通树和二叉树的定义、术语与差异。
  • 掌握二叉树层数、结点数、叶结点与二度结点关系、完全二叉树公式。
  • 掌握二叉树数组、链式和游标表示。
  • 掌握递归先序、中序、后序、层序和非递归中序遍历。
  • 掌握先序+中序构造二叉树的递归算法。
  • 理解普通树、森林、孩子兄弟表示与二叉树转换。
  • 理解线索二叉树和 Huffman 树的核心思想。

Step 2 动图图解计划:

  • 新增 treeTerminologyViz:根、度、叶、层次和高度。
  • 新增 binaryTreePropertyViz:层结点上界、满二叉树和完全二叉树数组编号。
  • 新增 traversalOrdersViz:先序、中序、后序、层序遍历结果。
  • 新增 preInBuildViz:由先序和中序递归构造二叉树。
  • 新增 huffmanBuildViz:Huffman 树反复合并最小权值。

Step 3 习题答案:

  • 已生成二叉树 \(n_0=n_2+1\) 证明。
  • 已生成完全二叉树第 6 层叶结点条件下最大结点数。
  • 已生成度为 4 的普通树叶结点计算。
  • 已生成递归统计叶结点代码答案。
  • 已生成交换左右子树代码答案。
  • 已生成 Huffman 性质判断答案。

Step 4 PPT 生成:

  • 重写 chapters/04-tree.qmd 为长版学生讲义。
  • 将原始 C/Java 混合材料统一整理为 C++ 模板代码。
  • 运行 quarto render chapters/04-tree.qmd,渲染通过。

Step 5 覆盖与质量校验:

  • 覆盖原始 PPT 主要内容:普通树、二叉树定义、二叉树性质、满二叉树、完全二叉树、数组表示、链式表示、游标表示、BinaryTree 类接口、MakeTree/BreakTree、遍历、建树、树/森林转换、线索二叉树、Huffman 树与习题。
  • 学生版制作性语言扫描只命中“后续树”这一内容词;共享可视化脚本扫描无匹配。

仍需继续:

  • 线索树和树/森林转换后续需要升级为逐帧动画。
  • Huffman 树需要补充完整树形构造过程和编码路径动画。
  • 需要补齐本章独立可编译 C++ 工程包。

第 4.1 章特殊树第一轮正式生成记录

状态:覆盖性长版学生讲义初版完成,已渲染通过。

完成日期:2026-07-17。

Step 1 教学目标:

  • 掌握 BST 的查找、插入、删除和退化问题。
  • 理解 Indexed BST 的 leftSize 与第 k 小查询。
  • 掌握 AVL 树定义、平衡因子、四种失衡和旋转。
  • 理解 AVL 高度界与 Fibonacci 递推。
  • 掌握 m-way search tree 的结点内 key 与孩子区间。
  • 正确定义 B-tree 的阶、最小/最大孩子数、叶层一致性和插删调整。
  • 明确区分 B-tree 与 B+ tree,特别是数据存储位置和叶子链表。

Step 2 动图图解计划:

  • 复用 avlRotation 展示 AVL 插入和旋转。
  • BST、m-way search tree、B-tree/B+ tree 暂以 Graphviz、公式和代码说明为主。
  • 后续需要新增 BST 查找/删除、B-tree 分裂/借位/合并、B+ tree 范围查询的标准组件。

Step 3 习题答案:

  • 已生成给定序列插入 BST 的结果。
  • 已生成合法区间检测 BST 的代码答案。
  • 已生成 BST 路径三集合判断答案。
  • 已生成 AVL 最少结点数递推和高度界答案。
  • 已生成 B-tree 与 B+ tree 区分题答案。

Step 4 PPT 生成:

  • 重写 chapters/04-specific-trees.qmd 为长版学生讲义。
  • 将原始 Java 风格 BST/AVL 代码统一为 C++ 模板风格。
  • 修正 B-tree 与 B+ tree 混淆风险,单独给出 B+ tree 定义。
  • 运行 quarto render chapters/04-specific-trees.qmd,渲染通过。

Step 5 覆盖与质量校验:

  • 覆盖原始 PPT 主要内容:BST 定义、Indexed BST、BST 类接口、查找、findMin/findMax、插入、删除、退化、AVL 定义、旋转、高度界、m-way search tree、B-tree 定义、查找、插入、删除和习题。
  • 增加原始 PPT 中不足或易混淆的 B+ tree 内容。
  • 学生版制作性语言扫描无匹配。

仍需继续:

  • B-tree/B+ tree 需要新增逐帧动画组件,尤其是结点分裂、父结点上升、借位、合并和范围查询。
  • AVL 现有动画仍来自标准模板,后续可按本章具体 key 序列定制。
  • 需要补齐本章独立可编译 C++ 工程包。

第 6 章优先队列第一轮正式生成记录

状态:长版学生讲义初版完成,已渲染通过。

完成日期:2026-07-17。

Step 1 教学目标:

  • 掌握优先队列 ADT。
  • 比较无序线性表、有序线性表和堆实现。
  • 掌握最大堆、最小堆和完全二叉树数组表示。
  • 掌握插入上滤、删除堆顶下滤。
  • 掌握 Floyd 建堆、堆排序和 Top-K。

Step 2 动图图解计划:

  • 新增 heapOperationViz:用树和数组联动展示插入上滤与删除堆顶下滤。
  • 后续需要补充完整建堆、堆排序和 Top-K 的逐帧组件。

Step 3 习题答案:

  • 已生成最小堆插入 3 的上滤过程。
  • 已生成判断数组是否为最大堆的代码答案。
  • 已生成堆排序复杂度与稳定性说明。

Step 4 PPT 生成:

  • 重写 chapters/06-priority-queue.qmd 为长版学生讲义。
  • 将原始 C++/Java 混合代码统一为 C++ 模板风格。
  • 运行 quarto render chapters/06-priority-queue.qmd,渲染通过。

Step 5 覆盖与质量校验:

  • 覆盖原始 PPT 主要内容:优先队列 ADT、线性表表示、最大/最小堆、堆类、插入、删除、建堆、堆排序、Top-K 和习题。
  • 学生版制作性语言扫描无匹配;共享可视化脚本扫描无匹配。

仍需继续:

  • 建堆、堆排序和 Top-K 需要继续做成高质量逐帧动画。
  • 需要补齐本章独立可编译 C++ 工程包。

第 7 章并查集第一轮正式生成记录

状态:长版学生讲义初版完成,已渲染通过。

完成日期:2026-07-17。

Step 1 教学目标:

  • 掌握等价关系与等价类。
  • 掌握 findunion 和在线合并操作。
  • 掌握森林表示与 parent 数组。
  • 理解简单合并的退化问题。
  • 掌握按大小合并、按秩合并和路径压缩。
  • 理解摊还复杂度 \(O(\alpha(n))\)
  • 能将并查集用于动态连通性和 Kruskal 算法。

Step 2 动图图解计划:

  • 新增 disjointSetViz:展示初始集合、union、按大小合并、find 路径和路径压缩。
  • 后续需要补充完整等价类序列 (0,4),(3,1),... 的逐步合并动画。

Step 3 习题答案:

  • 已生成等价类合并结果。
  • 已生成路径压缩后的 parent 变化。
  • 已生成 Kruskal 中并查集用于成环检测的解释。

Step 4 PPT 生成:

  • 重写 chapters/07-disjoint-set.qmd 为长版学生讲义。
  • 将原始 C++/Java 混合写法统一为现代 C++ 类。
  • 运行 quarto render chapters/07-disjoint-set.qmd,渲染通过。

Step 5 覆盖与质量校验:

  • 覆盖原始 PPT 主要内容:等价关系、等价类、在线 combine/find/union、森林表示、简单实现、性能评估、按重量/高度合并、路径压缩和应用。
  • 学生版制作性语言扫描无匹配;共享可视化脚本扫描无匹配。

仍需继续:

  • 需要把原始等价对完整序列做成逐帧动画。
  • 需要补齐本章独立可编译 C++ 工程包。

第 8 章图第一轮正式生成记录

状态:覆盖性长版学生讲义初版完成,已渲染通过。

完成日期:2026-07-17。

Step 1 教学目标:

  • 掌握图的定义、无向/有向图、完全图、度、路径、连通性和网络。
  • 掌握邻接矩阵、邻接表、逆邻接表、十字链表和邻接多重表。
  • 掌握 DFS、BFS、连通分量和生成树。
  • 掌握 Kruskal 与 Prim 最小生成树算法。
  • 掌握 Dijkstra、Bellman-Ford、Floyd 最短路径算法。
  • 掌握拓扑排序、AOV 网、AOE 网和关键路径。

Step 2 动图图解计划:

  • 复用 adjacencyMatrix 展示邻接矩阵。
  • 复用 graphBfs 展示 BFS。
  • 复用 dijkstraDemo 展示 Dijkstra 图和表格联动。
  • 后续需要新增 DFS 回退、Kruskal+并查集、Prim lowcost、拓扑排序、关键路径的专用动画。

Step 3 习题答案:

  • 已生成无向连通图边数性质答案。
  • 已生成错误最短路贪心的反例。
  • 已生成拓扑排序有环判断答案。
  • 已生成 Kruskal 与 Prim 对比答案。

Step 4 PPT 生成:

  • 重写 chapters/08-graph.qmd 为长版学生讲义。
  • 覆盖图概念、存储、遍历、MST、最短路、拓扑排序和关键路径。
  • 调整全局 LaTeX 字号:display math 接近正文,仅略小一号。
  • 运行 quarto render chapters/08-graph.qmd,渲染通过。

Step 5 覆盖与质量校验:

  • 覆盖原始 PPT 主要内容:图定义与术语、存储表示、DFS/BFS、连通分量、生成树、最小生成树、Kruskal、Prim、Dijkstra、Bellman-Ford、Floyd、拓扑排序、关键路径和习题。
  • 学生版制作性语言扫描无匹配;共享可视化脚本扫描无匹配。

仍需继续:

  • 图算法动画仍需要大幅增强,尤其是 DFS/BFS 回退标注、MST 逐边选择、拓扑排序入度表和关键路径 Ve/Vl 联动。
  • 需要补齐本章独立可编译 C++ 工程包。

第 9 章排序第一轮正式生成记录

状态:覆盖性长版学生讲义初版完成,已渲染通过。

完成日期:2026-07-17。

Step 1 教学目标:

  • 掌握排序定义、关键码、稳定性、内排序和外排序。
  • 掌握插入排序、折半插入排序和希尔排序。
  • 掌握冒泡排序和快速排序。
  • 掌握选择排序、锦标赛排序和堆排序。
  • 掌握归并排序、链表归并排序和基数排序思想。
  • 能够比较排序算法的时间、空间、稳定性、原地性和输入敏感性。

Step 2 动图图解计划:

  • 当前版本先使用公式、代码和过程文本覆盖全章。
  • 后续需要新增统一排序动画组件:比较、移动、交换、已排序区间、递归划分、归并区间和堆数组联动。

Step 3 习题答案:

  • 已生成直接插入排序手算过程。
  • 已生成第二趟排序结果判断题答案。
  • 已生成归并排序手算过程。
  • 已生成堆排序稳定性分析答案。

Step 4 PPT 生成:

  • 重写 chapters/09-sorting.qmd 为长版学生讲义。
  • 将原始 C++/Java 混合代码统一为现代 C++ 风格。
  • 运行 quarto render chapters/09-sorting.qmd,渲染通过。

Step 5 覆盖与质量校验:

  • 覆盖原始 PPT 主要内容:排序概述、稳定性、算法分析、直接插入、折半插入、希尔、冒泡、快速、选择、锦标赛、堆、归并、链表归并、基数排序和内排序总结。
  • 学生版制作性语言扫描无匹配;共享可视化脚本扫描无匹配。

仍需继续:

  • 全部排序算法需要补专用逐帧动画,当前动画质量不如哈希和树/链表模板。
  • 需要补齐本章独立可编译 C++ 工程包。

全章节第一轮构建校验记录

状态:全部正式章节均已生成 HTML,并通过 Quarto 构建。

完成日期:2026-07-17。

已完成:

  • 调整全局 LaTeX 字号:display math 不再急剧缩小,整体仅比正文略小一号。
  • 第 5 章哈希补入 course-viz.css,避免脱离统一视觉样式。
  • 清理正式章节中的制作性语言关键词,包括“课堂”“学生”“下载”“本课程”“后续”等容易误入学生版的表达。
  • 对正式章节和共享脚本执行制作性语言扫描,无匹配。
  • 逐章渲染通过:
    • 00-visual-templates.qmd
    • 01-introduction.qmd
    • 02-algorithm-analysis.qmd
    • 03-list.qmd
    • 03-stack-queue.qmd
    • 04-tree.qmd
    • 04-specific-trees.qmd
    • 05-hashing.qmd
    • 06-priority-queue.qmd
    • 07-disjoint-set.qmd
    • 08-graph.qmd
    • 09-sorting.qmd

输出位置:

  • _site/chapters/00-visual-templates.html
  • _site/chapters/01-introduction.html
  • _site/chapters/02-algorithm-analysis.html
  • _site/chapters/03-list.html
  • _site/chapters/03-stack-queue.html
  • _site/chapters/04-tree.html
  • _site/chapters/04-specific-trees.html
  • _site/chapters/05-hashing.html
  • _site/chapters/06-priority-queue.html
  • _site/chapters/07-disjoint-set.html
  • _site/chapters/08-graph.html
  • _site/chapters/09-sorting.html

仍需继续:

  • 当前所有章节达到“覆盖性长版初稿 + 可渲染”状态,但第 6、7、8、9 章的专用逐帧动画还明显不足。
  • 需要为各章补齐独立可编译 C++ 工程包。
  • 需要浏览器运行时 QA:检查动画按钮、方向键控制、视觉溢出、公式字号和移动动画效果。
  • 第 5 章哈希仍需把旧 hash-demo 系统逐步迁移到统一 course-viz 标准组件,接口保持不破坏。

认知型动画补强第一轮记录

状态:第 6、8、9 章新增一批“先问题状态、再局部操作、再代码/复杂度”的逐步动画。

完成日期:2026-07-17。

新增组件:

  • heapBuildViz:Floyd 建堆,从最后一个内部结点向前逐步下滤,强调“子树已是堆”的循环不变式。
  • heapSortViz:堆排序中堆区缩小、已排序区扩大的过程。
  • topKViz:维护大小为 k 的最小堆求第 K 大,逐个输入判断保留或丢弃。
  • kruskalViz:Kruskal 按边权选边,展示选中边、跳过成环边和并查集判断含义。
  • topologicalSortViz:拓扑排序中入度为 0 队列、输出序列和删除出边的过程。
  • insertionSortViz:直接插入排序中有序区、当前元素、比较、右移和插入位置。
  • quickPartitionViz:快速排序 partition 中 ij、pivot 和“小于 pivot 区”的边界含义。
  • mergeSortViz:归并排序从拆分到稳定合并的层次过程。

嵌入章节:

  • chapters/06-priority-queue.qmd
  • chapters/08-graph.qmd
  • chapters/09-sorting.qmd

验证:

  • 运行 quarto render chapters/06-priority-queue.qmd,通过。
  • 运行 quarto render chapters/08-graph.qmd,通过。
  • 运行 quarto render chapters/09-sorting.qmd,通过。
  • 对上述章节和 scripts/course-viz.js 执行制作性语言扫描,无匹配。

仍需继续:

  • 图章节仍缺 Prim、Dijkstra 详细松弛表、Bellman-Ford、Floyd、关键路径的专用细动画。
  • 排序章节仍缺冒泡、选择、希尔、堆排序更完整多趟、基数排序的细动画。
  • 优先队列章节的 heapBuildVizheapSortViz 后续可增强为节点轨迹移动,而不是只展示状态帧。

图算法认知型动画补强记录

状态:第 8 章核心图算法补入表格/图联动动画。

完成日期:2026-07-17。

新增组件:

  • primViz:展示 Prim 中当前生成树集合、选中边、lowcostnearvex 表的变化。
  • dijkstraRelaxViz:展示 Dijkstra 中已确定集合、当前点、distprev 表,以及松弛操作。
  • floydViz:展示 Floyd 每轮允许一个中转点时距离矩阵如何更新。
  • criticalPathViz:展示 AOE 网中正向计算 Ve、反向计算 Vl,并用 e=l 标识关键活动。

嵌入章节:

  • chapters/08-graph.qmd

认知拆解原则:

  • Prim 先理解“树外顶点到当前树的最近边”,再写 lowcost/nearvex
  • Dijkstra 先理解“最小估计被确定”,再解释松弛和 prev
  • Floyd 先理解“允许经过一个中转点”,再给三重循环。
  • 关键路径先正向得到最早时间,再反向得到最迟时间,最后判断关键活动。

验证:

  • 运行 quarto render chapters/08-graph.qmd,通过。
  • chapters/08-graph.qmdscripts/course-viz.js 执行制作性语言扫描,无匹配。

仍需继续:

  • DFS 仍需补“访问、深入、回退”的边上箭头动画。
  • Bellman-Ford 仍需补“第 1 到 n-1 轮全边松弛”和负环检测动画。
  • Kruskal、Prim 和 Dijkstra 后续可继续增强为边/点移动或渐变过渡。

排序算法认知型动画补强记录

状态:第 9 章主要排序算法已补入更多细颗粒过程动画。

完成日期:2026-07-17。

新增组件:

  • bubbleSortViz:展示相邻比较、交换、最大值向右冒泡、已排序区形成和提前结束条件。
  • selectionSortViz:展示每趟扫描未排序区、维护 minIndex、交换到已排序区。
  • shellSortViz:展示 gap 分组、长距离移动、最终 gap=1 的插入排序收尾。
  • radixSortViz:展示按个位/十位稳定分配到桶,再按桶顺序收集。

嵌入章节:

  • chapters/09-sorting.qmd

验证:

  • 运行 quarto render chapters/09-sorting.qmd,通过。
  • chapters/09-sorting.qmdscripts/course-viz.js 执行制作性语言扫描,无匹配。

仍需继续:

  • 排序动画目前以状态帧为主,后续可增强为元素移动轨迹动画。
  • 锦标赛排序、链表归并排序还需要专用示意图。
  • 习题答案可以继续换成对应动画组件,而不是只给文字推导。

DFS / Bellman-Ford / 锦标赛 / 链表归并补强记录

状态:按“读代码查偷懒点”的要求,补入四个原先偏文字化的细过程演示。

完成日期:2026-07-17。

新增组件:

  • dfsTraversalViz:展示 DFS 的访问、深入、回退、再深入,以及递归栈和已访问集合。
  • bellmanFordViz:展示初始化、逐边松弛、负边更新、提前结束和负环检测条件。
  • tournamentSortViz:展示比较树从叶子到根逐层产生胜者,以及删除最小值后的路径重赛思想。
  • linkedMergeViz:展示两个有序链表头结点比较、结果链表接尾部、剩余链表接入。

嵌入章节:

  • chapters/08-graph.qmd
  • chapters/09-sorting.qmd

验证:

  • 运行 quarto render chapters/08-graph.qmd,通过。
  • 运行 quarto render chapters/09-sorting.qmd,通过。
  • 对上述章节和 scripts/course-viz.js 执行制作性语言扫描,无匹配。

下一轮自检结论:

  • dfsTraversalVizbellmanFordViz 已经达到“先过程、再代码”的认知顺序。
  • tournamentSortViz 仍偏静态状态树,后续应把“重赛路径”抽象为通用树路径高亮组件。
  • linkedMergeViz 仍偏状态展示,后续应复用链表插入的移动节点与改指针动画,避免学生误以为复制了结点。

第 7 章并查集补强记录

状态:第 7 章从短讲义扩展为“等价关系 -> 在线合并 -> 森林表示 -> 退化风险 -> 两类优化 -> 应用”的连续讲解。

完成日期:2026-07-17。

新增组件:

  • dsuEquivalenceViz:按原始等价对逐步合并等价类。
  • dsuWorstCaseViz:展示简单合并如何形成高度为 n-1 的链,并同步 parent 表。
  • dsuWeightedUnionViz:展示按大小合并时比较集合规模、挂接小树、更新根大小。
  • dsuPathCompressionViz:展示 find(6) 先向根走,再沿途改父指针。

嵌入章节:

  • chapters/07-disjoint-set.qmd

验证:

  • 运行 quarto render chapters/07-disjoint-set.qmd,通过。
  • chapters/07-disjoint-set.qmdscripts/course-viz.js 执行制作性语言扫描,无匹配。

第 6 章优先队列应用补强记录

状态:补入离散事件模拟,强化“优先队列按优先级服务而不是按到达顺序服务”的应用理解。

完成日期:2026-07-17。

新增组件:

  • priorityEventSimViz:展示最小堆保存未来事件、每次 deleteMin 取最早事件、处理时插入新事件。

嵌入章节:

  • chapters/06-priority-queue.qmd

验证:

  • 运行 quarto render chapters/06-priority-queue.qmd,通过。
  • chapters/06-priority-queue.qmdscripts/course-viz.js 执行制作性语言扫描,无匹配。

自检修正:

  • 初版使用 graph.getCells().find(...) 回找堆节点,可能误取非堆节点。
  • 已改为显式保存 heapNodes 引用后连边。

第 5 章散列代码包验证记录

状态:验证第 5 章提供的 C++ 工程包可以独立编译运行,且 zip 与源码同步。

完成日期:2026-07-17。

验证内容:

  • 使用独立临时构建目录运行 cmake -S assets/cpp/hash-table-demo -B <tmp-build>
  • 运行 cmake --build <tmp-build> --config Release,通过。
  • 执行生成的 hash_table_demo.exe,linear probing、quadratic probing、double hashing、separate chaining 全部通过自检。
  • 解压 assets/hash-table-demo.zip,对 CMakeLists.txtREADME.mdinclude/hash_tables.hppsrc/main.cpp 做 SHA256 对比,均与 assets/cpp/hash-table-demo 当前源码一致。

工程结论:

  • 第 5 章的代码包可直接编译运行。
  • zip 未包含 build 产物,只包含学生需要的源码和构建文件。
  • 第 5 章动画仍使用独立 hash-demo.js,但键盘控制已通过 course-keyboard.js 支持 .hash-demo,短期不需要破坏性迁移。

自检结论:

  • 原始材料中的等价类例子、简单树表示、最坏链、weight rule、path compression 已经被纳入正式讲义。
  • 需要继续增强的方向是把 Kruskal 中并查集的连通性判断做成“边加入 / 跳过 / 集合合并”联动图。

第 6 章优先队列补强记录

状态:第 6 章从“定义和代码为主”补强为“下标映射 -> 插入上滤 -> 删除下滤 -> 建堆 -> 应用”的连续图解。

完成日期:2026-07-17。

新增组件:

  • heapArrayMappingViz:展示完全二叉树按层映射到 1-based 数组,以及 parent/left/right 公式。
  • heapInsertDetailedViz:展示插入时新元素、父结点下移、空洞上移、最终落位。
  • heapDeleteDetailedViz:展示删除堆顶时取答案、末尾元素暂存、选择较大孩子、空洞下移、最终落位。
  • topKCompareViz:对比全量最大堆与大小为 k 的最小堆。

嵌入章节:

  • chapters/06-priority-queue.qmd

验证:

  • 运行 quarto render chapters/06-priority-queue.qmd,通过。
  • chapters/06-priority-queue.qmdscripts/course-viz.js 执行制作性语言扫描,无匹配。

自检修正:

  • 初版动画用重复数字表达空洞移动,容易被误解为复制结点。
  • 已改为显式空位,并在说明中强调 xlast 仍在外部等待最终落位。

第 4.1 章特殊树补强记录

状态:第 4.1 章补入 BST / Indexed BST / m-way / B-tree / B+ tree 的关键认知动画。

完成日期:2026-07-17。

新增组件:

  • bstFindViz:展示 BST 查找 37 时每一步比较和路径选择。
  • bstDeleteCasesViz:展示删除叶结点、删除单子树结点、删除双子树结点并用后继替换。
  • indexedBstSelectViz:展示 leftSize 如何支持第 k 小查询,以及进入右子树时如何更新 k
  • mwaySearchViz:展示多 key 结点如何把值域划分为多个孩子区间。
  • btreeBplusCompareViz:展示 B-tree 和 B+ tree 的数据位置差异、叶子链表与范围查询。

嵌入章节:

  • chapters/04-specific-trees.qmd

验证:

  • 运行 quarto render chapters/04-specific-trees.qmd,通过。
  • chapters/04-specific-trees.qmdscripts/course-viz.js 执行制作性语言扫描,无匹配。

第 4.0 章树存储与线索树补强记录

状态:补入树章节中原先偏文字化的存储选择与线索二叉树过程。

完成日期:2026-07-17。

新增组件:

  • binaryStorageCompareViz:对比完全二叉树数组存储、稀疏树数组空洞和链式表示。
  • threadedTreeViz:展示中序序列、E 的前驱/后继线索,以及 first/next 遍历思路。

嵌入章节:

  • chapters/04-tree.qmd

验证:

  • 运行 quarto render chapters/04-tree.qmd,通过。
  • chapters/04-tree.qmdscripts/course-viz.js 执行制作性语言扫描,无匹配。

第 3.1 章队列应用补强记录

状态:补入杨辉三角队列生成过程,完善队列应用链条。

完成日期:2026-07-17。

新增组件:

  • pascalQueueViz:展示队列保存上一行、按 FIFO 顺序生成下一行、空间为 O(n) 的过程。

嵌入章节:

  • chapters/03-stack-queue.qmd

验证:

  • 运行 quarto render chapters/03-stack-queue.qmd,通过。
  • chapters/03-stack-queue.qmdscripts/course-viz.js 执行制作性语言扫描,无匹配。

第 7 章并查集应用补强记录

状态:补入动态连通性和 Kruskal 两个应用场景的联动动画。

完成日期:2026-07-17。

新增组件:

  • dsuConnectivityViz:展示加边合并连通块、查询时比较代表元。
  • dsuKruskalViz:展示 Kruskal 按边权检查边、选边合并集合、跳过成环边。

嵌入章节:

  • chapters/07-disjoint-set.qmd

验证:

  • 运行 quarto render chapters/07-disjoint-set.qmd,通过。
  • chapters/07-disjoint-set.qmdscripts/course-viz.js 执行制作性语言扫描,无匹配。

全量渲染与语言扫描记录

状态:公共可视化脚本多轮扩展后,完成一次全章节顺序渲染和全局语言扫描。

完成日期:2026-07-17。

渲染章节:

  • 00-visual-templates.qmd
  • 01-introduction.qmd
  • 02-algorithm-analysis.qmd
  • 03-list.qmd
  • 03-stack-queue.qmd
  • 04-tree.qmd
  • 04-specific-trees.qmd
  • 05-hashing.qmd
  • 06-priority-queue.qmd
  • 07-disjoint-set.qmd
  • 08-graph.qmd
  • 09-sorting.qmd

验证结果:

  • 顺序执行全部 quarto render chapters/<chapter>.qmd,全部通过。
  • 对正式章节执行制作性语言扫描,无匹配。
  • scripts/*.js 执行制作性语言与 TODO/FIXME 扫描,无匹配。

当前密度巡检:

  • 01-introduction.qmd:56 页,15 个标准动画引用,16 个代码块,6 个习题/思考页。
  • 02-algorithm-analysis.qmd:46 页,8 个标准动画引用,24 个代码块,8 个习题/思考页。
  • 03-list.qmd:46 页,11 个标准动画引用,15 个代码块,5 个习题/思考页。
  • 03-stack-queue.qmd:35 页,7 个标准动画引用,8 个代码块,4 个习题/思考页。
  • 04-tree.qmd:49 页,5 个标准动画引用,17 个代码块,6 个习题/思考页。
  • 04-specific-trees.qmd:35 页,8 个标准动画引用,8 个代码块,5 个习题/思考页。
  • 05-hashing.qmd:66 页,使用独立 hash-demo 动画系统,3 个代码块,11 个习题/思考页。
  • 06-priority-queue.qmd:26 页,8 个标准动画引用,6 个代码块,3 个习题/思考页。
  • 07-disjoint-set.qmd:19 页,5 个标准动画引用,7 个代码块,3 个习题/思考页。
  • 08-graph.qmd:49 页,11 个标准动画引用,9 个代码块,4 个习题/思考页。
  • 09-sorting.qmd:42 页,9 个标准动画引用,11 个代码块,4 个习题/思考页。

下一轮建议:

  • 第 6、7 章如果要严格达到 4 小时,应扩展应用案例、课堂练习和完整代码实验。
  • 第 4.0 章树结构动画密度偏低,可继续补二叉树存储、线索二叉树、表达式树与 Huffman 编码的细过程。
  • 第 5 章散列仍使用独立动画系统,之后应逐步迁移到标准组件接口。

自检修正:

  • BST 双子树删除初版只展示“根写入后继”,没有同步删除原后继位置。
  • 已修正为:根位置显示后继 53,原 53 标记删除,并将 90 接到新根右侧,避免出现两个 53 的误解。

继续项:

  • AVL 删除后可能一路向上旋转,当前讲义只概述,需要之后补充。

第 4.1 章 B-tree 插入删除专项补强记录

状态:补入 B-tree 最容易混淆的插入分裂与删除再平衡过程。

完成日期:2026-07-17。

新增组件:

  • btreeInsertSplitViz:展示阶为 4 的 B-tree 中插入 25、叶子溢出、提升中间 key、父结点接收、根分裂树高增加。
  • btreeDeleteRebalanceViz:展示删除叶子 key、下溢、向兄弟借位、无法借位时合并、根变矮。

嵌入章节:

  • chapters/04-specific-trees.qmd

验证:

  • 运行 quarto render chapters/04-specific-trees.qmd,通过。
  • chapters/04-specific-trees.qmdscripts/course-viz.js 执行制作性语言扫描,无匹配。

第 2 章算法分析习题图解补强记录

状态:第 2 章原有习题答案保留,并补入图解化计数过程。

完成日期:2026-07-17。

新增组件:

  • selectKthCountViz:展示 selectKth 只执行前 k 轮选择排序,以及比较次数如何逐轮减少。
  • loopGrowthExerciseViz:用矩形、几何级数和嵌套求和图形解释循环复杂度。
  • matrixMultiplyCountViz:展示矩阵乘法中一个结果格子的 n 次累加,以及 n^2 个格子带来的 n^3 总次数。

嵌入章节:

  • chapters/02-algorithm-analysis.qmd

验证:

  • 运行 quarto render chapters/02-algorithm-analysis.qmd,通过。
  • chapters/02-algorithm-analysis.qmdscripts/course-viz.js 执行制作性语言扫描,无匹配。

自检修正:

  • 巡检脚本初版只统计“练习/思考”,漏掉“习题”。之后全局统计应同时包含“习题”。
  • 新增脚本注释中出现扫描词“后续”,已改为“之后”,保证交付扫描稳定。

第 1 章全课程 C++ 语法索引补强记录

状态:已补入学生可直接使用的全课程 C++ 语法工具箱。

完成日期:2026-07-17。

新增内容:

  • 集中列出模板、引用、指针、nullptr、STL 容器、STL 适配器、auto、比较器、std::optionalenum class
  • 说明这些语言工具分别服务于容器复用、结构连接、错误表达和比较规则。
  • 与后面章节的栈、队列、优先队列、树、散列和图代码形成前置索引。

验证:

  • 运行 quarto render chapters/01-introduction.qmd,通过。
  • chapters/01-introduction.qmd 执行制作性语言扫描,无匹配。

第 7 章 parent 数组与复杂度对照补强记录

状态:已补强并查集最容易跳步的实现表示和复杂度认知桥梁。

完成日期:2026-07-17。

新增组件:

  • dsuParentTraceViz:同步展示操作、parent 数组、森林形态与等价类变化。
  • dsuAmortizedCompareViz:用同一组 find 路径长度对照简单合并、按秩合并、路径压缩和二者结合。

嵌入章节:

  • chapters/07-disjoint-set.qmd

验证:

  • 运行 quarto render chapters/07-disjoint-set.qmd,通过。
  • chapters/07-disjoint-set.qmdscripts/course-viz.js 执行制作性语言扫描,无匹配。

第 6 章优先队列练习图解补强记录

状态:已把关键练习答案从文字过程升级为逐帧图解。

完成日期:2026-07-17。

新增组件:

  • heapInsertExerciseViz:最小堆插入 3,展示末尾放置、逐级比较、父结点下移、空洞上移和最终放入。
  • heapCheckExerciseViz:判断数组是否为最大堆,展示只检查内部结点以及每个父子关系的局部约束。

嵌入章节:

  • chapters/06-priority-queue.qmd

验证:

  • 运行 quarto render chapters/06-priority-queue.qmd,通过。
  • chapters/06-priority-queue.qmdscripts/course-viz.js 执行制作性语言扫描,无匹配。

第 3.1 章循环队列练习图解补强记录

状态:已把循环队列 rear + length 公式练习改为逐帧图解。

完成日期:2026-07-17。

新增组件:

  • circularQueueExerciseViz:展示由 rearlength 反推 front 的代入、加模长、取模、跨尾读取、队空和队满判定。

嵌入章节:

  • chapters/03-stack-queue.qmd

验证:

  • 运行 quarto render chapters/03-stack-queue.qmd,通过。
  • chapters/03-stack-queue.qmdscripts/course-viz.js 执行制作性语言扫描,无匹配。

全章节渲染与密度巡检记录

状态:本轮新增内容已通过全章节构建和交付语言扫描。

完成日期:2026-07-17。

验证:

  • 顺序运行全部 quarto render chapters/<chapter>.qmd,全部通过。
  • 对正式章节执行制作性语言扫描,无匹配。
  • scripts/*.js 执行制作性语言与 TODO/FIXME 扫描,无匹配。
  • 本机当前没有可用 node 命令,未执行 node --check scripts/course-viz.js

当前密度巡检:

  • 01-introduction.qmd:57 页,15 个标准动画引用,17 个代码块,6 个习题/思考页。
  • 02-algorithm-analysis.qmd:46 页,8 个标准动画引用,24 个代码块,10 个习题/思考页。
  • 03-list.qmd:46 页,11 个标准动画引用,17 个代码块,5 个习题/思考页。
  • 03-stack-queue.qmd:35 页,9 个标准动画引用,11 个代码块,4 个习题/思考页。
  • 04-tree.qmd:49 页,7 个标准动画引用,20 个代码块,6 个习题/思考页。
  • 04-specific-trees.qmd:35 页,8 个标准动画引用,12 个代码块,5 个习题/思考页。
  • 05-hashing.qmd:66 页,使用独立 hash-demo 动画系统,17 个代码块,11 个习题/思考页。
  • 06-priority-queue.qmd:27 页,11 个标准动画引用,7 个代码块,3 个习题/思考页。
  • 07-disjoint-set.qmd:21 页,9 个标准动画引用,7 个代码块,3 个习题/思考页。
  • 08-graph.qmd:49 页,11 个标准动画引用,13 个代码块,4 个习题/思考页。
  • 09-sorting.qmd:42 页,9 个标准动画引用,12 个代码块,4 个习题/思考页。

细粒度复查记录

状态:本轮根据“再检查”要求完成更细的构建、语言、脚本、资源和代码包复查。

完成日期:2026-07-17。

修正:

  • chapters/01-introduction.qmd 中“算法好不好”改为“算法效率与资源代价”,正式表述更稳定。
  • 删除 scripts/course-viz.js 中未被正式章节引用的旧 recursionStack 组件,避免低标准旧动画留在脚本中。

验证:

  • 顺序运行全部 quarto render chapters/<chapter>.qmd,全部通过。
  • 正式章节制作性语言、草稿词、明显负面词扫描,无匹配。
  • scripts/*.js 制作性语言与 TODO/FIXME 扫描,无匹配。
  • 检查所有 data-viz 引用,108 个唯一引用均有 registry 条目。
  • 检查未引用 registry 函数,无剩余未引用函数。
  • 检查核心 CSS、JS、branding 图片和 hash-table-demo.zip 资源存在,全部存在。
  • 使用 Node REPL 动态导入 course-viz.jshash-demo.jscourse-branding.jscourse-keyboard.jscourse-branding-data.js,全部通过。
  • 检查 _site/chapters/*.html,无 Unknown vizSyntaxErrorReferenceErrorTODOFIXME
  • 重新编译并运行 assets/cpp/hash-table-demo,输出 all hash table demos passed
  • 解压 assets/hash-table-demo.zip 并与源码 SHA256 对比,zip 与源码一致。

当前密度巡检:

  • 01-introduction.qmd:57 页,15 个标准动画引用,17 个代码块,6 个习题/思考页。
  • 02-algorithm-analysis.qmd:46 页,8 个标准动画引用,24 个代码块,10 个习题/思考页。
  • 03-list.qmd:46 页,11 个标准动画引用,17 个代码块,5 个习题/思考页。
  • 03-stack-queue.qmd:35 页,9 个标准动画引用,11 个代码块,4 个习题/思考页。
  • 04-tree.qmd:49 页,7 个标准动画引用,20 个代码块,6 个习题/思考页。
  • 04-specific-trees.qmd:35 页,8 个标准动画引用,12 个代码块,5 个习题/思考页。
  • 05-hashing.qmd:66 页,使用独立 hash-demo 动画系统,17 个代码块,11 个习题/思考页。
  • 06-priority-queue.qmd:27 页,11 个标准动画引用,7 个代码块,3 个习题/思考页。
  • 07-disjoint-set.qmd:21 页,9 个标准动画引用,7 个代码块,3 个习题/思考页。
  • 08-graph.qmd:49 页,11 个标准动画引用,13 个代码块,4 个习题/思考页。
  • 09-sorting.qmd:42 页,9 个标准动画引用,12 个代码块,4 个习题/思考页。

每页/每帧逻辑审计与素材补强记录

状态:已建立可重复运行的页面/帧逻辑审计流程,并完成第一轮素材化和开场逻辑补强。

完成日期:2026-07-17。

新增文件:

  • scripts/audit-frame-logic.ps1:从章节 QMD 与 course-viz.js 还原每页标题、动画组件、估计帧数、代码块、公式、表格、bullet 与风险标记。
  • drafts/frame-logic-audit.md:当前全章节页面/帧逻辑审计报告。
  • assets/external/icons/*.svg:从 Simple Icons CDN 下载的 Redis、PostgreSQL、Neo4j、Kafka、Linux、C++、Python、JavaScript 图标素材。
  • assets/external/SOURCES.md:外部素材来源、授权和链接记录。

已补强页面:

  • chapters/01-introduction.qmd:在“这些知识会在哪里用到”加入行业系统素材带;拆分“全课程 C++ 语法”长表,增加读代码顺序。
  • chapters/03-stack-queue.qmd:在开场加入函数调用、Linux、Kafka、JavaScript 事件循环等视觉案例。
  • chapters/05-hashing.qmd:在“大规模系统中的散列”加入 Redis、PostgreSQL、Kafka、Python 等视觉案例。
  • chapters/06-priority-queue.qmd:在开场加入 Linux 调度、Kafka 事件、PostgreSQL Top-N、C++ STL 等视觉案例。
  • chapters/08-graph.qmd:在开场加入 Neo4j、Linux、Kafka、PostgreSQL 等关系网络案例。

审计结论:

  • 审计报告能定位 dense-no-vizcode-no-vizexercise-no-vizlong-tableviz-short
  • 当前剩余集中问题主要是习题答案页图解不足,以及若干长表需要图解化或拆页。
  • code-no-viz 中部分是代码页,需要之后继续接入代码走读/行号同步;散列代码页已通过 data-code-walk 处理,审计脚本已识别代码走读。

验证:

  • 运行改动章节局部渲染,通过。
  • 运行全章节 quarto render chapters/<chapter>.qmd,通过。
  • 正式章节制作性语言扫描,无匹配。
  • _site/chapters/*.htmlUnknown vizSyntaxErrorReferenceError、未解析 fenced div。
  • 外部素材文件存在性检查通过。

习题答案图解化补强记录

状态:已完成一轮跨章节习题答案图解化,把“直接给答案”的页面改为先展示过程、再落到公式或代码结论。

完成日期:2026-07-17。

新增或接入组件:

  • 第 2 章:tripleLoopOneExerciseViztripleLoopTwoExerciseViznestedSumExerciseVizwhileLoopExerciseViz
  • 第 3.0 章:arrayDeleteMoveExerciseVizsinglyDeleteExerciseVizpolynomialAddExerciseVizreverseListExerciseViz
  • 第 3.1 章:printBufferExerciseVizstackCapacityExerciseVizrotateLeftExerciseViz
  • 第 4.0 章:leafFormulaExerciseVizcompleteTreeMaxExerciseVizgeneralTreeLeavesExerciseVizcountLeavesExerciseVizmirrorTreeExerciseVizhuffmanPropertyExerciseViz
  • 第 5 章:习题 3、习题 4 接入标准 hash-demo;新增 hashAslExerciseViz 解释成功查找 ASL。
  • 第 6 章:heapSortComplexityExerciseViz
  • 第 7 章:dsuEquivalenceExerciseVizdsuPathExerciseVizdsuKruskalExerciseViz
  • 第 8 章:connectedGraphExerciseVizbadShortestGreedyExerciseViztopologicalExerciseVizmstCompareExerciseViz
  • 第 9 章:insertionSortExerciseVizsecondPassSortExerciseVizmergeSortExerciseVizheapStabilityExerciseViz

审计脚本更新:

  • scripts/audit-frame-logic.ps1 现在同时识别 data-viz 与哈希章节使用的 data-demo
  • data-code-walkcode-step-notescode-viz-sync 继续作为代码页可视化支持信号。

验证:

  • 使用 Node REPL 动态导入 course-viz.jshash-demo.jscourse-branding.jscourse-keyboard.jscourse-branding-data.js,全部通过。
  • 局部渲染 02-algorithm-analysis.qmd03-list.qmd04-tree.qmd05-hashing.qmd08-graph.qmd09-sorting.qmd,全部通过。
  • 重新生成 drafts/frame-logic-audit.md,本轮目标习题页均为 ok
  • 正式章节制作性语言、草稿词、明显负面词扫描,无匹配。

代码走读、覆盖审计与最终验证记录

状态:已把全章节代码页接入字符串锚点式 data-code-walk-match,并建立原始 PPT 主题覆盖审计。

完成日期:2026-07-17。

新增或强化的机制:

  • scripts/resolve_code_walks.py:使用代码中的字符串锚点自动生成高亮行号,避免手工硬编码行号漂移。
  • scripts/audit_reference_coverage.py:对照 reference-text/ 中的原始 PPT 文本,逐章检查核心主题覆盖。
  • scripts/audit-frame-logic.ps1:补充识别相邻习题答案页,避免把题面页误报为缺少图解。
  • drafts/reference-coverage-audit.md:记录每章原始页数、新稿页数和主题覆盖结果。
  • drafts/final-course-validation.md:记录本轮最终验收命令、结果和残余风险。

当前验证结果:

  • 全部含 data-code-walk-match 的章节通过 resolve_code_walks.py --check
  • 全章节 Quarto 顺序渲染通过。
  • 原始 PPT 主题覆盖审计结果为 PASS
  • 帧逻辑审计中无 dense-no-vizcode-no-vizexercise-no-viz 页面行。
  • 正式章节无“草稿、原PPT、补充、TODO、FIXME”等制作性或草稿性词语。
  • 课程脚本通过 Node REPL 动态导入检查。
  • assets/cpp/hash-table-demoassets/hash-table-demo.zip 解包后均能编译运行;zip 在过长中文路径下触发 MSBuild 路径问题,在短 ASCII 路径下通过。

后续章节或重构必须保持:

  • 新增代码页必须使用 data-code-walk-match,不要手写行号。
  • 新增章节必须更新 scripts/audit_reference_coverage.py 的主题词表。
  • 习题答案优先用标准可视化组件或 hash-demo,题面页可以由紧随其后的答案页支撑。
  • 最终交付前必须重跑 drafts/final-course-validation.md 中列出的 gate。