高级数据结构与算法分析¶
这是 2026-2027 学年秋冬学期计算机科学与技术学院王灿老师开设的《高级数据结构与算法分析》课程的笔记。
Note
课程信息
- 课程名称:数据结构与算法
- 课程代码:CS2045M
- 任课教师:王灿
- 开课院系:计算机科学与技术学院
- 开课学期:2026-2027 学年秋冬学期
- 学分:3.0 学分
- 参考资料:PPT, OI Wiki
Warning
考试信息
课程笔记¶
| 讲次 | 主题 |
|---|---|
| 第一讲 | AVL 树、Splay 树与均摊分析 |
| 第二讲 | 红黑树与 B+ 树 |
| 第三讲 | 倒排索引 |
| 第四讲 | 左倾堆与斜堆 |
| 第五讲 | 二项队列 |
课程项目¶
这门课的实验项目(laboratory projects)每次都要交一份报告,并在课上做展示。下面把要求整理在一起,动手写之前照着对一遍。
报告结构¶
封面写清报告标题、作者名单和日期(yyyy-mm-dd),正文按下面几章组织:
| 章节 | 内容 |
|---|---|
| Chapter 1 Introduction | 问题描述、报告目的,以及用到的数据结构和算法的背景,要求简洁 |
| Chapter 2 Data Structure / Algorithm Specification | 所有算法的描述(建议用伪代码)和主要数据结构的规格;如果是自己设计的新结构,放在这一章 |
| Chapter 3 Testing Results | 测试用例表,每条写清测试目的、预期结果、实际行为、出问题时的可能原因,以及状态(pass / corrected / pending) |
| Chapter 4 Analysis and Comments | 时间与空间复杂度分析、与其他数据结构或算法的比较、可以继续改进的地方 |
| Appendix: Source Code | 源码,至少 30% 的行要有注释,否则代码部分不计分 |
| References | 参考文献,格式见下 |
| Author List | 写明每个人做了什么,用来支撑署名 |
| Declaration / Signatures | 独立性声明,每位作者签名 |
参考文献格式:
| Text Only | |
|---|---|
以上是最低要求,每次项目还会另外补充具体要求。
打包与提交¶
交上去的是一个 zip,结构大致是:
| Text Only | |
|---|---|
不需要写代码的项目可以不放 code 目录。提交分两步:
- 提交同行评审:用组长的个人账号在 pintia.cn 上提交。所有提交的文档里不能出现任何组员身份信息,包括姓名、学号、昵称、组号以及文件属性里的作者、上次修改者等。身份泄露按作弊处理,整组零分。
- 提交给助教:修改后的报告仍在 pintia.cn 上提交,放在另一个题目集里,打包成 zip,报告必须是 PDF。报告和源码的文件名按
Teacher_2024G##_ProjectNumber.*命名,例如cy_2024G03_P2.pdf表示任课教师缩写为 cy、第 03 组、项目 2(年份和组号按当学期发放的为准)。
迟交与罚则¶
每次作业在指定日期的 22:00 截止,提交入口到点自动关闭。
- 同行评审没有补救机会,错过截止时间直接零分;
- 最终报告在当天 22:01 到 23:59 之间提交扣 5%,过了当天每迟一天扣 10%(补交要发邮件给任课教师);
- 展示如果推迟到下一周,每周扣 50%。
课堂展示¶
展示至少要讲清五件事:项目标题、问题介绍、用到的关键数据结构和算法、测试结果、结论与评论。
展示在课上按随机顺序进行,第一个组最多 12 分钟,其余各组 10 分钟,超时扣 5%。不要重复前面组已经讲过的内容,重点讲自己的做法里独特的地方。所有参与者要提前 15 分钟到场调试设备并确定主讲人,每迟到一分钟扣 5%;主讲人从所有参与者里随机抽。没有参与报告工作、或者无故缺席展示的成员记零分。
评分由其他组和老师共同给出:其他组的分数去掉一个最高分和一个最低分后取平均记为 \(p_1\),老师给的分数记为 \(p_2\),最终得分是 \((p_1 + p_2) / 2\)。组间打分按三张表来评:展示材料的质量(可接受 / 不可接受)、展示的正确性(缺席 / 错误太多 / 有少量错误但可接受 / 基本正确但问答不够好 / 完美)、展示的清晰度(缺席或不可接受 / 可接受)。
同行评审(Peer Review)¶
同行评审是让同学互相评阅报告,规则如下:
- 提交的文档里不能出现组员身份信息,泄露即按作弊处理,整组零分;
- 每个组要在截止时间前评阅其他组的 2 份报告;
- 少评一份,从这组的 PR 总分里扣 20 分;
- 一份报告的所有评分中,最高分与最低分之差不超过老师设定的阈值(本学期 4 分)时取平均分作为最终成绩,否则交给老师仲裁;
- 老师有权对任何分数异常的报告进行仲裁;
- 进入仲裁后,以老师的判断为准:设老师给 \(T\) 分、某组给 \(G\) 分,若 \(|G - T|\) 超过容差 \(\text{TOL}\)(本学期 4 分),该组要从 PR 总分里扣 \(|G - T| - \text{TOL}\) 分;
- 评审结束后,各组还要给评阅人打分,结果只作为反馈给评阅人,不影响他们的成绩,但会影响评阅人下次评审时的意见权重。
写评审意见时,课程给了几条建议:
- 先把文档完整读一遍,再写第一条意见;
- 优点和缺点都要说,给建议而不是下命令;
- 意见要具体到文本,别只说 "unclear" 或者 "vague" 这种没法落地的词;
- 站在读者角度把疑问提出来;
- 别让自己的偏好影响判断,比如不同意作者的观点就要求重写;
- 提交之前把自己的意见再读一遍,确认讲得清楚、跟得上。
提交前清掉个人信息¶
课程发过一份专门的清单,下面按文件类型整理(详细步骤可以对照原文档操作):
| 文件 / 工具 | 可能泄露什么 | 怎么处理 |
|---|---|---|
| Word / PPT / Excel | 文件属性里的 Author、Last Modified By | 右键文件 → 属性 → 详细信息 → "删除属性和个人信息";清完不要再编辑 |
| 图片 | JPEG 的 EXIF(相机型号、GPS、拍摄时间),截图里的窗口标题还可能带上 .exe 路径 |
用工具清掉 EXIF;截图前注意别把带路径的窗口拍进去;也可以用 strings 扫一眼图片里有没有能读出身份的明文 |
| Visual Studio | .sln、.vcxproj、.filters、.user 里的 IncludePath 绝对路径,.vs 目录(含 slnx.sqlite),Debug 目录里的 Name.log、Name.pdb |
删掉 Debug/,逐个检查 .sln 和 .vs;PDB 可以用 cvdump.exe 查看内容 |
| Dev C++ | .dev 文件里的 Includes= 绝对路径 |
打开 .dev 检查,确认没有绝对路径 |
| VS Code | .vscode 目录里的 miDebuggerPath、args 等绝对路径 |
直接删掉 .vscode/ |
| macOS 压缩包 | .DS_Store 会泄露目录结构 |
打包前删掉 .DS_Store |
| Markdown | 图床链接可能暴露身份(例如从图片链接推出微博 uid、自建图床域名),绝对路径图片会带出用户名 | 尽量交 PDF,不要交 .md |
| Git | .git 目录里的 upstream URL、git config --local 的用户名和邮箱、git log |
打包前删掉 .git |
总的原则是:提交的文件越少越好,能用 PDF 就用 PDF;如果必须交 Office 文件,先按上面的步骤做一份匿名副本。