经常有人问我:大学里那么多计算机课程,哪些值得整理成自己的知识体系?我这段时间整理了一份2021年山东大学数据可视化、数据科学导论、OS、数据库的试题汇总和个人知识点整理,四门课一锅端。这份资料原本是给自己期末复习用的,但整理完发现,它其实反映了一个计算机专业学生从入门到进阶的一整条主线。如果你正在准备这几门课的考试,或者想把“数据科学”这块拼图凑完整,这篇文章里的拆解思路和知识点梳理,应该能帮你少踩不少坑。
先说结论:这四门课不是孤立的。数据科学导论负责讲“数据从哪来、怎么分析”,数据可视化负责讲“分析完怎么展示”,数据库负责讲“数据往哪存、怎么查”,操作系统负责讲“底层计算资源怎么调度”。表面上它们是四张试卷,实际上是一条完整的数据流水线。我整理资料时最大的感受就是:很多考点是跨课程串在一起的,比如数据库的事务并发控制,本质上就是操作系统里进程同步的一个应用场景。所以这份整理不是简单地把四门课的知识点罗列出来,而是把它们放到一条主线上重新编织了一遍。
如果你时间紧,只想应付考试,那这份整理的试题汇总部分可以直接上手刷;如果你想真正把知识串起来,建议还是从第2章的知识点拆解开始看。下面我按自己整理的顺序,把这四门课的核心内容、资料制作方法、复习实操和踩过的坑一次讲清楚。
1. 四门课为什么值得一起整理:从课程地图到复习策略
1.1 四门课在数据科学主线中的位置
我一开始也没想把这四门课放一起,是复习到后面才反应过来——它们其实构成了一条非常清晰的数据链路。
数据库是这条链路的起点。不管是做数据分析还是做可视化,数据总得先有个地方存放。MySQL、SQL Server这类关系型数据库怎么设计表结构、怎么写查询语句、怎么保证数据一致性,是后续所有环节的前提。数据科学导论接着往下走,它讲的是拿到数据之后怎么做清洗、怎么做特征处理、怎么训练一个简单的模型。这一步处理完之后,结果往往是数值型的指标或者统计量,光看数字很难让老师或者领导快速理解,于是就需要数据可视化出场——用条形图、散点图、热力图把结论变成一眼能看懂的东西。
那操作系统在哪里?它是所有环节的底座。你的Python进程在跑数据清洗时,操作系统怎么分配CPU时间片、怎么管理内存里的页面、怎么调度磁盘IO,直接决定了你跑一个数据集是几十秒还是几分钟。更直接的是,数据库服务本身就是一个多进程/多线程程序,它底层的锁机制、缓冲池管理,跟操作系统的同步互斥、页面置换算法几乎是一回事。
我当时整理知识点时用了一个比喻:数据库是仓库,OS是仓库管理员,数据科学导论是分拣员,可视化是橱窗设计师。仓库要能高效存取,管理员要决定货架怎么摆、人怎么排队,分拣员要决定哪些货物该放一起、哪些要扔掉,设计师则要把最终成果摆成客户愿意看的形态。四门课各管一段,但互相之间大量重叠。
1.2 2021年这份资料的背景与取舍
为什么强调2021年?因为这份资料的考点频次统计、题型分布都基于那一年的课程重点和真题。计算机课程几年内核心框架不会大变,但每一年的重点会有微调。比如2021年数据库课程里对“执行计划”和“数据库连接池”的考查明显比往年多,这可能是因为实际工程项目里这两块越来越常被提到。如果你拿这份资料去套2024年的考试,建议以讲义为基准,用我总结的方法重新标注一遍重点。
整理时我给自己定了三条取舍原则:第一,以课堂讲义和真题为绝对主线,网上的教程只做补充,不喧宾夺主;第二,凡是讲义里反复出现、真题里考过三次以上的知识点,全部做详细拆解,其余只留一句话索引;第三,凡是需要动手的操作性内容——比如写SQL、画流程图、算调度算法——必须配上可执行的例子,绝不只写概念。按这三条筛下来,每门课的笔记基本控制在30到50页,复习时可以完整过两遍。
有个地方容易被忽略:我特意把“试题汇总”和“基本知识点整理”分成两个独立文档。试题汇总按题型分类,纯粹用来刷;知识点整理按课程逻辑编排,用来理解。如果混在一起,刷题时会被大段概念打断,复习概念时又老想着题目,效率非常低。这一点后面第3章会再细讲。
2. 核心知识点拆解:四门课的高频考点与底层逻辑
2.1 数据可视化:视觉编码、图形语法与工具落地
数据可视化这门课,表面上考的是图表类型和工具使用,但底层核心是视觉编码。人的视觉系统对不同视觉通道的感知精度差异极大:对位置和长度的感知最准,对颜色的感知最弱。所以做条形图时柱子的高度差能被人精确感知,但用色块深浅表示数值差异时就非常容易被误读。考试里如果问“哪种图表适合显示精确数值对比”,优先选条形图而不是面积图,原因就在这里。
图表选型是另一类高频题。我的笔记里整理了一张表,基本上把常见的图表类型和适用场景对应了起来:
| 数据类型 | 适合的图表 | 核心优势 |
|---|---|---|
| 类别对比 | 条形图、水平条形图 | 长度编码精确,类别顺序可调 |
| 时间趋势 | 折线图 | 连续变化直观,可叠加多序列 |
| 分布情况 | 直方图、箱线图 | 直方图看形态,箱线图看离群点 |
| 组成结构 | 堆叠条形图(不用饼图) | 饼图误差大,堆叠条形更好比较 |
| 两个变量关系 | 散点图 | 一眼看出正相关、负相关或聚类 |
| 地理数据 | 地图+气泡/热力 | 空间分布一目了然 |
关于饼图多说一句:饼图在考试里常被当作“常识题”考,问它有什么缺陷。标准答案是:人对角度的感知远不如对长度的感知,饼图各扇区的比例差异很难被准确估计。实际工作中我也很少用饼图,除非类别只有两三个且差异很大。
工具部分,2021年最常用的还是ECharts。ECharts的核心思路是“配置项驱动”——你写一个option对象,里面定义数据、坐标系、样式,图表就渲染出来了。一个精简的柱状图配置长这样:
// ECharts 柱状图最小可运行示例 var option = { title: { text: '各季度销量' }, tooltip: {}, xAxis: { data: ['Q1', 'Q2', 'Q3', 'Q4'] }, yAxis: {}, series: [{ name: '销量', type: 'bar', data: [420, 535, 610, 780] }] }; // 初始化并渲染 var chart = echarts.init(document.getElementById('main')); chart.setOption(option);实操里最容易翻车的地方有三个:第一,xAxis和series里的数据必须一一对应,对不齐就是白屏或者错位;第二,ECharts默认是异步加载数据,如果从后端接口拿JSON,要先确保数据格式是数组,而不是对象套对象;第三,地图类图表需要额外注册地图数据,不注册就会报错。这些细节在考试里未必考,但课程设计里一定会遇到。2021年的课程项目里有个“农产品价格数据可视化”是Flask+ECharts的组合,前端用ECharts画图,后端用Flask提供JSON接口,中间最常出的问题就是跨域和数据结构不匹配,这两个我踩过,后面会列进避坑清单。
2.2 数据科学导论:从数据采集到模型评估的完整链路
数据科学导论这门课,本质是在讲数据工作的完整流程。一般分成五个环节:数据采集、数据清洗、特征工程、模型训练、评估与汇报。考试很少直接考“流程是什么”这种送分题,更多是让你在一个具体场景里判断每一步该做什么。
数据采集阶段,常见的手段有直接下载公开数据集、写爬虫抓取网页、调用API接口。课程里爬虫不需要写得多深,但一定要知道requests和BeautifulSoup的基本用法,以及怎么处理返回的JSON数据。我复习时把这部分简化成一句话:请求网页、解析内容、提取字段、存入csv或数据库。整个流程代码量不大,但每一步都可能出错——编码问题、请求头缺失、反爬封IP,这些在实际项目里非常常见。
数据清洗是考试和实践的双重重点。缺省值处理是最基础的问题:可以删除、可以用均值/中位数填充、也可以用前后值填充,选择依据是数据缺失是否随机。异常值检测则常用箱线图的IQR方法——超过Q1-1.5IQR或Q3+1.5IQR的点视为异常。特征工程里,标准化和归一化的区别是高频考点:标准化(StandardScaler)让数据服从均值为0、方差为1的分布,适合正态分布数据;归一化(MinMaxScaler)把数据压缩到[0,1]区间,适合有明确上下界的场景。
模型部分,分类和回归各掌握两三个经典算法就够了。分类重点看逻辑回归、决策树,回归重点看线性回归。需要背下来的是评估指标:
- 分类任务:准确率、精确率、召回率、F1值,以及混淆矩阵的含义。考试常设“类别不平衡”的场景,这时准确率会骗人,应该看精确率和召回率。
- 回归任务:均方误差(MSE)、均方根误差(RMSE)、R²分数。R²越接近1说明模型拟合越好,接近0说明模型基本没学到规律。
过拟合也是必考概念。比如决策树不限制深度,可以完美分类训练集,但测试集上一塌糊涂。解决手段有剪枝、加正则项、用交叉验证选参数。我复习时画了一条简化的处理链路:“数据标准化 → 切分训练测试集 → 简单模型baseline → 逐步调参 → 交叉验证 → 评估指标对比”,这套流程在课程作业里基本是万能壳。
2.3 操作系统:进程、内存与经典算法
操作系统这门课的内容量大,但考点非常集中。我统计的2021年山东大学OS真题里,四块内容占了绝大部分:进程与线程、CPU调度、内存管理、同步互斥与死锁。文件系统和磁盘调度偶尔出现,但分值不高。
进程和线程的区别是必考。标准答法是:进程是资源分配的基本单位,线程是CPU调度的基本单位;进程之间互相独立,线程之间共享进程资源;切换进程的开销远大于切换线程,因为进程切换涉及地址空间切换,线程切换只涉及栈和寄存器。延伸考点还有孤儿进程和僵尸进程:孤儿进程被init进程收养,僵尸进程是子进程结束但父进程没回收它的返回状态,长期存在会消耗进程表项。
CPU调度算法的对比,我一直建议用浓缩表来记:
| 算法 | 特点 | 优点 | 缺点 |
|---|---|---|---|
| 先来先服务 FCFS | 按到达顺序 | 简单、公平 | 平均等待时间可能很长 |
| 短作业优先 SJF | 按运行时间短优先 | 平均等待时间最短 | 长作业可能饥饿 |
| 时间片轮转 RR | 按时间片轮流 | 响应快,交互性好 | 时间片大小难权衡 |
| 优先级调度 | 按优先级 | 灵活 | 低优先级可能饥饿 |
考计算题时,最关键的是先确认题目是否允许抢占,不允许抢占和允许抢占算出来的平均等待时间完全不同。我复习时每一类算法都各算了两遍例题,还把SJF的“不可抢占”版本单独标注出来,因为出错率非常高。
同步互斥这块,核心是信号量机制。P操作(wait)是申请资源,V操作(signal)是释放资源。经典的读者-写者问题和哲学家进餐问题,考试偏好考信号量初值设置和代码补全。我踩过的一个坑是把互斥信号量的初值设成0——互斥信号量初值必须是1,只有同步信号量(比如表示缓冲区空位/满位)初值才可以是其他数。
死锁是另一个必考点。四个必要条件:互斥、持有并等待、不可剥夺、循环等待。处理办法四种:预防、避免、检测、解除。其中“避免”的核心是银行家算法,考计算题时流程是:检查剩余资源够不够满足某个进程的最大需求,够就假定分配给它,执行完再回收资源,依次判断是否所有进程都能完成。这个算法本质上是在模拟“是否存在安全序列”。
内存管理里,分页和分段要分清。分页是物理上划分固定大小块,为了内存利用率;分段是逻辑上按模块划分,为了便于共享和保护。页面置换算法考FIFO、LRU、OPT。FIFO最简单,但可能有Belady异常——分配更多物理块反而缺页更多;LRU是最近最久未使用,实现成本高但效果接近最优;OPT是理论最优的“向后看”算法,考试会让你手动模拟页面访问序列,算出缺页次数。
2.4 数据库:从ER模型到事务与索引
数据库是四门课里实操性最强的一门。知识点可以分成四层:数据模型与ER设计、关系代数和SQL、范式理论、事务与索引。
ER模型转关系表是送分题但容易马虎。核心规则只有几条:实体转成表,实体的属性转成字段;一对多关系把“一”那一侧的主键放到“多”那一侧当外键;多对多关系必须单独建一张中间表,字段是两边的主键合起来。最容易失分的点是一对一关系的处理——是要合并成一张表还是用外键关联,取决于两个实体的访问频率,访问频率接近就合并。
SQL部分是考试大头,重点集中在增删改查。查语句的复杂度基本体现在JOIN、子查询、聚合函数的组合使用上。比如“查询每个学生的选课数量,且只显示选课数大于2的学生”,写法如下:
SELECT s.student_name, COUNT(c.course_id) AS course_cnt FROM student s LEFT JOIN course_selection c ON s.student_id = c.student_id GROUP BY s.student_id, s.student_name HAVING COUNT(c.course_id) > 2 ORDER BY course_cnt DESC;这里有三个容易失分的点:第一,用了GROUP BY之后,SELECT里出现的非聚合列必须也出现在GROUP BY里,MySQL比较宽松但考试按标准SQL判分;第二,是“在分组前过滤用WHERE、在分组后过滤用HAVING”,这个顺序不能反;第三,统计“没选课的学生”时用LEFT JOIN,条件要写在JOIN的ON后面,而不是写在WHERE里,否则左连接会退化成内连接。
范式理论的核心就是判断关系模式属于第几范式。判断顺序是:先找主键,再看有没有部分依赖(违反2NF),再看有没有传递依赖(违反3NF),再看所有依赖的左侧是否都包含主键(违反BCNF)。我在笔记里记了一个速查判断表:非主属性对主键部分依赖→1NF;消除了部分依赖→2NF;消除了传递依赖→3NF;所有函数依赖左侧都是超键→BCNF。
事务和索引是2021年考试里明显加重的部分。事务ACID四个特性必须能展开说:原子性靠undo log,一致性靠应用逻辑和约束,隔离性靠锁或版本控制,持久性靠redo log。隔离级别从低到高是读未提交、读已提交、可重复读、串行化,每种级别解决了什么问题、还遗留什么问题,是简答题高频考点。索引方面,最常问的是B+树为什么适合做索引——它是多叉树,高度低,磁盘IO次数少,叶子节点形成链表,适合范围查询。另外要会看执行计划里的type字段,从const到ref到range到ALL,走全表扫描时性能最容易出问题。2021年的考题里出现过“数据库连接池的作用”这道简答,核心答法是:连接池复用连接,减少频繁建立/断开连接的开销,同时限制并发连接数,保护数据库不被打满。
3. 试题汇总与个人知识点整理的实操方法
3.1 真题汇总的思路:从试卷到考点地图
很多人拿到历年真题后直接把卷子看一遍就完事,这效率太低了。我的做法是先把所有题目“打散”,按知识点重新归类,再做频次统计。比如数据库这门课,我会把卷子里每道题标上它对应的知识点标签,是“范式判断”还是“SQL查询”还是“事务隔离级别”,然后统计每个标签出现的次数。这样到复习后期,一眼就能看出今年大概率考哪里。
统计完频次之后,我会做一张“考点地图”。横向是四门课的知识点,纵向是年份或试卷编号,交叉处填题目分值。这样做出来之后,高频考点和冷门考点的对比特别清楚。2021年我统计下来,数据可视化里图形语法和图表选型占了60%以上的分值,OS里调度算法和死锁占了50%以上,数据库里SQL和范式占了接近一半,数据科学导论里数据清洗和模型评估是绝对重点。既然分值是资源,复习时间也该按这个比例分配。
我把考点按优先级分成三档:第一档是“三年都考”的高频点,必须完全掌握,连计算题的小数点都不能错;第二档是“隔年出现”的中频点,至少做到能说清概念和步骤;第三档是“只出现过一次”的低频点,只需混个脸熟,不做深入。这个分档法让我在有限时间内避开了大量低效投入。
3.2 我常用的整理工具和模板
工具上我主用三件套:XMind画思维导图、Markdown写知识点文档、Anki做记忆卡片。思维导图用来搭框架,Markdown用来补充细节,Anki用来做间隔重复。这三个工具的定位完全不同,搭配起来效率才高。
Markdown文档我统一用以下模板记录每个知识点:
- 知识点名称(一句话说明它是什么)
- 为什么会考(从讲师强调程度和历年频次推断)
- 核心内容(分条列点,带例子)
- 易错点(我错过的或者同学常错的)
- 真题链接(哪年哪题考过)
举个例子,数据库里的“隔离级别”我是这么记的:
- 读未提交:可能读脏数据;实现:不加共享锁
- 读已提交:避免脏读,但不可重复读;实现:语句级快照
- 可重复读:避免脏读和不可重复读,但可能幻读;实现:事务级快照
- 串行化:最严格,避免全部问题;实现:全表锁或谓词锁
- 易错点:MySQL默认隔离级别是可重复读,不是读已提交;Oracle默认是读已提交
Anki卡片我做得非常简洁,每张卡只问一个点。比如“页面置换OPT算法全称?”,“正规答案是Optimal Page Replacement,最优置换算法”。做卡片的过程本身就是一次复习,而且卡片数量控制在100张以内,不然维护成本太高,坚持不下来。
3.3 跨课程交叉点:考试中容易串起来考的地方
我整理到一半时发现,有些知识点在不同课程里反复出现,只是表述不一样。把这些交叉点单独拎出来复习,比孤立地背每一门课效率高得多。
第一个交叉点是数据库并发控制和OS进程同步。数据库的锁机制本质上就是多进程访问共享资源时的同步问题——表锁、行锁对应OS里的互斥锁、读写锁,死锁检测对应OS里的死锁处理策略。考数据库的“死锁怎么解除”和考OS的“死锁的必要条件”是同一套知识体系,放一起记一石二鸟。
第二个交叉点是数据科学导论的数据清洗和数据库的数据质量。数据去重、缺失值处理、异常值过滤,在数据库课程里叫数据完整性,在数据科学导论里叫数据预处理。考试如果出一张脏数据表,让你说怎么处理,两个角度都能答:数据库角度强调约束和外键,数据科学角度强调统计填充和异常检测。
第三个交叉点是可视化工具和数据库查询的联动。课程设计里最常见的组合是后端从MySQL查数据,通过Flask接口返回JSON,前端用ECharts渲染。这个流程里涉及的SQL性能问题(查询慢)、数据格式转换问题(JSON结构不对)、前后端交互问题(跨域),每一环都能独立成为考试题。复习时把这整条链路跑通一遍,比死记硬背任何概念都有用。
4. 复习过程中的常见问题与避坑指南
4.1 七类高频易错点速查表
整理了这么多资料之后,我把最容易出错的点汇总成了一张速查表,复习最后一天只看这张表就够了:
| 课程 | 易错点 | 正确理解 |
|---|---|---|
| 数据可视化 | 饼图适合展示占比 | 饼图不推荐,除非类别≤3且差异明显 |
| 数据可视化 | ECharts数据格式不对 | series.data必须是数组,不能是对象 |
| 数据科学导论 | 归一化和标准化混用 | 标准化适合正态分布,归一化适合有界数据 |
| 数据科学导论 | 类别不平衡只看准确率 | 应看精确率、召回率、F1 |
| OS | 互斥信号量初值设0 | 互斥信号量初值必须是1 |
| OS | SJF忽略抢占条件 | 先看题意是否允许抢占再计算 |
| 数据库 | GROUP BY后SELECT列不匹配 | 非聚合列必须出现在GROUP BY中 |
| 数据库 | 事务隔离级别记混 | MySQL默认是可重复读,不是读已提交 |
这张表我打印出来贴在了书桌前面,考前一周每天过一遍。很多同学觉得自己概念都懂,一做题就错,问题往往就出在这类“细节混淆”上。
4.2 实操中踩过的坑
整理这份资料的过程中我自己踩了不少坑,有四个印象最深,写出来供你参考。
第一个坑是笔记越做越厚,最后变成抄书。最开始我在Markdown里事无巨细地记录所有讲义内容,连背景介绍都抄进去,结果文档膨胀到上百页,根本复习不进去。后来我强制自己设定规则:每个知识点不超过5行字,能写成表格就写表格,能画流程图就画流程图。精简到极致之后,复习时反而更容易进入状态。
第二个坑是SQL只背不写。我一开始觉得JOIN的写法看懂了就行,结果考试时手写SQL各种报错——表名顺序反了、GROUP BY漏列、HAVING用成了WHERE。后来我把课程里的十道经典SQL题反复手写了五遍,每次都脱稿,写到肌肉记忆为止。数据科学导论的代码也一样,别在脑子里跑代码,一定要真跑一遍。
第三个坑是可视化项目只求“跑通”不求“讲清”。做课程设计时,图表是渲染出来了,但老师问“为什么选这个视觉通道”“为什么用柱状图不用折线图”时,我完全答不上来。后来我补了视觉编码和图形语法的理论课,才发现工具只是最后一公里,前面的设计思路才是灵魂。考试里如果考图表选型,也是考这个,不考ECharts的API细节。
第四个坑是复习时平均用力。四门课堆在一起,很容易每门课每天分两小时,结果每门都学不深。我后来改成“两天攻一门”的模式:第一天整理框架,第二天全力刷题。四门课轮两遍,每门都能保证完整的沉浸时间。用这个方法,我把OS的调度算法和数据库的SQL手感都练到了闭眼能写的地步。
4.3 我踩坑后总结的时间安排建议
如果你现在距离考试还有一个月,可以参考下面这个四周复习法。第一周做考点频次统计,把手头真题全部打散归类,摸清重点;第二周集中攻克高频考点,每天实操写SQL或算调度算法,保证手感;第三周处理中低频点,把这些点压缩成一张速查表,反复看;第四周全真模拟,按考试时间完整做两套题,重点练答题速度和格式规范。
这个安排的核心是:后期绝对不要再看厚笔记,只看速查表和错题集。人的短期记忆容量有限,考前一周往脑子里塞大量新信息只会造成混乱,不如反复巩固已经掌握的内容。我第四次复习时,把模拟卷放在周一周三各做一套,周二周四就只复盘错误,周五轻量过一遍四门课的大纲,效率比前期每天刷夜高很多。
5. 最后想对后来的同学说的话
资料整理这件事,最后的赢家不是资料本身,而是整理的过程。我花了大概两周时间把四门课的知识点、真题、易错点全部过了一遍并落成文档,这两周的收获比之前一学期零散听课要大得多。原因很简单:整理倒逼我思考每门课的框架、每道题的意图、每个概念之间的联系。这些思考的痕迹,比任何一份现成的笔记都值钱。
所以如果你也是计算机方向的学生,我建议你拿起手头的课程资料,试着按我的方法自己做一份“试题汇总+知识点整理”。不一定非要用这四门课,其他的也可以。在整理的过程中你会发现,那些原来觉得零散的概念,慢慢会在你脑海里长成一棵树。等到考试那天,看到题目时你想到的不会只是某句话,而是整个知识体系在向你招手。
如果你需要参考我做的这份2021年山东大学四门课整理文档里的具体例子,可以直接用里面提到的算法对比表、SQL示例和复习时间线作为起点。祝复习顺利,考试稳过。