计算机考研复试高频五十问(第一期)
计算机考研复试高频五十问(第一期)
1. 解释什么是并发与并行,它们的区别是什么?
答案:
并发(Concurrency)指系统能够同时处理多个任务的能力,实际上这些任务可能在单个CPU核心上交替执行(时间片轮转)。
并行(Parallelism)指多个任务真正同时在多个CPU核心上同时执行。
区别:
- 并发是逻辑上的“同时”,并行是物理上的同时
- 并发通过分时复用实现,并行依赖多核硬件
- 例:浏览器多标签页是并发,多核CPU计算是并行
2. C语言与C++语言的区别有哪些?
答案:
维度 | C语言 | C++语言 |
---|---|---|
编程范式 | 面向过程 | 支持面向对象和泛型编程 |
内存管理 | 手动malloc/free | 支持new/delete和智能指针 |
函数特性 | 无函数重载 | 支持函数重载和运算符重载 |
标准库 | 标准库简单 | STL容器/算法完备 |
特性扩展 | 无类/继承/多态 | 支持OOP四大特性 |
3. 解释“面向对象”编程及其四大特性
答案:
面向对象编程(OOP)是通过对象的创建与协作来设计程序的编程范式。
四大特性:
- 抽象(Abstraction):提取事物关键特征,隐藏实现细节
- 封装(Encapsulation):将数据与方法绑定,控制访问权限
- 继承(Inheritance):子类复用父类特性,实现代码复用
- 多态(Polymorphism):同一接口在不同对象产生不同行为
4. 指针在C语言中的作用及常见错误
答案:
作用:
- 直接访问内存地址
- 实现动态内存分配
- 高效传递大量数据(避免值拷贝)
常见错误:
- 空指针解引用:
int *p = NULL; *p = 10;
- 野指针:释放内存后未置空指针(
free(p);
未设置p = NULL
) - 内存泄漏:忘记释放malloc分配的内存
- 指针越界:
int arr[5]; int *p = &arr[10];
5. C++中虚函数与多态实现
答案:
虚函数:用virtual
声明的成员函数,支持运行时多态。
多态实现步骤:
class Animal {
public:
virtual void speak() = 0; // 虚函数
};
class Dog : public Animal {
public:
void speak() override { cout << "Woof!"; }
};
// 使用
Animal* animal = new Dog();
animal->speak(); // 输出Woof(动态绑定)
实现原理:通过虚函数表(vtable)在运行时确定函数地址。
6. 递归算法的优缺点及栈溢出预防
答案:
优点:
- 代码简洁(如遍历树结构)
- 天然适合分治问题(如汉诺塔)
缺点:
- 栈空间消耗大,可能溢出
- 重复计算多(如未优化的斐波那契数列)
预防栈溢出:
- 使用尾递归优化(需编译器支持)
- 改为迭代(循环)实现
- 限制递归深度(设置终止条件)
7. 哈希表工作原理及冲突解决
答案:
工作原理:
- 通过哈希函数将键(key)转换为数组索引
- 存储键值对到对应索引位置
冲突解决方法:
- 链地址法:每个桶用链表存储元素(Java HashMap使用)
- 开放寻址法:
- 线性探测:逐个查找空位
- 二次探测:按平方数跳跃探测
- 再哈希法:使用第二个哈希函数重新计算
8. 快速排序 vs 归并排序
答案:
时间复杂度:
- 快速排序:平均O(n log n),最差O(n²)(取决于pivot选择)
- 归并排序:稳定O(n log n)
算法 | 优点 | 缺点 |
---|---|---|
快速排序 | 原地排序,缓存友好 | 最差情况性能差 |
归并排序 | 稳定排序,适合链表结构 | 需要额外O(n)空间 |
9. 深度优先搜索(DFS)与广度优先搜索(BFS)
答案:
DFS:
- 沿分支深度遍历到底再回溯
- 实现方式:递归或显式栈
- 适用场景:寻找所有可能解(如迷宫问题)
BFS:
- 按层次逐层遍历所有节点
- 实现方式:队列
- 适用场景:最短路径问题(如社交网络关系度)
不同点:
- DFS可能陷入无限循环(需记录访问状态)
- BFS保证找到最短路径(权值相同时)
10. 链表插入节点时避免内存泄漏
答案:
正确操作步骤示例:
// 在链表中间插入新节点
Node* insert(Node* prevNode) {
Node* newNode = malloc(sizeof(Node)); // 申请内存
if (newNode == NULL) exit(1); // 检查分配成功
newNode->next = prevNode->next; // 先连接新节点
prevNode->next = newNode; // 再断开原链接
return newNode;
}
避免泄漏要点:
- malloc后必须对应free
- 修改指针前备份关键节点(防止断链)
- 使用valgrind等工具检测内存
11. 关系型 vs 非关系型数据库区别
答案:
类型 | 关系型(如MySQL) | 非关系型(如MongoDB) |
---|---|---|
数据模型 | 表结构/SQL | 文档/键值对/列存储 |
事务支持 | 强ACID支持 | 通常弱化(可配置) |
扩展方式 | 垂直扩展(更强一致性) | 水平扩展(更高可用性) |
适用场景 | 复杂查询/事务系统 | 高并发/非结构化数据 |
12. 数据库ACID特性
答案:
- Atomicity(原子性):事务要么全部完成,要么全部不执行(如转账时双方账户同时增减)
- Consistency(一致性):事务执行前后数据库必须保持一致的约束(如账户余额不能为负)
- Isolation(隔离性):并发事务相互隔离(通过锁机制实现)
- Durability(持久性):事务提交后数据永久保存(即使系统崩溃)