1. 408复旦机试复试学习Day21:计算机考研备考全记录
作为一名计算机专业考研党,我决定用文字记录下自己备战复旦计算机考研(408科目)的全过程。今天是第21天的学习记录,主要围绕数据结构、操作系统、计算机组成原理和计算机网络四大核心科目展开。不同于普通的打卡日记,我会详细拆解每个知识点的学习路径、易错题型和实战解题技巧。
2. 数据结构:图论算法深度突破
2.1 邻接矩阵与邻接表的存储选择
在实现图的遍历算法时,存储结构的选择直接影响算法效率。邻接矩阵适合稠密图(空间复杂度O(n²)),而邻接表更适合稀疏图(空间复杂度O(n+e))。今天重点练习了用邻接表实现DFS的非递归版本:
c复制void DFS_NonRecursive(ALGraph G, int v) {
stack<int> S;
vector<bool> visited(G.vexnum, false);
S.push(v);
visited[v] = true;
while (!S.empty()) {
int u = S.top();
S.pop();
cout << G.vertices[u].data << " ";
for (ArcNode* p = G.vertices[u].firstarc; p; p = p->nextarc) {
if (!visited[p->adjvex]) {
visited[p->adjvex] = true;
S.push(p->adjvex);
}
}
}
}
注意:非递归实现中,节点访问顺序与递归版本相反(栈的LIFO特性导致),这在某些应用场景(如拓扑排序)中需要特别注意。
2.2 Dijkstra算法的常见误区
在实现最短路径算法时,我发现两个典型错误:
- 未正确初始化dist数组(源点设为0,其余设为INT_MAX)
- 松弛操作时未考虑溢出风险(应先判断dist[u] != INT_MAX)
实测对比了使用优先队列(O(ElogV))和普通数组(O(V²))的性能差异。对于V=1000的稠密图,数组实现反而更快,这与理论分析似乎矛盾——实际上是由于STL优先队列的常数因子较大。
3. 操作系统:内存管理难点解析
3.1 页面置换算法的手算技巧
在模拟FIFO、LRU等页面置换算法时,我总结出快速解题的"三线表格法":
- 第一行记录访问序列
- 第二行记录内存页面状态
- 第三行标记缺页中断
例如LRU算法的解题关键点:
- 每次访问后都要更新页面的"最近使用时间戳"
- 缺页时选择时间戳最小的页面置换
- 注意区分"缺页率"和"置换率"的计算差异
3.2 银行家算法的实现细节
手写银行家算法时容易忽略安全序列的查找逻辑。正确的步骤应该是:
- 初始化Work = Available
- 遍历所有进程,找到Need <= Work且未完成的进程
- 假设分配资源后,Work += Allocation
- 重复步骤2-3直到所有进程完成或无法继续
c复制bool isSafe(Process processes[], int n, int m) {
int Work[m];
bool Finish[n];
// 初始化代码...
int count = 0;
while (count < n) {
bool found = false;
for (int i = 0; i < n; i++) {
if (!Finish[i] && needLessThan(processes[i].Need, Work, m)) {
// 分配资源
for (int j = 0; j < m; j++)
Work[j] += processes[i].Allocation[j];
Finish[i] = true;
found = true;
count++;
}
}
if (!found) break;
}
return count == n;
}
4. 计算机组成原理:Cache映射实战分析
4.1 直接映射Cache的地址划分
遇到一道经典考题:32位地址空间,64KB Cache采用直接映射,每个块32字节。解题步骤:
- 块大小32B → 偏移量5位(2^5=32)
- Cache总大小64KB → 64KB/32B=2048个块 → 索引11位(2^11=2048)
- 标记位=32-5-11=16位
易错点:当Cache大小不是2的幂时(如48KB),索引计算需要用取模运算而非直接截取位段。
4.2 写策略的选择依据
在写直达(Write Through)和写回(Write Back)策略间选择时,要考虑:
- 写直达:实现简单,但总线压力大,适合写操作少的场景
- 写回:需要脏位标记,但减少总线传输,适合多级Cache体系
实测数据显示:对于写密集型程序(如矩阵转置),写回策略比写直达快3-5倍。
5. 计算机网络:TCP协议栈深度剖析
5.1 三次握手的状态转换陷阱
绘制TCP状态机时,要特别注意以下几个非常规转换:
- 同时打开(SYN_SENT → SYN_RCVD)
- 同时关闭(FIN_WAIT_1 → CLOSING)
- TIME_WAIT状态的持续时间计算(2MSL)
常见笔试题陷阱:客户端在FIN_WAIT_2状态收到FIN后,应该进入TIME_WAIT而非直接关闭。
5.2 拥塞控制算法的参数调优
通过Wireshark抓包分析TCP Cubic算法,发现几个关键现象:
- 窗口增长阶段呈现立方函数曲线
- 丢包事件后窗口降至原值的0.7-0.8倍
- 公平性比传统Reno算法更好
在Linux系统中可通过以下命令调整Cubic参数:
bash复制sysctl -w net.ipv4.tcp_congestion_control=cubic
sysctl -w net.ipv4.tcp_frto=2
6. 每日学习方法论总结
6.1 错题本的数字化管理
我用Notion搭建了电子错题本,包含以下字段:
- 题目来源(年份+题号)
- 错误类型(概念混淆/计算错误/题意理解)
- 关联知识点(打标签)
- 同类题变式(自动关联相似题目)
每周生成错题统计报告,重点突破高频错误类型。
6.2 模拟考试的节奏控制
通过10次真题模考,总结出时间分配黄金法则:
- 选择题(80分钟):每题不超过3分钟
- 应用题(100分钟):每题15-20分钟
- 留出20分钟检查
特别提醒:遇到5分钟没思路的题目立即做标记跳过,全部做完后再回头攻坚。
