软考-软件设计师

2026-09-03 7 次阅读
学习笔记

为提升专业水平,从2026年开始,考取计算机专业资格水平-中级,今年没过明年继续,直到考过为止

软件设计师(中级)备考知识手册


目录

  • 上午题(基础知识):软件工程、面向对象技术、数据结构与算法、计算机组成原理、操作系统、数据库系统、计算机网络、程序设计语言(编译原理)、知识产权与标准化、信息安全、专业英语
  • 下午题(应用技术):数据流图DFD、数据库设计E-R图、UML建模、算法设计、程序设计

一、软件工程

分值占比:约13-17分 | 备考建议:分值最高,结合前端经验上手快,重点掌握测试方法和项目管理

1.1 软件生命周期模型

  • 瀑布模型:阶段间具有顺序性和依赖性,文档驱动,适合需求明确的project
  • 原型模型:快速构建原型,用户反馈后迭代完善,适合需求不明确的项目
  • 增量模型:分批次交付功能模块,先核心后次要
  • 螺旋模型:结合了瀑布和原型,强调风险分析,适合大型复杂项目
  • 敏捷开发:迭代+增量,强调人和交互、可工作的软件、客户协作、响应变化(敏捷宣言4条价值观)
  • V模型:开发阶段与测试阶段一一对应(需求→验收测试、概要设计→概要测试、详细设计→单元测试)

1.2 软件开发方法

  • 结构化方法:自顶向下、逐步求精,用数据流图(DFD)和数据结构图(SD)描述
  • 面向对象方法:用UML建模,封装/继承/多态
  • RUP(统一软件开发过程):4个阶段(初始、细化、构建、移交)× 6个工程核心工作流

1.3 软件测试

  • 黑盒测试:不考虑内部结构,只测试功能
    • 等价类划分:有效等价类 + 无效等价类
    • 边界值分析:输入/输出的边界值(如0、1、最大值、最小值)
    • 因果图/判定表:多条件组合测试
  • 白盒测试:考虑内部逻辑结构
    • 语句覆盖:每个语句至少执行一次
    • 判定覆盖:每个判定的真假分支至少执行一次
    • 条件覆盖:每个判定中每个条件的真假至少各出现一次
    • 路径覆盖:覆盖所有可能的执行路径
  • 测试阶段:单元测试 → 集成测试 → 确认测试 → 系统测试 → 验收测试
  • JUnit:Java单元测试框架

1.4 软件项目管理

  • 甘特图:用条形图表示项目进度,横轴为时间,纵轴为活动
  • PERT图(计划评审技术):用有向图表示项目活动,关键路径法(CPM)找最长路径
  • CMMI:能力成熟度模型集成,5个等级
    • 初始级(Level 1):过程无序,经常超支超时
    • 可管理级(Level 2):有基本项目管理过程
    • 已定义级(Level 3):标准过程已文档化
    • 已量化管理级(Level 4):过程用统计数据量化管理
    • 优化级(Level 5):持续过程改进

1.5 软件质量

  • ISO 9126质量模型:6个特性
    • 功能性、可靠性、可用性、效率、维护性、可移植性
  • McCall质量模型:11个质量因素

1.6 例题

例题1:在软件测试中,要求覆盖程序中所有可能的执行路径的测试方法是( )

A. 语句覆盖 B. 判定覆盖 C. 条件覆盖 D. 路径覆盖

答案:D

解析:路径覆盖要求覆盖程序中所有可能的执行路径,是白盒测试中覆盖标准最强的一种。语句覆盖只要求每个语句至少执行一次;判定覆盖要求每个判定的真假分支都至少执行一次;条件覆盖要求每个判定中每个条件的真假至少各出现一次。路径覆盖的覆盖强度最高。


例题2:以下关于CMMI的描述,正确的是( )

A. CMMI共有4个成熟度等级 B. 最高等级是已定义级 C. 优化级强调持续过程改进 D. 初始级表示过程已量化管理

答案:C

解析:CMMI共有5个等级,最高级是优化级(Level 5),强调通过统计技术和持续改进来优化过程。初始级(Level 1)表示过程无序,经常超支超时。已定义级是Level 3。


二、面向对象技术

分值占比:约11-15分 | 备考建议:分值高,前端有组件经验,UML和设计模式上手快

2.1 面向对象基本概念

  • 封装:将数据和操作封装在类中,隐藏内部实现细节
  • 继承:子类继承父类的属性和方法,支持代码复用
  • 多态:同一操作作用于不同对象可以有不同的解释和行为(运行时分派)
  • 抽象:提取共同特征,忽略细节(抽象类、接口)

2.2 UML建模

  • 类图:表示类的静态结构
    • 泛化(继承):空心三角箭头实线
    • 实现:空心三角箭头虚线
    • 关联:实线箭头
    • 聚合:空心菱形+实线(整体与部分可独立存在)
    • 组合:实心菱形+实线(整体与部分不可独立存在)
    • 依赖:虚线箭头
  • 用例图:表示系统功能需求
    • 参与者(小人)与用例(椭圆)
    • 关联、包含(<<include>>)、扩展(<<extend>>)
  • 时序图:表示对象间消息传递的时间顺序
    • 对象(矩形)+ 生命线(虚线)+ 消息(箭头)
    • 同步消息(实线箭头)、异步消息(虚线箭头)、返回消息(虚线箭头)
  • 状态图:表示对象生命周期中的状态变化
    • 状态(圆角矩形)、转换(箭头)、事件、动作
  • 活动图:类似流程图,表示业务流程

2.3 设计模式

  • 单例模式:确保一个类只有一个实例,提供全局访问点
    • 应用场景:配置管理器、数据库连接池、线程池
  • 工厂模式:定义创建对象的接口,让子类决定实例化哪个类
    • 简单工厂、工厂方法、抽象工厂
  • 观察者模式:定义对象间的一对多依赖,当一个对象改变状态时所有依赖者收到通知
    • 应用场景:事件监听器、发布-订阅系统
  • 适配器模式:将一个接口转换成客户希望的另一个接口
    • 类适配器(多重继承)、对象适配器(组合)
  • 策略模式:定义一系列算法,把它们封装起来,并使它们可互换
    • 应用场景:排序策略、加密策略
  • 开闭原则(OCP):对扩展开放,对修改关闭
  • 里氏替换原则(LSP):子类对象能够替换其父类对象
  • 依赖倒置原则(DIP):高层模块不应依赖低层模块,二者都应依赖抽象

2.4 例题

例题1:在UML类图中,表示"班级"和"学生"之间的关系,一个班级包含多个学生,学生可以脱离班级独立存在,这种关系是( )

A. 组合 B. 聚合 C. 泛化 D. 依赖

答案:B

解析:聚合表示"整体-部分"关系,但部分可以脱离整体独立存在。班级和学生之间,学生可以脱离班级存在,所以是聚合关系(空心菱形)。如果是"电脑和CPU"这种不可分割的关系,才是组合(实心菱形)。


例题2:某系统需要支持多种支付方式(支付宝、微信支付、银行卡),且未来可能新增支付方式。最符合开闭原则的设计模式是( )

A. 单例模式 B. 策略模式 C. 观察者模式 D. 适配器模式

答案:B

解析:策略模式定义一系列算法(支付方式),封装它们并使它们可互换。新增支付方式只需新增一个策略类,无需修改已有代码,符合开闭原则。


三、数据结构与算法

分值占比:约9-12分 | 备考建议:核心难点,重点掌握排序复杂度、二叉树性质、遍历算法

3.1 线性结构

  • 数组:连续内存存储,随机访问O(1)
  • 链表:非连续内存,通过指针连接
    • 单链表、双链表、循环链表
    • 插入/删除O(1)(已知节点),查找O(n)
  • :后进先出(LIFO),操作只在栈顶
    • 应用:函数调用栈、表达式求值、括号匹配
  • 队列:先进先出(FIFO)
    • 循环队列:解决假溢出
    • 优先级队列:按优先级出队
    • 双端队列:两端都可入队出队

3.2 树与二叉树

  • 二叉树性质
    • 第i层最多2^(i-1)个节点
    • 深度为k的二叉树最多2^k - 1个节点
    • 叶子节点数n0 = 度为2的节点数n2 + 1
  • 完全二叉树:除最后一层外,其他层节点数都达到最大值,最后一层节点靠左排列
    • 性质:节点i的左孩子为2i,右孩子为2i+1,父节点为i/2向下取整
  • 二叉树遍历
    • 先序:根→左→右
    • 中序:左→根→右
    • 后序:左→右→根
    • 已知先序+中序可唯一确定二叉树
  • 哈夫曼树:带权路径长度最小的二叉树
    • 构造方法:每次选权值最小的两棵树合并
    • 哈夫曼编码:前缀编码,无歧义解码
  • 平衡二叉树(AVL):任意节点左右子树高度差不超过1

3.3 图

  • 图的存储:邻接矩阵、邻接表
  • 遍历
    • DFS(深度优先搜索):递归/栈,类似树的先序遍历
    • BFS(广度优先搜索):队列,按层遍历
  • 最小生成树:Prim算法、Kruskal算法
  • 最短路径:Dijkstra算法(单源最短路径,不支持负权边)、Floyd算法(多源最短路径)

3.4 排序算法

排序算法 最好时间 平均时间 最坏时间 空间复杂度 稳定性
冒泡排序 O(n) O(n²) O(n²) O(1) 稳定
简单选择排序 O(n²) O(n²) O(n²) O(1) 不稳定
直接插入排序 O(n) O(n²) O(n²) O(1) 稳定
希尔排序 O(n log n) O(n log n) O(n²) O(1) 不稳定
快速排序 O(n log n) O(n log n) O(n²) O(log n) 不稳定
归并排序 O(n log n) O(n log n) O(n log n) O(n) 稳定
堆排序 O(n log n) O(n log n) O(n log n) O(1) 不稳定

3.5 查找算法

  • 二分查找:要求有序表,时间复杂度O(log n)
  • Hash表:通过哈希函数将关键字映射到存储位置,平均查找O(1)
    • 冲突处理:链地址法、开放定址法

3.6 算法设计策略

  • 分治法:将问题分解为若干小问题,递归求解后合并
    • 典型:归并排序、快速排序、二分查找
  • 动态规划:将问题分解为重叠子问题,保存子问题解避免重复计算
    • 典型:斐波那契数列、背包问题、最长公共子序列
  • 贪心法:每一步选当前最优解,期望得到全局最优
    • 典型:Huffman编码、Dijkstra、最小生成树Kruskal
  • 回溯法:深度优先搜索+剪枝,逐步构建解,不满足条件就回溯
    • 典型:八皇后问题、0-1背包

3.7 例题

例题1:一棵完全二叉树有100个节点,则叶子节点的个数为( )

A. 49 B. 50 C. 51 D. 52

答案:C

解析:完全二叉树中,叶子节点数n0 = n2 + 1。总节点数n = n0 + n1 + n2 = 100。对于完全二叉树,n1只能是0或1。若n1=0,则2n0 = 100,n0=50,但n0=n2+1,n2=49,n0+n2=99≠100,矛盾。若n1=1,则n0+n2=99,n0=n2+1,解得n0=50,n2=49... 等等,重新算:n = n0 + n1 + n2 = 100,n0 = n2 + 1,所以n2 = n0 - 1,代入得n0 + n1 + n0 - 1 = 100,即2n0 + n1 = 101。若n1=1,则2n0=100,n0=50。不对,让我重新算。n0 = n2 + 1,n = n0 + n1 + n2 = n0 + n1 + (n0-1) = 2n0 + n1 - 1 = 100,所以2n0 + n1 = 101。完全二叉树n1只能是0或1。若n1=1,则2n0=100,n0=50。但2×50+1=101≠100... 重新来:n0+n1+n2=100, n0=n2+1, 所以(n2+1)+n1+n2=100, 2n2+n1=99。若n1=1, 2n2=98, n2=49, n0=50。不对,答案是51。让我用公式:对于完全二叉树,若节点数n为偶数,n1=2;若n为奇数,n1=0。n=100为偶数,n1=2?不对。

正确解法:n0 = floor((n+1)/2) = floor(101/2) = 50... 不对。

对于完全二叉树:n0 = (n+1)/2 当n为奇数;n0 = n/2 当n为偶数。n=100为偶数,n0=50。

等等,让我用另一个公式:n0 = n - n1 - n2, n2 = n0 - 1, 所以n0 = n - n1 - (n0-1) = n - n1 - n0 + 1, 2n0 = n - n1 + 1, n0 = (n - n1 + 1)/2。

n=100,完全二叉树中,若n为偶数则n1=2?不对,完全二叉树的n1只能是0或1。

n0 = (100 - n1 + 1)/2 = (101 - n1)/2。若n1=1,n0=50。若n1=0,n0=101/2不是整数。

所以n1=1, n0=50, n2=49。答案是B. 50。

抱歉,让我重新确认。完全二叉树节点数n=100。

性质:n0 = n2 + 1
n = n0 + n1 + n2 = n0 + n1 + n0 - 1 = 2n0 + n1 - 1 = 100
2n0 = 101 - n1

n1只能是0或1(完全二叉树性质)。

  • n1=0: 2n0=101, n0=50.5 不是整数
  • n1=1: 2n0=100, n0=50

所以n0=50,答案是B。

答案:B


例题2:以下排序算法中,平均时间复杂度为O(n log n)且稳定的排序算法是( )

A. 快速排序 B. 堆排序 C. 归并排序 D. 希尔排序

答案:C

解析:归并排序的平均时间复杂度为O(n log n),且是稳定排序。快速排序平均O(n log n)但不稳定;堆排序平均O(n log n)但不稳定;希尔排序平均O(n log n)但不稳定。


四、计算机组成原理

分值占比:约5-8分 | 备考建议:公式为主,背公式套数字即可拿分

4.1 数据表示与运算

  • 原码:最高位为符号位(0正1负),其余位为数值绝对值
  • 反码:正数反码=原码;负数反码=符号位不变,数值位按位取反
  • 补码:正数补码=原码;负数补码=反码+1
    • 补码优势:可将减法运算转化为加法运算
    • 补码范围:n位补码表示范围 -2^(n-1) 到 2^(n-1)-1
  • 移码:补码符号位取反,用于浮点数阶码表示
  • 浮点数表示
    • 格式:阶符+阶码(基数)+ 尾符+尾数
    • 规格化:尾数最高位非0(二进制规格化要求尾数绝对值≥0.5)
    • 浮点数精度由尾数位数决定,范围由阶码位数决定

4.2 校验码

  • 奇偶校验:检测1位错误,不能纠正错误
    • 奇校验:使包括校验位在内的"1"的个数为奇数
    • 偶校验:使包括校验位在内的"1"的个数为偶数
  • 海明码:可检测并纠正1位错误
    • 校验位位数k需满足:2^k ≥ n + k + 1(n为数据位数)
    • 校验位放在2的幂次位置(1,2,4,8,...)
  • CRC校验(循环冗余校验)
    • 用生成多项式G(x)进行模2除法
    • 可检测所有1位错误、所有2位错误、所有奇数个错误
    • 不能检测的错误:与G(x)相同因子的错误

4.3 指令系统与CPU

  • 指令格式:操作码 + 地址码(操作数地址)
  • 寻址方式
    • 立即寻址:操作数直接在指令中
    • 直接寻址:地址码直接给出操作数地址
    • 间接寻址:地址码给出的是操作数地址的地址
    • 寄存器寻址:操作数在寄存器中
    • 寄存器间接寻址:寄存器中存放操作数地址
    • 变址寻址:有效地址 = 变址寄存器内容 + 形式地址
  • CPU组成
    • 运算器(ALU):执行算术和逻辑运算
    • 控制器:取指、译码、执行
    • 寄存器组:通用寄存器、PC(程序计数器)、IR(指令寄存器)、MAR(存储器地址寄存器)、MDR(存储器数据寄存器)

4.4 存储器系统

  • 存储层次:寄存器 → Cache → 主存 → 辅存
  • Cache映射方式
    • 直接映射:主存块只能映射到Cache中固定位置,简单但有冲突
    • 全相联映射:主存块可映射到Cache任意位置,灵活但查找慢
    • 组相联映射:Cache分成若干组,主存块可映射到对应组内任意位置
  • Cache命中率:H = 命中次数/总访问次数
  • RAID级别
    • RAID 0:条带化,无冗余,提高性能
    • RAID 1:镜像,100%冗余,可靠性最高
    • RAID 5:分布式奇偶校验,至少3块盘
    • RAID 10:镜像+条带,至少4块盘

4.5 流水线技术

  • 流水线吞吐率:TP = n / (t + (n-1)×Δt)
    • n为任务数,t为完成任务时间,Δt为流水线周期
  • 流水线加速比:S = 非流水线执行时间 / 流水线执行时间
  • 流水线瓶颈:各段执行时间不一致时,以最慢段为周期

4.6 例题

例题1:用8位补码表示整数,其表示范围是( )

A. -128 ~ +127 B. -127 ~ +128 C. -128 ~ +128 D. -127 ~ +127

答案:A

解析:n位补码表示范围为 -2^(n-1) ~ 2(n-1)-1。8位补码:-27 ~ 2^7-1,即 -128 ~ +127。注意补码比原码多表示一个数-128(补码中10000000表示-128)。


例题2:某Cache容量为4KB,主存容量为256KB,若采用直接映射方式,则主存地址中,字块内地址和Cache字块地址的位数分别为( )

A. 8, 8 B. 8, 9 C. 9, 8 D. 7, 8

答案:B

解析:主存256KB = 2^18字节,需18位地址。Cache 4KB = 2^12字节,需12位地址。直接映射下,主存地址 = Cache字块地址 + 字块内地址。Cache字块地址 = Cache块数 = Cache容量/块大小。假设块大小为28=256B(字块内地址8位),则Cache有212/28=24=16块,Cache字块地址4位... 这个题目需要具体参数。

实际上,若Cache容量4KB,主存256KB,设块大小为B字节。主存地址位数 = log2(256×1024) = 18位。Cache地址位数 = log2(4×1024) = 12位。直接映射:主存地址 = 标记 + Cache字块地址 + 字块内地址。字块内地址 = log2(B)。Cache字块地址 = log2(4×1024/B) = 12 - log2(B)。

若B=256B(字块内地址8位),Cache字块地址=12-8=4位... 但选项中没有4。

重新看选项,字块内地址8位意味着块大小256B。Cache字块地址:Cache有4KB/256B=16块,需要4位。但选项B是8,9...

这道题可能需要不同的块大小假设。假设字块内地址为8位(块大小256B),Cache字块地址应为4位,但选项中没有。可能题目参数不同。

答案:B(根据常见考题模式,字块内地址8位,Cache字块地址9位,对应Cache有512块,块大小为4KB/512=8B,字块内地址3位... 这里需要具体参数)


五、操作系统

分值占比:约6-10分 | 备考建议:进程调度和页面置换是核心考点

5.1 进程管理

  • 进程三态模型:就绪 → 运行 → 阻塞
    • 就绪→运行:进程调度
    • 运行→就绪:时间片到/被抢占
    • 运行→阻塞:等待事件
    • 阻塞→就绪:事件发生
  • 五态模型:增加新建态和终止态
  • 进程调度算法
    • FCFS(先来先服务):非抢占,可能长作业等待时间长
    • SJF(短作业优先):平均等待时间最短,但可能饥饿
    • RR(时间片轮转):每个进程分配固定时间片,公平
    • 优先级调度:高优先级先执行,可抢占或非抢占
  • PV操作(信号量)
    • P操作:申请资源,信号量减1,若<0则阻塞
    • V操作:释放资源,信号量加1,若≤0则唤醒等待进程
    • 生产者-消费者问题:用互斥信号量+空/满信号量解决
  • 死锁
    • 四个必要条件:互斥、请求与保持、不剥夺、循环等待
    • 银行家算法:分配资源前检查系统是否处于安全状态
    • 安全序列:存在一个进程序列,每个进程都能获得所需资源并完成

5.2 存储管理

  • 分页存储管理
    • 逻辑地址分为页号和页内地址
    • 页表:页号→物理块号的映射
    • 页面置换算法:
      • FIFO:先进先出,可能Belady异常
      • LRU:最近最久未使用,性能好但开销大
      • OPT:最佳置换(理想算法,页面走向已知),缺页率最低
  • 分段存储管理
    • 逻辑地址分为段号和段内地址
    • 段表:段号→段起始地址和段长
  • 段页式存储管理:先分段再分页,结合两者优点

5.3 文件管理

  • 文件目录结构
    • 单级目录:简单但有冲突
    • 两级目录:用户目录+系统目录
    • 树形目录:层次化管理,支持共享
    • 索引节点(inode):文件控制块,存储文件元数据
  • 磁盘调度算法
    • FCFS:先来先服务
    • SSTF(最短寻道时间优先):选距当前磁头最近的
    • SCAN(电梯算法):单向扫描,到端点反向
    • C-SCAN:单向扫描,到端点立即返回起点

5.4 设备管理

  • I/O控制方式:程序查询、程序中断、DMA、通道
  • SPOOLing技术:将独占设备改造为共享设备,提高利用率

5.5 例题

例题1:在操作系统中,采用银行家算法可以避免( )

A. 死锁 B. 死锁的恢复 C. 死锁的预防 D. 死锁的检测

答案:A

解析:银行家算法是一种死锁避免算法。它通过在资源分配前检查系统是否处于安全状态来避免死锁。死锁预防是通过破坏死锁四个必要条件之一来实现;死锁检测是允许死锁发生然后检测并恢复;死锁恢复是在检测到死锁后采取措施。银行家算法属于死锁避免。


例题2:某系统采用LRU页面置换算法,分配给某进程3个物理块,页面访问序列为:1, 2, 3, 4, 1, 2, 5, 1, 2, 3, 4, 5。缺页次数为( )

A. 8 B. 9 C. 10 D. 11

答案:B

解析:用LRU算法模拟页面置换过程:

  • 访问1:缺页,装入1,内存{1}
  • 访问2:缺页,装入2,内存{1,2}
  • 访问3:缺页,装入3,内存{1,2,3}
  • 访问4:缺页,LRU淘汰1,内存{4,2,3}
  • 访问1:缺页,LRU淘汰2,内存{4,1,3}
  • 访问2:缺页,LRU淘汰3,内存{4,1,2}
  • 访问5:缺页,LRU淘汰4,内存{5,1,2}
  • 访问1:命中,内存{5,1,2}
  • 访问2:命中,内存{5,1,2}
  • 访问3:缺页,LRU淘汰5,内存{3,1,2}
  • 访问4:缺页,LRU淘汰1,内存{3,4,2}
  • 访问5:缺页,LRU淘汰2,内存{3,4,5}

缺页次数 = 9次。答案是B。


六、数据库系统

分值占比:约6-10分 | 备考建议:E-R图和范式是下午题核心,关系代数和SQL是上午题重点

6.1 E-R模型

  • 实体:客观存在并可相互区别的事物
  • 属性:实体所具有的某一特性
    • 简单属性/组合属性
    • 单值属性/多值属性(用双椭圆表示)
    • 派生属性(可派生,用虚线椭圆表示)
  • 联系:实体集之间的关联
    • 1:1(一对一)、1:n(一对多)、m:n(多对多)
    • 联系也可有属性
  • E-R图转关系模式
    • 1个实体→1个关系模式
    • 1:1联系→转换为1个关系模式,或并入任一端实体
    • 1:n联系→转换为1个关系模式,或并入n端实体
    • m:n联系→转换为1个关系模式,属性包括两端主键+联系属性,主键为两端主键组合

6.2 关系代数

  • 选择(σ):从关系中选取满足条件的元组(水平分割)
  • 投影(π):从关系中选取若干属性列(垂直分割)
  • 连接(⋈):从两个关系的笛卡尔积中选取满足条件的元组
    • 等值连接:连接条件为属性值相等
    • 自然连接:等值连接+去除重复属性
  • 除(÷):R÷S,求R中哪些元组在S的所有元组上都出现

6.3 SQL语言

  • 数据查询
    • SELECT...FROM...WHERE(选择+投影)
    • 连接查询:INNER JOIN、LEFT JOIN、RIGHT JOIN、FULL JOIN
    • 分组统计:GROUP BY + HAVING
    • 嵌套查询:IN、EXISTS、ANY/ALL、比较运算符
  • 数据定义:CREATE TABLE、ALTER TABLE、DROP TABLE
  • 数据控制:GRANT、REVOKE

6.4 范式理论

  • 1NF:每个属性都是不可再分的原子值
  • 2NF:满足1NF,且每个非主属性完全函数依赖于候选键(消除部分依赖)
  • 3NF:满足2NF,且不存在非主属性对候选键的传递依赖
  • BCNF:满足3NF,且每个决定因素都包含候选键

6.5 事务与并发控制

  • ACID特性
    • 原子性(Atomicity):事务中所有操作要么全做要么全不做
    • 一致性(Consistency):事务前后数据库从一个一致性状态到另一个一致性状态
    • 隔离性(Isolation):并发事务之间不干扰
    • 持久性(Durability):事务一旦提交,对数据库的改变是永久的
  • 事务隔离级别(从低到高):
    • 读未提交(Read Uncommitted):可能脏读
    • 读已提交(Read Committed):避免脏读,可能不可重复读
    • 可重复读(Repeatable Read):避免脏读和不可重复读,可能幻读
    • 串行化(Serializable):最高隔离级别,避免所有问题
  • 锁机制
    • 共享锁(S锁/读锁):允许多个事务同时读
    • 排他锁(X锁/写锁):只允许一个事务写

6.6 例题

例题1:关系R(A,B,C,D)的候选键为AB,函数依赖集F={A→C, B→D},则该关系最高满足( )

A. 1NF B. 2NF C. 3NF D. BCNF

答案:B

解析:候选键为AB,非主属性为C和D。存在函数依赖A→C和B→D,即非主属性C部分依赖于候选键AB(只依赖A),非主属性D部分依赖于候选键AB(只依赖B)。这违反了2NF的要求(非主属性必须完全依赖于候选键),所以不满足2NF...

等等,A→C中A是候选键AB的真子集,所以C部分依赖于AB。B→D中B是候选键AB的真子集,所以D部分依赖于AB。这违反了2NF,所以只满足1NF。

答案:A


例题2:事务T1对数据A加共享锁,事务T2对数据A加排他锁。以下说法正确的是( )

A. T1和T2可以同时获得锁 B. T2可以立即获得锁 C. T2必须等待T1释放锁 D. T1必须等待T2释放锁

答案:C

解析:共享锁(S锁)和排他锁(X锁)不兼容。T1已持有A的S锁,T2申请A的X锁时,由于S锁和X锁不兼容,T2必须等待T1释放S锁后才能获得X锁。



七、计算机网络

分值占比:约5-10分 | 备考建议:OSI模型和TCP/IP协议是核心,子网划分必考

7.1 网络体系结构

  • OSI七层模型
    • 物理层:比特流传输,设备有集线器、中继器
    • 数据链路层:帧的传输,设备有交换机、网桥,MAC地址
    • 网络层:路由选择,设备有路由器,IP地址
    • 传输层:端到端可靠传输,TCP/UDP协议
    • 会话层:建立、管理、终止会话
    • 表示层:数据格式转换、加密/解密、压缩/解压缩
    • 应用层:HTTP、FTP、SMTP、DNS、DHCP等协议
  • TCP/IP四层模型
    • 网络接口层(对应OSI物理层+数据链路层)
    • 网际层(对应OSI网络层)
    • 传输层(对应OSI传输层)
    • 应用层(对应OSI会话层+表示层+应用层)

7.2 传输层协议

  • TCP:面向连接、可靠传输
    • 三次握手建立连接:SYN→SYN+ACK→ACK
    • 四次挥手释放连接:FIN→ACK→FIN→ACK
    • 流量控制:滑动窗口
    • 拥塞控制:慢启动、拥塞避免、快重传、快恢复
  • UDP:无连接、不可靠传输、速度快
    • 适用于实时应用(视频会议、直播、DNS查询)

7.3 网络层协议

  • IP地址分类
    • A类:1.0.0.0 ~ 126.255.255.255,默认掩码255.0.0.0
    • B类:128.0.0.0 ~ 191.255.255.255,默认掩码255.255.0.0
    • C类:192.0.0.0 ~ 223.255.255.255,默认掩码255.255.255.0
    • D类(组播):224.0.0.0 ~ 239.255.255.255
    • E类(保留):240.0.0.0 ~ 255.255.255.255
    • 特殊地址:127.0.0.0(回环地址)
  • 子网划分
    • 通过借主机位作为子网位来划分
    • 子网掩码:将网络位全1、主机位全0的二进制数
    • 可用主机数 = 2^n - 2(n为主机位数,减2是减去网络地址和广播地址)
  • ARP协议:将IP地址解析为MAC地址
  • DHCP协议:动态分配IP地址

7.4 应用层协议

  • HTTP:超文本传输协议,默认端口80,HTTPS加密端口443
  • DNS:域名解析服务,将域名解析为IP地址
  • FTP:文件传输协议,默认端口21
  • SMTP:简单邮件传输协议,默认端口25
  • POP3:邮件接收协议,默认端口110

7.5 网络安全基础

  • 防火墙:在内部网络和外部网络之间设置安全屏障
  • VPN:虚拟专用网,通过隧道协议在公共网络上建立安全通道
  • SSL/TLS:安全套接层/传输层安全协议,提供加密通信

7.6 例题

例题1:IP地址192.168.1.100的子网掩码为255.255.255.0,则该网络中最多可容纳的主机数为( )

A. 254 B. 255 C. 256 D. 252

答案:A

解析:子网掩码255.255.255.0表示前24位为网络位,后8位为主机位。主机位有8位,可分配主机数 = 2^8 - 2 = 254(减去全0的网络地址和全1的广播地址)。


例题2:TCP三次握手中,第二次握手发送的报文段标志位为( )

A. SYN B. ACK C. SYN+ACK D. FIN

答案:C

解析:三次握手过程:

  1. 客户端发送SYN报文段,进入SYN_SENT状态
  2. 服务器收到SYN后,发送SYN+ACK报文段,进入SYN_RCVD状态
  3. 客户端收到SYN+ACK后,发送ACK报文段,进入ESTABLISHED状态

所以第二次握手发送的是SYN+ACK。


八、程序设计语言(编译原理)

分值占比:约5-8分 | 备考建议:文法分类和自动机是核心考点

8.1 文法与语言

  • 乔姆斯基文法分类
    • 0型文法(无限制文法):产生式α→β,α至少含一个非终结符,等价于图灵机
    • 1型文法(上下文有关文法):产生式αAβ→αγβ,A为非终结符
    • 2型文法(上下文无关文法):产生式A→γ,A为非终结符,等价于下推自动机
    • 3型文法(正则文法):产生式A→aB或A→a,等价于有限自动机
  • 正规式:描述正则语言的数学工具
    • 运算:并(+)、连接(·)、闭包(*)
    • 正规式与正规集一一对应

8.2 有限自动机

  • NFA(非确定有限自动机):一个输入可能对应多个状态转移
  • DFA(确定有限自动机):每个状态对每个输入只有一个转移
    • NFA可等价转换为DFA(子集构造法)
  • DFA最小化:状态合并,消除等价状态

8.3 编译过程

  • 词法分析:将源代码字符流转换为词法单元(Token)序列
    • 词法单元:关键字、标识符、常数、运算符、分隔符
    • 输出:Token序列
  • 语法分析:根据文法规则,将Token序列组织成语法树
    • 自顶向下分析:递归下降、LL(1)
    • 自底向上分析:算符优先、LR分析
  • 语义分析:检查语义正确性(类型检查、变量声明检查)
  • 中间代码生成:生成与机器无关的中间代码
  • 优化:对中间代码进行优化
  • 目标代码生成:生成机器可执行代码

8.4 参数传递

  • 值传递:将实参的值复制给形参,形参修改不影响实参
  • 引用传递:形参引用实参的内存地址,形参修改影响实参
  • 名称传递:将实参表达式文本替换到形参位置

8.5 例题

例题1:以下文法中,属于上下文无关文法的是( )

A. A → aA | ε B. aAb → acb C. AB → BA D. A → aBc

答案:D

解析:上下文无关文法的产生式形式为A→γ,其中A是单个非终结符。A选项A→aA|ε是正则文法(也是上下文无关文法的特例);B选项aAb→acb的左边不是单个非终结符,是上下文有关文法;C选项AB→BA左边有两个符号,是上下文有关文法;D选项A→aBc左边是单个非终结符A,是上下文无关文法。


例题2:在编译过程中,负责将源代码中的标识符、常数、运算符等分解为词法单元的阶段是( )

A. 语法分析 B. 词法分析 C. 语义分析 D. 中间代码生成

答案:B

解析:词法分析是编译的第一个阶段,负责将源代码字符流分解为词法单元(Token)序列。语法分析将Token序列组织成语法树;语义分析检查语义正确性;中间代码生成将语法树转换为中间代码。


九、知识产权与标准化

分值占比:约3分 | 备考建议:纯背诵,保护期限数字是核心

9.1 著作权

  • 保护期限
    • 署名权、修改权、保护作品完整权:永久保护
    • 发表权、复制权等财产权:作者终生 + 死后50年
    • 法人作品/职务作品:首次发表后50年(50年内未发表则不再保护)
  • 权利归属
    • 职务作品(完成单位任务):除署名权外归单位
    • 委托作品(外包):有约定从约定;没约定归受托方
    • 合作作品:共同享有
    • 职务发明:专利权归单位
  • 软件著作权:开发完成之日自动产生,无需登记
    • 保护对象:源程序、目标程序、文档
    • 不保护:开发思想、处理过程、操作方法

9.2 专利权

  • 发明专利:保护期限20年(从申请日算)
  • 实用新型专利:保护期限10年(从申请日算)
  • 外观设计专利:保护期限15年(从申请日算,2021年新法)
  • 专利侵权判定:全面覆盖原则(被控侵权产品包含专利权利要求中全部技术特征)

9.3 商标权

  • 注册商标有效期10年(从核准注册日算),可无限续展
  • 商标侵权:未经许可在相同/类似商品上使用相同/近似商标

9.4 商业秘密

  • 特点:不为公众所知、具有商业价值、权利人采取了保密措施
  • 保护期限不确定(一旦公开,不再受保护)
  • 与专利权的关系:专利要公开技术内容,商业秘密要保密,二者不能同时拥有

9.5 标准化

  • 标准代号
    • GB:强制性国家标准
    • GB/T:推荐性国家标准
    • ISO:国际标准(国际标准化组织)
    • ANSI:美国国家标准
    • JIS:日本工业标准
    • IEEE:美国电气电子工程师学会标准
    • DB:地方标准(如DB11为北京)
    • Q/:企业标准
    • JB:机械行业标准
    • YD:通信行业标准

9.6 例题

例题1:某公司开发了一套软件并进行了著作权登记。该软件著作权自( )起产生。

A. 软件首次发表时 B. 软件开发完成之日 C. 著作权登记之日 D. 软件公开发布时

答案:B

解析:软件著作权自开发完成之日起自动产生,无需登记。登记只是为了方便举证,不是权利产生的条件。


例题2:以下关于知识产权的说法,正确的是( )

A. 发明专利保护期限为10年 B. 注册商标可无限续展 C. 商业秘密保护期限为20年 D. 著作权保护包括开发思想

答案:B

解析:A错误,发明专利保护期限为20年;B正确,注册商标10年有效期可无限续展;C错误,商业秘密无固定期限,一旦公开即不再受保护;D错误,著作权保护表达形式,不保护思想、方法、过程。


十、信息安全

分值占比:约5分 | 备考建议:加密技术和数字签名是核心考点

10.1 加密技术

  • 对称加密:加密和解密使用相同密钥
    • DES:数据加密标准,密钥56位,已不安全
    • 3DES:DES的增强版,使用3次DES
    • AES:高级加密标准,密钥128/192/256位,目前安全
  • 非对称加密:公钥加密、私钥解密
    • RSA:基于大数分解的困难性
    • 特点:公钥公开、私钥保密,可用于加密和数字签名
    • 缺点:速度比对称加密慢很多

10.2 数字签名与报文摘要

  • 数字签名:用发送方的私钥加密消息摘要,接收方用发送方公钥验证
    • 作用:身份认证、不可否认性、完整性
  • 报文摘要:对消息进行哈希运算,生成固定长度的摘要
    • MD5:生成128位摘要,已被证明不安全
    • SHA-1:生成160位摘要
    • SHA-256:生成256位摘要,目前安全
  • 数字证书:由CA(证书授权中心)签发,包含公钥和身份信息

10.3 网络安全

  • 防火墙:在内部网络和外部网络之间设置安全屏障
    • 包过滤防火墙:工作在网络层
    • 应用代理防火墙:工作在应用层
  • VPN(虚拟专用网):通过隧道协议在公共网络上建立安全通道
  • 入侵检测系统(IDS):监控网络流量,检测可疑行为

10.4 访问控制

  • DAC(自主访问控制):资源所有者决定谁能访问
  • MAC(强制访问控制):系统强制分配安全标签
  • RBAC(基于角色的访问控制):通过角色分配权限

10.5 例题

例题1:以下关于对称加密和非对称加密的说法,正确的是( )

A. 对称加密速度比非对称加密慢 B. 非对称加密使用相同密钥 C. 对称加密适合大数据量加密 D. 非对称加密不适合数字签名

答案:C

解析:A错误,对称加密速度比非对称加密快;B错误,非对称加密使用公钥和私钥两个不同的密钥;C正确,对称加密速度快,适合大数据量加密;D错误,非对称加密可用于数字签名(用私钥签名,公钥验证)。


例题2:数字签名的作用是( )

A. 保证数据机密性 B. 保证数据完整性和身份认证 C. 防止病毒攻击 D. 防止DDoS攻击

答案:B

解析:数字签名提供身份认证(确认发送方身份)和不可否认性(发送方不能否认发送过该消息),同时通过哈希值验证数据完整性。数字签名不保证数据机密性(加密才保证机密性),也不防病毒或DDoS攻击。


十一、专业英语

分值占比:约5分 | 备考建议:常见缩写和技术词汇,平时积累即可

11.1 常见计算机英文缩写

  • CPU:Central Processing Unit(中央处理器)
  • GPU:Graphics Processing Unit(图形处理器)
  • OS:Operating System(操作系统)
  • DBMS:Database Management System(数据库管理系统)
  • HTTP:HyperText Transfer Protocol(超文本传输协议)
  • HTTPS:HTTP Secure(安全超文本传输协议)
  • HTML:HyperText Markup Language(超文本标记语言)
  • CSS:Cascading Style Sheets(层叠样式表)
  • JSON:JavaScript Object Notation(JavaScript对象表示法)
  • XML:eXtensible Markup Language(可扩展标记语言)
  • SQL:Structured Query Language(结构化查询语言)
  • API:Application Programming Interface(应用程序编程接口)
  • IDE:Integrated Development Environment(集成开发环境)
  • URL:Uniform Resource Locator(统一资源定位符)
  • DNS:Domain Name System(域名系统)
  • IP:Internet Protocol(网际协议)
  • TCP:Transmission Control Protocol(传输控制协议)
  • UDP:User Datagram Protocol(用户数据报协议)
  • SSL:Secure Sockets Layer(安全套接层)
  • TLS:Transport Layer Security(传输层安全)
  • RAM:Random Access Memory(随机存取存储器)
  • ROM:Read-Only Memory(只读存储器)
  • SSD:Solid State Drive(固态硬盘)
  • RAID:Redundant Array of Independent Disks(独立磁盘冗余阵列)
  • VM:Virtual Machine(虚拟机)
  • Docker:容器化部署平台
  • ORM:Object-Relational Mapping(对象关系映射)

11.2 技术文档阅读技巧

  • 关注关键词:requirement(需求)、interface(接口)、parameter(参数)、return value(返回值)
  • 注意时态:一般现在时描述功能,过去时描述已实现的功能
  • 注意条件句:if/when/unless引导的条件从句

11.3 例题

例题1:In software engineering, the process of converting high-level programming language code into machine code is called( )

A. Interpretation B. Compilation C. Execution D. Debugging

答案:B

解析:Compilation(编译)是将高级语言源代码转换为机器码的过程。Interpretation(解释)是逐行解释执行,不生成独立的机器码。Execution(执行)是运行程序。Debugging(调试)是查找和修复错误的过程。


例题2:Which of the following is NOT a feature of object-oriented programming?( )

A. Encapsulation B. Inheritance C. Compilation D. Polymorphism

答案:C

解析:面向对象编程的三大特征是封装(Encapsulation)、继承(Inheritance)和多态(Polymorphism)。Compilation(编译)是编程语言的处理方式,不是面向对象编程的特征。


十二、数据流图(DFD)—— 下午题第1题(必答)

分值占比:约7-8分 | 备考建议:有固定套路,练3-5套真题即可掌握

12.1 DFD基本元素

  • 外部实体(矩形):系统外部的数据源或数据目的地
  • 加工/处理(圆/椭圆):对数据进行处理的逻辑
  • 数据存储(双横线/开口矩形):数据的存储位置
  • 数据流(箭头):数据的流动方向

12.2 DFD分层

  • 顶层图(上下文图):只有1个加工(整个系统),展示系统与外部实体的交互
  • 0层图:将顶层图的加工分解为多个子加工
  • 1层图、2层图...:继续细化

12.3 数据守恒原则

  • 输入=输出:每个加工必须有输入和输出
  • 父图与子图平衡:父图中某个加工的数据流,必须在对应的子图中有相同的输入和输出数据流
  • 父外部实体:顶层图中的外部实体,在0层图中必须出现
  • 父数据存储:顶层图中的数据存储,在0层图中必须出现

12.4 常见考点与解题技巧

  • 补外部实体:看数据流的起点/终点,如果数据流从系统外部来或到系统外部去,则对应外部实体
  • 补数据存储:如果一个加工的输出需要被另一个加工使用,但不是直接传递,则需要数据存储
  • 补数据流:检查每个加工的输入输出是否守恒
  • 找错误
    • 外部实体之间直接有数据流(错误,必须经过加工)
    • 加工只有输入没有输出(错误)
    • 数据流没有标注名称(错误)
    • 父图与子图数据流不匹配(错误)

12.5 例题

例题1:某图书管理系统DFD中,读者提交借阅请求,系统检查图书是否存在,若存在则记录借阅信息并更新库存。以下关于该系统的描述,正确的是( )

A. 读者是加工 B. 图书库存是外部实体 C. 借阅请求是数据流 D. 检查图书是数据存储

答案:C

解析:读者是外部实体(系统外部的数据源);图书库存是数据存储(保存图书信息);借阅请求是数据流(从读者到系统的信息流);检查图书是加工(对数据进行处理的操作)。


例题2:在DFD中,关于数据守恒原则的描述,错误的是( )

A. 每个加工至少有一个输入数据流和一个输出数据流 B. 父图的输入输出数据流必须与子图一致 C. 外部实体之间可以直接有数据流 D. 数据存储必须有读写数据流

答案:C

解析:外部实体之间不能直接有数据流,数据流必须经过加工处理。A正确,每个加工必须有输入和输出;B正确,父图与子图必须平衡;D正确,数据存储必须有写入和读取的数据流。


十三、数据库设计E-R图 —— 下午题第2题(必答)

分值占比:约7-8分 | 备考建议:E-R图转关系模式是固定套路

13.1 E-R图绘制

  • 实体:矩形,内写实体名
  • 属性:椭圆,内写属性名,用线连接到实体
    • 主键属性加下划线
    • 多值属性用双椭圆
    • 派生属性用虚线椭圆
  • 联系:菱形,内写联系名,用线连接到相关实体
    • 在联系线上标注1, n, m表示基数

13.2 E-R图转关系模式

  • 实体转换:每个实体转换为1个关系模式,属性包括实体的所有属性,主键保持不变
  • 1:1联系转换:转换为1个关系模式,或并入任一端实体的关系模式中
  • 1:n联系转换:转换为1个关系模式,或并入n端实体的关系模式中,将1端主键作为外键
  • m:n联系转换:转换为1个关系模式,属性包括两端实体的主键+联系本身的属性,主键为两端主键的组合

13.3 主键与外键确定

  • 主键:唯一标识关系中元组的属性或属性组合
  • 外键:一个关系中的属性(或属性组合),引用另一个关系的主键

13.4 例题

例题1:某学校数据库中,有学生实体(学号、姓名、性别、年龄)和课程实体(课程号、课程名、学分),学生和课程之间是m:n的选修关系(选修成绩)。将该E-R图转换为关系模式后,共得到( )个关系模式。

A. 2 B. 3 C. 4 D. 5

答案:B

解析:学生实体→1个关系模式(学号、姓名、性别、年龄),课程实体→1个关系模式(课程号、课程名、学分),选修m:n关系→1个关系模式(学号、课程号、选修成绩)。共3个关系模式。


例题2:在学生-课程E-R图中,选修关系转换为关系模式后,其主键应为( )

A. 学号 B. 课程号 C. 学号+课程号 D. 选修成绩

答案:C

解析:m:n联系转换为关系模式时,主键为两端实体主键的组合。学生的主键是学号,课程的主键是课程号,所以选修关系的主键是学号+课程号。


十四、UML建模 —— 下午题第3题(必答)

分值占比:约7-8分 | 备考建议:类图关系识别是核心考点

14.1 类图关系

  • 泛化(继承):空心三角箭头实线,指向父类
  • 实现:空心三角箭头虚线,指向接口
  • 关联:实线箭头,有方向性
  • 聚合:空心菱形+实线,指向整体
    • 表示"has-a"关系,部分可脱离整体存在
  • 组合:实心菱形+实线,指向整体
    • 表示"contains-a"关系,部分不能脱离整体存在
  • 依赖:虚线箭头,指向被依赖的对象

14.2 用例图

  • 参与者:小人图标,表示与系统交互的角色
  • 用例:椭圆,表示系统提供的功能
  • 关联:实线,连接参与者和用例
  • 包含(<<include>>):虚线箭头,指向被包含的用例(必须执行)
  • 扩展(<<extend>>):虚线箭头,指向扩展的用例(条件满足时才执行)

14.3 时序图

  • 对象:矩形,标注对象名:类名
  • 生命线:从对象向下延伸的虚线
  • 消息:箭头线
    • 同步消息:实线实心箭头
    • 异步消息:实线空心箭头
    • 返回消息:虚线空心箭头
  • 激活条:对象生命线上的矩形条,表示对象正在执行操作

14.4 状态图

  • 状态:圆角矩形,内写状态名
  • 初始状态:实心圆
  • 终止状态:带圆圈的实心圆
  • 转换:箭头,标注事件[条件]/动作
  • 复合状态:状态内嵌套子状态

14.5 例题

例题1:在UML类图中,"汽车"和"发动机"之间的关系最可能是( )

A. 聚合 B. 组合 C. 泛化 D. 依赖

答案:B

解析:汽车和发动机之间是组合关系,因为发动机是汽车的一部分,且不能脱离汽车独立存在。聚合关系表示部分可以脱离整体存在(如"公司"和"部门"),而组合关系表示部分不能脱离整体存在。


例题2:在UML用例图中,<<extend>>关系表示的是( )

A. 基础用例必须包含扩展用例的功能 B. 扩展用例在特定条件下扩展基础用例的功能 C. 两个用例完全独立 D. 扩展用例可以替代基础用例

答案:B

解析:<<extend>>(扩展)关系表示扩展用例在特定条件下才会执行,扩展基础用例的功能。<<include>>(包含)关系表示基础用例必须包含被包含用例的功能。扩展是可选的,包含是必须的。


十五、算法设计 —— 下午题第4题(必答)

分值占比:约7-8分 | 备考建议:识别算法类型是关键,动态规划和分治最常见

15.1 分治法

  • 特点:将问题分解为若干规模较小的相同问题,递归求解后合并结果
  • 典型题目:归并排序、快速排序、二分查找、最近点对问题
  • 代码特征:递归调用+合并操作

15.2 动态规划

  • 特点:将问题分解为重叠子问题,保存子问题解避免重复计算
  • 典型题目:0-1背包问题、最长公共子序列、矩阵链乘法、编辑距离
  • 代码特征:双重循环+状态转移方程+数组记录子问题解

15.3 贪心法

  • 特点:每一步选当前最优解,期望得到全局最优
  • 典型题目:Huffman编码、Dijkstra最短路径、最小生成树
  • 代码特征:循环+贪心选择+排序

15.4 回溯法

  • 特点:深度优先搜索+剪枝,逐步构建解,不满足条件就回溯
  • 典型题目:八皇后问题、0-1背包(回溯版本)、子集生成
  • 代码特征:递归+for循环+回溯(撤销选择)

15.5 解题技巧

  • 识别算法类型
    • 有"最优""最大/最小"关键词 → 可能是动态规划或贪心
    • 有"分解""合并"关键词 → 可能是分治
    • 有"所有解""组合"关键词 → 可能是回溯
  • 代码填空
    • 先看递归基(终止条件)
    • 再看状态转移(如何从子问题得到当前问题)
    • 最后看返回值

15.6 例题

例题1:以下算法中,采用动态规划策略的是( )

A. 归并排序 B. 快速排序 C. 0-1背包问题 D. 二分查找

答案:C

解析:0-1背包问题是典型的动态规划问题,通过构建二维数组记录子问题解来避免重复计算。归并排序和快速排序采用分治策略;二分查找采用分治策略的简化形式。


例题2:某算法的核心代码如下:

for i = 1 to n:
for j = i+1 to n:
if A[j] < A[i]:
swap(A[i], A[j])

该算法采用的策略是( )

A. 分治法 B. 动态规划 C. 贪心法 D. 回溯法

答案:C

解析:该代码是选择排序的变体,每次选择最小元素放到前面,属于贪心策略——每一步选当前最小的元素。分治法需要分解问题递归求解;动态规划需要保存子问题解;回溯法需要递归+回溯。


十六、程序设计 —— 下午题第5/6题(二选一)

分值占比:约7-15分 | 备考建议:选一个语言(Java或C++),掌握5种常用设计模式的代码

16.1 单例模式

java 复制代码
// 饿汉式
class Singleton {
    private static Singleton instance = new Singleton();
    private Singleton() {}
    public static Singleton getInstance() {
        return instance;
    }
}

// 懒汉式(线程安全)
class Singleton {
    private static Singleton instance = null;
    private Singleton() {}
    public static synchronized Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}

16.2 工厂模式

java 复制代码
interface Product {
    void use();
}

class ConcreteProductA implements Product {
    public void use() { System.out.println("使用产品A"); }
}

class ConcreteProductB implements Product {
    public void use() { System.out.println("使用产品B"); }
}

class Factory {
    public static Product createProduct(String type) {
        if ("A".equals(type)) return new ConcreteProductA();
        else if ("B".equals(type)) return new ConcreteProductB();
        return null;
    }
}

16.3 观察者模式

java 复制代码
import java.util.*;

interface Observer {
    void update(String message);
}

class Subject {
    private List<Observer> observers = new ArrayList<>();
    public void attach(Observer o) { observers.add(o); }
    public void detach(Observer o) { observers.remove(o); }
    public void notifyObservers(String msg) {
        for (Observer o : observers) o.update(msg);
    }
}

class ConcreteObserver implements Observer {
    private String name;
    public ConcreteObserver(String name) { this.name = name; }
    public void update(String message) {
        System.out.println(name + " 收到通知: " + message);
    }
}

16.4 适配器模式

java 复制代码
interface Target {
    void request();
}

class Adaptee {
    public void specificRequest() {
        System.out.println("特定请求");
    }
}

class Adapter implements Target {
    private Adaptee adaptee;
    public Adapter(Adaptee adaptee) { this.adaptee = adaptee; }
    public void request() {
        adaptee.specificRequest();
    }
}

16.5 策略模式

java 复制代码
interface Strategy {
    int algorithm(int[] data);
}

class QuickSortStrategy implements Strategy {
    public int algorithm(int[] data) {
        // 快速排序实现
        return 0;
    }
}

class MergeSortStrategy implements Strategy {
    public int algorithm(int[] data) {
        // 归并排序实现
        return 0;
    }
}

class Context {
    private Strategy strategy;
    public Context(Strategy strategy) { this.strategy = strategy; }
    public void setStrategy(Strategy strategy) { this.strategy = strategy; }
    public int execute(int[] data) {
        return strategy.algorithm(data);
    }
}

16.6 解题技巧

  • 识别设计模式
    • 单例:只有一个实例 → 看是否有static instance + private构造
    • 工厂:创建对象 → 看是否有工厂方法根据参数创建不同对象
    • 观察者:一对多通知 → 看是否有注册/注销/通知机制
    • 适配器:接口转换 → 看是否有中间适配类
    • 策略:算法互换 → 看是否有策略接口和多个实现
  • 代码填空
    • 先理解类的职责和关系
    • 根据方法签名和注释推断代码逻辑
    • 注意继承/实现关系中的方法重写

16.7 例题

例题1:某系统需要确保一个配置管理类在整个应用中只有一个实例,且提供全局访问点。该场景最适合使用的设计模式是( )

A. 工厂模式 B. 单例模式 C. 观察者模式 D. 策略模式

答案:B

解析:单例模式确保一个类只有一个实例,并提供全局访问点。配置管理类通常只需要一个实例,适合使用单例模式。


例题2:某系统设计了一个支付模块,支持支付宝、微信支付和银行卡支付三种方式,且未来可能新增支付方式。客户端可以根据需要随时切换支付方式。该场景最适合使用的设计模式是( )

A. 单例模式 B. 工厂模式 C. 策略模式 D. 适配器模式

答案:C

解析:策略模式定义一系列算法(支付方式),封装它们并使它们可互换。客户端可以根据需要随时切换支付方式,符合策略模式的核心思想。工厂模式负责创建对象,但不负责算法的互换;适配器模式负责接口转换;单例模式保证唯一实例。