跳转至

高级数据结构与算法分析

这是 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
1
2
3
[1] Author, "Title of the article", Name of the journal, page no., (year)
[2] Author, "Title of the book", Name of the publisher, year
[3] Author, "Title of the article", Web site links

以上是最低要求,每次项目还会另外补充具体要求。

打包与提交

交上去的是一个 zip,结构大致是:

Text Only
1
2
3
4
5
****.zip
├── documents        报告等文档;如果有多个文件,附一个 readme.txt 说明浏览顺序
└── code             需要写代码时才有
    ├── *.c / *.h    源码
    └── Readme.txt   怎么编译可执行文件、怎么运行

不需要写代码的项目可以不放 code 目录。提交分两步:

  1. 提交同行评审:用组长的个人账号在 pintia.cn 上提交。所有提交的文档里不能出现任何组员身份信息,包括姓名、学号、昵称、组号以及文件属性里的作者、上次修改者等。身份泄露按作弊处理,整组零分。
  2. 提交给助教:修改后的报告仍在 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)

同行评审是让同学互相评阅报告,规则如下:

  1. 提交的文档里不能出现组员身份信息,泄露即按作弊处理,整组零分;
  2. 每个组要在截止时间前评阅其他组的 2 份报告;
  3. 少评一份,从这组的 PR 总分里扣 20 分;
  4. 一份报告的所有评分中,最高分与最低分之差不超过老师设定的阈值(本学期 4 分)时取平均分作为最终成绩,否则交给老师仲裁;
  5. 老师有权对任何分数异常的报告进行仲裁;
  6. 进入仲裁后,以老师的判断为准:设老师给 \(T\) 分、某组给 \(G\) 分,若 \(|G - T|\) 超过容差 \(\text{TOL}\)(本学期 4 分),该组要从 PR 总分里扣 \(|G - T| - \text{TOL}\) 分;
  7. 评审结束后,各组还要给评阅人打分,结果只作为反馈给评阅人,不影响他们的成绩,但会影响评阅人下次评审时的意见权重。

写评审意见时,课程给了几条建议:

  • 先把文档完整读一遍,再写第一条意见;
  • 优点和缺点都要说,给建议而不是下命令;
  • 意见要具体到文本,别只说 "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 文件,先按上面的步骤做一份匿名副本。