软件设计师 · 错题速记

69 题 · 点答案自测考试日 2026/05/23 冲!
软件工程结构化设计05/18
结构化开发中()主要包含对数据结构和算法的设计
过程设计
四活动分工:体系结构=分模块/调用关系;数据设计=数据库/文件存储结构;接口设计=模块间/外部/用户交互;过程设计=模块内部算法+局部数据结构。
题干"算法"只出现在过程设计。
数据结构树(度与叶子计数)05/18
度为3的树有5个度1、4个度2、2个度3节点,求叶子数
9
铁律:边数=节点数−1。
设叶子n,节点总数N=n+11;分支总数=Σ(度i·节点数)=5×1+4×2+2×3=19=N−1→N=20→n=9。
通用:N=Σnᵢ 且 Σ(i·nᵢ)=N−1,联立求解。
数据结构图的存储05/18
简单无向图N顶点E边,邻接矩阵非零元素数目
2E(与N无关)。
无向边对称记两次A[i][j]=A[j][i]=1,简单图对角线全0。
对照:无向矩阵2E/有向矩阵E;无向邻接表边结点2E/有向E。
口诀"矩阵看对称,无向翻倍有向单计"。
数据库三级模式两级映像05/18
物理独立性、逻辑独立性分别靠改哪个映像
物理→模式/内模式映像;逻辑→外模式/模式映像
口诀"映像名带'内'管物理,带'外'管逻辑";规律"哪层变改它上面的映像保上层不动"。
陷阱:外模式与内模式不直接相连,无此映像,含该说法的选项直接排除。
软件工程关键路径(AOE网)05/18
活动图求关键路径里程碑+活动GH松弛时间
关键路径A→B→D→I→J→L(工期20),在关键路径上的中间里程碑D/I/J;GH松弛=3
四步法:
①正推ee=max{前驱ee+w}
②逆推le=min{后继le−w}
③ee=le的点在关键路径
④活动(i→j)松弛=le(j)−ee(i)−w,关键活动松弛=0。
软件工程关键路径(AOE网)②05/18
求最少工期+活动BD最多可晚几天
最少工期24天(关键路径A→B→C→E→F→I→K→L);活动BD松弛=le(D)−ee(B)−w_BD=9−2−5=2天
再次验证四步法:松弛/总时差=le(终点)−ee(起点)−持续时间,即"某活动最多可拖延而不影响总工期"的天数。
计算机组成中断与DMA05/19
关于中断方式与DMA方式正确的是
A 两者都能实现外设与CPU并行工作
误选B"传输都不需CPU干预"→只有DMA不需要,中断方式靠CPU执行中断服务程序逐字搬数据需CPU全程参与。
C错(DMA比中断快);D错(中断必须保护现场,DMA不用)。
本质分水岭=数据传输过程是否需CPU干预。
速度:DMA>中断>程序查询;保护现场:中断要/DMA不用。
计算机组成机器数概念05/19
关于原反补叙述正确的是
A 正数原码=反码=补码
陷阱C"负数补码=反码−1"错→应是反码+1(自测易把+1记成−1,符号方向记反)。
其余:B错(补码0唯一,是原/反码有±0两种);D错(补码2ⁿ个值,原码因±0重复仅2ⁿ−1个)。
口诀"补码=反码+1,加一双向无减一;正数三码同;补码0唯一"。
计算机组成补码求真值05/19
"2X"补码为90H,求X真值
B −56
90H=10010000首位1为负,位权法=−128+16=−112即2X,X=−112/2=−56。
陷阱:90H是补码非原码/无符号(误读得72或144为错项A);要先解2X再除2,不能对90H直接折半;选C+56=漏负号。
口诀"十六进制补码先看首位定正负,首位1必负,位权法或取反加一求真值再按题运算回推"。
计算机组成浮点数位串求值05/19
格式阶符1+阶码4+数符1+尾数10,阶码补码尾数原码,求1 0001 0 0000000001的值
2⁻²⁵
阶符+阶码合成5位补码10001→真值−15(=−16+1);数符0正,尾数0000000001是纯小数=2⁻¹⁰;值=+1×2⁻¹⁰×2⁻¹⁵=2⁻²⁵。
四步:切段→阶符+阶码合成补码求指数→尾数按数符定正负且是纯小数2⁻ᵏ→(−1)^数符×尾数×2^指数。
易错:阶符要和阶码值合起来当补码;尾数是纯小数非整数。
计算机组成浮点数表示范围05/19
16位浮点(阶符1+阶码6,移码;数符1+尾数8,补码)表示范围
B: −2⁶³ ~ (1−2⁻⁸)·2⁶³
阶码共7位移码→最大指数=2⁶−1=63(故用2⁶³非2⁶⁴,排除带2⁶⁴的A/C);尾数8位补码→上界(1−2⁻⁸)、下界=−1(补码不对称,负方向多表示一个−1)→最负=−1·2⁶³=−2⁶³。
陷阱D把下界写成−(1−2⁻⁸)·2⁶³忽略补码多一个−1。
口诀"移码取2ⁿ⁻¹次幂;补码尾数上界差一点(1−2⁻ᵏ)下界整−1"。
计算机组成逻辑代数05/18
与 Ā⊕B 等价的表达式
AB+ĀB̄(同或)。
异或定义X⊕Y=X̄Y+XȲ代入X=Ā得;规律:异或取反奇数个输入→结果取反(变同或),偶数个→不变。
Ā⊕B=A⊕B̄=¬(A⊕B)。
UML识图三连05/18
带层次编号(1.1/2.1)的对象连线图,问图型/框/箭头标注
(41)通信图(协作图):有对象连线+消息编号、无生命线无时间轴(对比序列图靠竖直生命线);(42)对象:矩形+名字带下划线,`b:Book`/`:Order`;(43)消息:连线上`序号[条件]:方法()`,*=循环、点分=嵌套、[ ]=监护条件。
通用:找生命线→序列图,编号连线→通信图,泳道→活动图,圆角状态框→状态图,用例椭圆→用例图。
项目管理风险管理05/18
风险的优先级通常根据()设定
风险曝光度(风险暴露量RE)
RE=风险发生概率×风险发生后的损失(影响),RE越大优先级越高。
陷阱:只看概率或只看损失均错,必须两者乘积。
数据库封锁(锁相容)05/18
T1对D1加S锁,T2/T3对D2/D3加X锁,判断各加锁成败
B(T1对D2D3加排它锁都失败<D2D3已有X锁独占>,T2T3对D1加共享锁成功<D1已有S锁,S+S相容>)。
相容矩阵只有S+S成功,其余(S+X、X+S、X+X)全失败。
口诀"读读共享,有X全否,S+X也不行"。
算法策略8皇后05/18
8×8棋盘放8皇后不冲突一般采用
B 回溯法
N皇后是回溯法标志例题:逐行放+约束检查+不行就撤销退回(深搜剪枝)。
四策略识别:回溯=皇后/迷宫/图着色(试错回退、枚举可行解);贪心=找零/霍夫曼/Prim(每步最优不回头);动归=LCS/背包求最优值(存表避免重算);分治=归并/快排/二分(子问题独立、合并)。
区分:回溯子问题有约束需撤销,分治子问题独立不回退;回溯枚举所有解,动归求最优值。
网络层次化局域网模型05/18
核心层叙述正确的是
B 将分组从一区域高速转发到另一区域
核心层只管高速转发+冗余可靠,绝不做包处理/过滤/安全检查。
误选A(有效性检查)=汇聚层职责。
一句话记忆:接入连用户(计费/MAC认证)、汇聚做策略过滤寻址、核心只管高速冗余不碰包。
核心层选项出现"检查/过滤/策略/安全"一律错。
多媒体音频数字化05/18
计算机通过MIC话筒接口收到的信号
B 音频模拟信号
话筒输出连续电信号=模拟;数字化在声卡ADC内部:采样→量化→编码。
陷阱:A数字信号是ADC转换后、C采样/D量化是中间步骤均非接口收到的原始信号。
口诀"话筒进来是模拟,编码后才数字;扬声器输出前DAC转回模拟"。
网络广域网接入05/18
帧中继优点中"错误的是"
C(帧中继比异步传输模式ATM提供更高速率—说反,ATM远快于帧中继)。
陷阱:"异步传输模式"=ATM非异步串行。
速率梯队 X.25(≤64k) < 帧中继(≤2M) < ATM(155M+);DDN=独占专线稳但贵不灵活。
帧中继优点=比X.25快(简化、省差错/流控开销)、比DDN便宜灵活支持突发。
数据结构串(子串计数)05/18
长n字符互异串S,非平凡子串(非空且≠S)个数
n(n+1)/2 − 1 = (n+2)(n−1)/2(选项D形式)。
按长L的子串有n−L+1个,求和n(n+1)/2为全部非空子串,减1去掉S本身。
陷阱选项C=n(n+1)/2 漏减S本身;选项常给因式形式,要会把n(n+1)/2−1通分成(n+2)(n−1)/2。
辨析:子串(连续)非空n(n+1)/2;子序列(可不连续)非空2ⁿ−1。
口诀"串连续用n(n+1)/2,序列可跳用2ⁿ,真/非平凡再减S自身1个"。
计算机组成I/O控制方式选择05/19
微机中管理键盘最适合的I/O控制方式
D 中断方式
键盘=低速+随机设备,按键时机不可预测、数据量小。
中断方式按键时才主动向CPU发请求,既能及时响应又不空转浪费CPU。
四方式适用场景:无条件传送=外设随时就绪的简单设备(开关/LED);程序查询=慢速但CPU可专门等待轮询;中断=低速随机设备(键盘/鼠标);DMA=高速成批传输(磁盘/网络)。
口诀"键鼠用中断,磁盘网络DMA,简单开关无条件,CPU空等程序查询"。
计算机组成中断保存现场目的05/19
中断处理时保存现场的目的
C 能正确返回被中断的程序继续执行
现场=被中断程序断点处的CPU状态(PC、通用寄存器、PSW标志位)。
中断服务程序会改写寄存器,不先保存则返回后原程序无法从断点恢复。
陷阱:保存的是"被中断程序"现场非中断程序数据(排除A/D因果颠倒);防数据破坏是存储保护职责非保存现场(排除B)。
关联记忆:这正是中断比DMA多出的开销——中断要保护现场,DMA不用。
系统可靠性三性指标辨析05/19
用MTBF/(1+MTBF)度量的是哪个指标
B 可用性
可用性A=MTBF/(MTBF+MTTR),题目把MTTR归一化为1即得MTBF/(1+MTBF)。
辨析口诀:只看MTBF→可靠性;MTBF与MTTR做比值→可用性;只看MTTR→可维护性
健壮性=异常输入下不崩溃,与时间指标无关。
可靠性强调"不出错"、可用性强调"随时能用"、可维护性强调"坏了好修"。
信息安全数字签名密钥选择05/19
S签名用__、T验证用__
签名用S的私钥,验证用S的公钥(都用签名者S自己的密钥对)。
私钥唯S持有→签名只能S产生→实现不可否认+身份认证;公钥验证通过→证明确为S签且未篡改→真实性+完整性。
陷阱:T的公钥用于加密发给T的内容(保密性)非签名;T的私钥用于T解密别人发它的密文。
口诀"签名用己私,验证用己公;加密用对方公,解密用己私"。
两用途分水岭:数字签名防抵赖=发方私钥签/收方用发方公钥验;加密保机密=发方用收方公钥加密/收方私钥解。
编译原理符号表作用05/19
编译中记录各符号必要信息辅助语义检查和代码生成的是
B 符号表
符号表记录标识符(变量/函数/类型名)的名字、类型、作用域、存储位置等属性,贯穿词法分析(填表)→语义分析(查表做类型/作用域检查)→代码生成(查表定地址分配空间)。
干扰辨析:决策表=多条件组合逻辑工具(测试/需求);广义表=元素可为原子或子表的数据结构;索引表=加速查找的数据库/文件结构。
锁定关键词"编译+标识符信息+语义检查/代码生成"→符号表。
编译原理CFG句子判定05/19
文法 E→E+T|E-T|T;T→T*F|F;F→-F|id,符合的表达式
A a+-b-c
通用解法三步:
①读文法提炼硬约束
②拿约束秒杀违规选项
③剩下做推导验证。
本题硬约束:无括号(F只能→-F|id)、无除号(仅定义+ - *)、操作数仅单字母id(数字不行)。
排除:B有括号、C有数字2、D有除号/。
A可推导E→E-T→(E+T)-T→a+(-b)-c。
关键陷阱:区分二元减E→E-T(a减b)与一元负号F→-F(-b前缀取负),两者文法都支持。
编译原理语法制导翻译05/19
语法制导翻译是一种__方法
C 静态语义分析
SDT=在语法分析同时给每条文法产生式附加语义规则/动作,归约时执行完成翻译(类型检查、生成中间代码),发生在编译期。
区分:动态语义分析=运行时才能确定的语义(数组越界/除零);中间代码优化/目标代码优化=优化阶段,输入已是中间/目标代码。
锁定"语法制导/指导+翻译方法"→静态语义分析(编译期,把语义规则挂在产生式上)。
编译原理有限自动机DFA/NFA判定05/19
给定FA状态图判断确定性及能否识别某后缀
D 非确定的有限自动机,不能识别以bab结尾的
判DFA/NFA两条铁律:
①同一状态对同一输入符号最多1条出边(多条→NFA)
②无ε空转移(有ε→NFA),违反任一即NFA。
口诀"同字母多去向或有ε空边即非确定"。
本题S0对a有自环+前进两条边→NFA。
判能否识别某后缀:看接受状态(双圈)的入边字母——本题入边是a,故被接受串必以a结尾,不可能以b(如bab)结尾。
编译原理编译阶段·类型检查所在阶段05/19
编译C/C++时类型检查在哪个阶段处理
B 语义分析
编译阶段顺序:词法分析→语法分析→语义分析→中间代码生成→代码优化→目标代码生成。
各阶段职责:词法=切分单词token(不管类型);语法=按文法组语法树查结构(括号/语句结构,不管类型);语义=类型检查+作用域检查+参数匹配+运算合法性(类型检查在此,属静态语义);目标代码生成=译成机器指令(类型早定)。
记忆链"词法看单词对不对→语法看结构对不对→语义看类型/含义对不对"。
数据结构两栈共享空间(双端栈)栈满条件05/19
V[1..n]两栈共享,栈1底V[1]栈2底V[n],空时top[1]=1/top[2]=n(top指下一空位),栈满条件
D top[1]−top[2]==1
两栈底在数组两端相向生长,满=两栈顶指针碰头(相邻)。
推导:栈1放s1个则top[1]=s1+1;栈2放s2个则top[2]=n−s2;满时s1+s2=n→top[2]=s1→top[1]−top[2]=1(与各放多少无关)。
排除:A相等(指向同格,本约定下满时相邻非重合);C top[1]+top[2]=2s1+1非定值。
技巧:记不住公式就用小数组n=3手动模拟到满直接读top关系。
数据结构邻接矩阵判图类型+BFS05/19
6x6邻接矩阵(数字=边,∞=无边)判G类型并求BFS序列
问题1 B 有向图
读矩阵:第i行第j列=vi→vj,数字有边∞无边。
判类型核心看对称性:M[i][j]恒等于M[j][i]→无向图;不对称→有向图(本题M[v0][v1]=18但M[v1][v0]=∞,不对称)。
排除:完全图=任意两点都有边(有∞则非);强连通图=任意点互达(本题v5行全∞无出边,到不了别人,非强连通)。
BFS:从起点像水波一层层扩,先访问起点→其所有直接邻居→邻居的未访问邻居,同层按顶点编号顺序,用队列(FIFO);对比DFS用栈/递归"一条路走到黑再回头"。
本题BFS=v0→v1→v2→v3→v4→v5。
数据结构图存储与性质(真题组)05/19
邻接表/邻接矩阵空间+连通图边数+稀疏矩阵压缩
①邻接表边结点数:无向=2e(恒偶)、有向=e;出现奇数个边结点→必是有向图(与顶点数无关)。
②邻接矩阵空间恒n²(与边数e无关);邻接表空间=O(n+e)(与e有关)。
③无向连通图边数:最少=n−1(树,再少则不连通)、最多=n(n−1)/2(无向完全图);有向完全图=n(n−1)(无向2倍)。
④稀疏矩阵压缩存储=三元组顺序表+十字链表(只存非零元)。
陷阱:连通图最少边是n−1非n;最多是n(n−1)/2非n²/2。
数据结构串(KMP的next函数)05/20
模式串p="abaac",j从1开始,求next函数值
{0,1,1,2,2}
本质=前j−1个字符的最长公共真前后缀长度+1(j=1特殊为0)。
逐位求:j=1→0(规定);j=2→1(前1个字符无真前后缀);j=3 p[1..2]="ab"前缀a≠后缀b→1;j=4 p[1..3]="aba"前缀"a"=后缀"a"长1→1+1=2;j=5 p[1..4]="abaa"前缀"a"=后缀"a"长1("ab"≠"aa"故非2)→1+1=2
铁律:j=1永远0,j=2永远1;比较时必须真前缀+真后缀(不能取整串)。
陷阱:别把"长度"和"长度+1"搞混,公式里k−1=公共前后缀长,k本身才是next值。
数据结构二维数组按行存储地址计算05/20
二维数组A按行优先,每元素2单元,A[0][0]=100,A[3][3]=220,求A[5][5]
300
公式 Addr(A[i][j])=base+(i×列数+j)×size(行优先)/(j×行数+i)×size(列优先)。
三步法:
①读题定方向(行/列优先)
②用已知两点列方程求未知维度:(3×n+3)×2=220−100=120→n=19列
③代回 100+(5×19+5)×2=100+100×2=300
口诀"先变下标×另一维总数+另一下标":行优先行先变(行号×列数);列优先列先变(列号×行数)。
陷阱:下标从0还是1要看清(本题从0);别漏×size;两已知地址不一定相邻,差值=两个公式相减。
数据结构三对角矩阵压缩存储05/20
n阶三对角矩阵(非零元仅在主对角线及紧邻两条对角线,即|i−j|≤1)按行压缩存B,A下标从0,B下标从1,A[0][0]→B[1],A[n−1][n−1]→B[3n−2],求A[i][j]位置
B[2i+j+1]
总非零元数=3n−2(主对角n+上下各n−1);按行存储分布:首末行各2个元素,中间行各3个。
推导:
①前i行元素数=2+3(i−1)=3i−1
②A[i][j]在第i行内序号=j−(i−1)+1=j−i+2
③合计=3i−1+j−i+2=2i+j+1
验证两端:A[0][0]→2·0+0+1=1✓;A[n−1][n−1]→2(n−1)+(n−1)+1=3n−2✓。
考场套路:套通式 B下标=2i+j+常数,用任一已知点反推常数(本题A[0][0]=B[1]→常数=+1)。
类似公式速查(A从0,B从1):三对角=2i+j+1;下三角=i(i+1)/2+j+1(i≥j);上三角=i(2n−i+1)/2+(j−i)+1(i≤j);对称矩阵两侧映射同一处用三角阵公式。
数据结构对称矩阵下三角压缩存储05/20
n阶对称矩阵Mt,下三角(含对角)按行压缩到Sp,Mt和Sp下标均从0,Mt[0][0]→Sp[0],求Mt[i][j](i≥j)
Sp[i(i+1)/2+j]
总元素数=n(n+1)/2(只存一半)。
按行存储分布:第i行存i+1个(从Mt[i][0]到Mt[i][i])。
推导:
①前i行元素数=1+2+...+i=i(i+1)/2
②第i行内偏移=j(j从0数)
③Sp从0直接相加=i(i+1)/2+j。
关键陷阱:若问i<j情况,用对称性Mt[i][j]=Mt[j][i],套j(j+1)/2+i(交换i,j角色)。
起点处理速记:Sp从0→公式即"前面元素数+偏移";Sp从1→公式整体+1。
数据结构三对角矩阵压缩(下标从1版)05/20
n阶三对角矩阵A按行存储,A和M下标均从1,a₁,₁→M[1],求aᵢ,ⱼ(|i−j|≤1)
M[2i+j−2](选D)。
数据结构树(森林转二叉树·右子树结点数)05/20
三棵树构成森林,结点数n1/n2/n3,转二叉树后右子树有几个结点
D n2+n3
核心规则=左孩子右兄弟法:
①第1棵树根→二叉树根
②第1棵树根的孩子串成兄弟链→左子树(共n1−1个,不含根)
③森林中其余各棵树整棵(含根)依次挂到根的右子树链→右子树=n2+n3。
易错点:右子树包含第2、3棵树的根,不是"n2+n3−2";左子树是n1−1不是n1(第1棵根已当二叉树根用掉,易误选B "n1+n2")。
口诀"长子做左孩子,兄弟做右孩子;第1棵吃根+左,其余整棵进右"
反向(二叉树→森林):沿根的右子树链切割,每切一刀分出一棵树,有k个右子链结点→森林共k+1棵树。
相关结论:森林叶子数=二叉树中左孩子为空的结点数;森林结点总数=n1+n2+n3(转换前后不变,只是连接方式变)。
与"A从0/B从1版本"对比:通式不变 M[2i+j+c],只是常数c随起点变化。
反推法30秒秒杀:代入边界点a₁,₁→M[1]:2·1+1+c=1→c=−2→M[2i+j−2]。
四种起点速查表:
①A从0,M从1→c=+1(2i+j+1)
②A从1,M从1→c=−2(2i+j−2)
③A从0,M从0→c=0(2i+j)
④A从1,M从0→c=−3(2i+j−3)。
为啥系数恒为(2,1):每多一行+3个元素,但i偏移=行号增量×3;列j自身偏移=1;通分约简后=2i+j。
核心心法:别背死公式,记"2i+j+c"框架,用任一已知点反推c即可——所有三对角题30秒搞定。
数据结构哈夫曼树构造与编码长度05/20
7字符{a,b,c,d,e,f,g}频次{5,24,8,17,34,4,13},求各字符哈夫曼编码长度
a=5,b=2,c=4,d=2,e=2,f=5,g=3(WPL=266)。
构造铁律:每次从队列取频次最小的两个合并,新结点(=两频次之和)放回队列继续排序,直到剩一个根。
本题流程:f4+a5=9 → c8+9=17 → g13+17=30 → d17+b24=41 → 30+e34=64 → 41+64=105。
编码长度=结点到根的路径长度(边数),频次最大者(e/b/d)最短在第2层,最小者(f/a)最深在第5层。
口诀"频次越小越深,编码越长"
陷阱:有相同频次时合并顺序可能不唯一,但WPL唯一(不同合并方案得到的二叉树形态不同但带权路径长度和相等),考试以"先生成先合并"为准。
前缀编码性质:任一字符编码均不是另一字符编码的前缀(因都是叶子,根到叶子路径互不包含)→解码无歧义。
数据结构完全二叉树最多结点数05/20
一个有n0=124个叶子节点的完全二叉树,最多有多少结点
D 248=2n0(当n1=1时取最大)。
公式:二叉树通用 n0=n2+1;完全二叉树特有 n1∈{0,1};总结点 n=n0+n1+n2。
两种极值:最多结点=2n0(n1=1)、最少结点=2n0−1(n1=0)。
本题:n1=1时 n=124+1+123=248;n1=0时 n=124+123=247(对应A选项陷阱)。
形象验证:树高h=8时,前7层满共127,第8层放121个时第7层有1个度为1的父亲(挂着第121个叶子)、其余3个直接当叶子,叶子合计121+3=124✓,总结点127+121=248✓。
口诀"完全二叉树叶子n0定后,结点数仅两种:2n0或2n0−1"
数据结构k叉树叶子数公式(度均为k的树)05/20
n个结点的树,所有分支结点(非叶子)度都为k,求叶子数
C [n(k−1)+1]/k
两条方程:
①n0+nk=n(总结点)
树的边数=n−1且边数=nk·k(每个分支节点贡献k条边到孩子) → nk=(n−1)/k。
联立:n0=n−(n−1)/k=[n(k−1)+1]/k
特例验证:k=2(满二叉树)→n0=(n+1)/2✓。
通用心法:树的边数恒为n−1(树最基本性质),只要题目给度数分布,用Σ(度·节点数)=n−1即可求解。
类比真题:度为3的树有5个度1+4个度2+2个度3节点求叶子→设叶子n0,总数N=n0+11,Σ度=5+8+6=19=N−1→N=20→n0=9,同源公式不同包装。
数据结构n个结点二叉树形态数(卡特兰数)05/20
3结点二叉树有5种,推4结点二叉树有几种
C 14
核心结论:n个有区分结点的二叉树形态数=卡特兰数 Cn=C(2n,n)/(n+1)。
前6项速记表"1,1,2,5,14,42":C0=1,C1=1,C2=2,C3=5,C4=14,C5=42。
递推公式(不记公式也能秒推):f(n)=Σf(i)·f(n−1−i)(i=0..n−1),按左子树i个+右子树n−1−i个分类求和。
本题:f(4)=f(0)f(3)+f(1)f(2)+f(2)f(1)+f(3)f(0)=1·5+1·2+2·1+5·1=14
辨析:本题问形态(树形结构种数)非排列;若问n个不同标号结点能组成多少不同二叉树=Cn·n!(形态×标号排列)。
口诀"形态卡特兰,排列再乘n阶乘"
数据结构二叉链表空指针数05/20
k个结点的二叉树用二叉链表(左/右孩子两指针)存储,问空孩子指针数
C k+1
两步推导:
①总指针=2k(每结点2个)
②非空指针=实际边数=k−1(树的n结点恰有n−1条边铁律)
③空指针=2k−(k−1)=k+1
等价视角:由n₀=n₂+1,空指针数=2n₀+n₁=n₀+(n₀+n₁)=n₀+(n−n₂)=n₀+n−(n₀−1)=n+1,与k+1一致。
拓展:三叉链表(带父指针)总指针3k、空指针k+2(根的父+各叶子的左右减边贡献)。
易错:别把"空指针数"算成"叶子数"(那是n₀,空指针更多因度1节点也贡献1个空)。
口诀"二叉链表空指针=结点数+1"——记住"+1"来自n₀=n₂+1这个二叉树根本恒等式。
数据结构图·拓扑排序顶点先后关系05/20
对有向图G拓扑排序,Vi在Vj之前,则G中?
B 一定不存在有向弧⟨Vj,Vi⟩
核心定义:拓扑序对每条边⟨u,v⟩要求u在v前(充分非必要)。
逆否秒杀:"Vi在Vj后→无⟨Vi,Vj⟩边"→换名即得本题答案。
排除:A错(Vi在前不要求直连,可能无关);C错(可能毫无路径,两独立分支仍能定序);D错(若有Vj→Vi路径则Vj应在前,矛盾)。
反例驳A/C:两孤立点V1,V3外加V1→V2,合法拓扑序"V1,V3,V2"中V1先于V3但既无边也无路径。
三大易错认知:
①拓扑序唯一?❌(DAG拓扑序通常不唯一,多入度0的点可任选)
②相邻顶点必有边?❌
③在前=祖先?❌(对无关顶点也强行定序)。
口诀"拓扑看方向:前面不能被后面指向"——只能断言反向边/路径不存在,不能断言正向。
数据结构图·邻接矩阵存储大小05/20
n顶点e边的无向图G用邻接矩阵存,矩阵大小
B n²
铁律:邻接矩阵尺寸=n×n,只看点数,与边数e完全无关(边再多再少矩阵都是n²)。
两概念别混:
矩阵尺寸(n²,与e无关)
非零元素数(无向=2e/有向=e,与e有关)。
邻接矩阵vs邻接表:矩阵空间O(n²)稠密图优;邻接表空间O(n+e)稀疏图优。
口诀"矩阵看点数,非零看边数;稠密用矩阵,稀疏用邻表"
陷阱:见到选项含e的(n*e、n²+e²、(n+e)²)直接否,矩阵尺寸永远纯n²。
数据结构图·Dijkstra最短路径算法(策略+计算)05/20
Dijkstra求A→E最短路径,问算法策略+路径长度
策略=贪心法;长度=5(路径A→D→F→E=2+2+1)。
算法本质:Dijkstra每步从未访问点中选当前dist最小的入S集,再松弛其邻居→典型贪心(局部最优扩展)。
三列表法:维护S集+dist表,循环"选最小→松弛邻居"。
松弛公式:dist[v]=min(dist[v], dist[u]+w(u,v))。
贪心算法家族对照:Dijkstra(最短路径)、Prim/Kruskal(最小生成树)、Huffman(最优编码)——这些都是贪心。
与其他策略辨析:Floyd求多源最短路径=动态规划(O(n³));BFS求无权图最短路径=贪心思想;DFS不能求最短路径。
陷阱:Dijkstra只适用于非负权图,负权边要用Bellman-Ford(动态规划)。
实战避坑:计算时要枚举所有候选路径不能跳步,本题A→C→D→F→E看似合理但1+5+2+1=9远不如A→D→F→E=5,直觉常被"先走小边1"误导。
软件工程关键路径·非关键活动判定05/20
给活动表(工期+前驱),问最短工期+缩短哪个活动不能缩短总工期
工期=19周;非关键活动=B、C、G(任一)
两层判定:
关键路径(总时差TF=0)上的活动→缩短它减总工期
非关键路径(TF>0)上的活动→缩短它不能减总工期。
四步法标准流程:
①正推ES/EF:ES=max(前驱EF),EF=ES+工期
②逆推LS/LF:LF=min(后继LS),LS=LF−工期
③TF=LS−ES
④TF=0的活动连成关键路径。
本题关键路径:A→D→E→F→H(3+3+5+4+4=19);非关键活动TF:B=2、C=2、G=1。
强迷惑陷阱:B工期5周看似关键(数值最大),实则TF=2缩短无效→工期长≠关键活动,必须用TF判定。
速验方法:把候选活动工期改成极小值再算总工期,变了即关键、不变即非关键。
与AOE考点联动:活动松弛时间=该活动可拖延而不影响总工期的天数=该活动的TF(总时差)。
数据结构图·非连通图最少顶点数05/20
无向图G非连通有28条边,求最少顶点数
B 9
极值构造法:让顶点最少→边塞最满→构造K_{n−1}+1孤立点,要求 (n−1)(n−2)/2 ≥ e
本题:(n−1)(n−2)≥56,试n=9得8×7=56✓、n=8得7×6=42❌,故最少9(8顶点完全图28边+1孤立点)。
互逆结论:n顶点图非连通的边数上界=(n−1)(n−2)/2;反过来边数>(n−1)(n−2)/2则必连通
对比记忆:n顶点无向图边数极值:连通最少n−1(树)、连通最多n(n−1)/2(完全图)、有向完全图n(n−1)。
易错点:别忘那个孤立点也算1个顶点(若只填n−1顶点跑K_{n−1}就是连通图了,题目要求非连通),所以最终答案是n=n−1顶点的K +1孤立=n
口诀"非连通最少顶点=完全图填满+1个孤魂"——记住"+1"用来制造非连通性。
操作系统PV操作信号量取值范围05/20
n(n≥5)个进程共享资源R,可用数为5,信号量S取值范围
D -(n-5)~5
信号量语义:S>0表示剩余可用资源数;S=0资源用完无人等;S<0则 | S | =阻塞等待的进程数。
最大值=初始值=可用资源数m(无人用);最小值=m−n=-(n−m)(全部n个进程都P了,n−m个阻塞)。
通用公式:信号量范围=-(n−m)~m,其中m=资源数,n=竞争进程数。
本题m=5,范围=-(n-5)~5。
陷阱:B选项-5~5把下界固定为-5,忽略了阻塞数取决于进程总数n而非资源数;C选项-(n-1)~1混淆了互斥信号量(初值1)的情况。
操作系统页式存储地址变换05/21
页面4K,页表{0→2,1→3,2→5,3→6},逻辑地址3C20H求物理地址
6C20H
三步法:
①页面大小定偏移位数:4K=2¹²→偏移占12位=十六进制后3位
②拆逻辑地址:3C20H→页号=3,偏移=C20H
③查表换页号为物理块号:页3→块6,拼接=6C20H。
口诀"拆-查-拼":后N位是偏移不动,前面是页号查表换成块号
页面大小速查:1K→后10位;2K→后11位;4K→后12位=后3位hex;8K→后13位。
陷阱:别把整个地址当页号去查表;注意页面大小单位是字节非位。
操作系统页面置换淘汰代价05/21
页表含状态/访问/修改位,缺页时哪页淘汰代价最小
选修改位=0的页(本题页3)。
代价等级(从小到大):
①访问0修改0(直接丢)
②访问0修改1(需写盘)
③访问1修改0(可能再用但不写盘)
④访问1修改1(又要写盘又可能再用)。
核心原则:修改位权重>访问位权重——修改过=淘汰时必须写回磁盘(I/O开销大);未修改=直接覆盖无开销。
口诀"淘汰先选没改过的(省写盘),再选没访问过的(不会再用)"
这就是NRU(最近未使用)/ 改进Clock算法的思想:按(访问位,修改位)四类分优先级淘汰。
操作系统设备管理·单/双缓冲区时间计算05/21
盘块=缓冲区,读入15μs/送用户区8μs/处理4μs,12个盘块,单缓冲与双缓冲处理总时间
单缓冲=324μs;双缓冲=192μs
统一用流水线公式 T = 单条完整时间 + (n−1)×Max(各阶段)
单缓冲:三阶段全串行(读→送→处理共用一个缓冲区),周期=27,T=27+11×27=12×27=324
双缓冲:两缓冲区使"读入"与"送+处理"可并行→2级流水,阶段1=读15、阶段2=送+处理=8+4=12,周期=Max(15,12)=15,1条完整=15+12=27,T=27+11×15=192
等价快算(双缓冲):n次读入+最后一块的送处理尾巴=15×12+12=192。
为什么"送+处理"算一个阶段:数据一旦从缓冲区送到用户区,缓冲区就空了可以接新块,CPU处理在用户区独立进行,与下一块读入不冲突。
口诀"双缓冲=两级流水,周期取Max(读,送+处理)"
陷阱:别把双缓冲拆成3级流水(读/送/处理三阶段)——因为送和处理用的是用户区,不竞争缓冲资源,合并成一段;若题目说"处理时缓冲区不释放"才能拆三级。
操作系统设备管理·磁盘旋转调度(信息排列优化)05/21
一周10ms分10块/块=1ms,读1ms处理2ms,磁头初始R1头,R1..R10顺序存放,求未优化最长时间+优化后最少时间
未优化=102ms;优化后=30ms
核心机理:处理记录时磁头不停转!读R1花1ms→磁头到块2头,处理R1花2ms→磁头又转过2块到达块4头,此时要读R2(在块2)已错过→必须等磁头转一圈回到R2,等待=10−2=8ms
未优化每记录耗时=读1+处理2+等8=11ms,前9个都要等,最后R10处理完即结束不用再等→T=9×11+(1+2)=99+3=102ms
优化思路:让记录间隔 = 读+处理 = 3块,排列变成"跳3存放":块1=R1、块4=R2、块7=R3、块10=R4、块3=R5、块6=R6、块9=R7、块2=R8、块5=R9、块8=R10。
这样处理完一个记录磁头刚好到下一个记录开头→无等待,T=10×(1+2)=30ms
通用公式:
①未优化 T=(n−1)×[读+处理+(周期−已转过的块数)]+(读+处理)
②优化后 T=n×(读+处理)(前提:读+处理≤周期,否则跨多圈)。
口诀"处理时磁头照转,错过就等一圈;按读+处理跳着存,零等待跑满"
陷阱:
①别忘最后一条不等待(否则多算8ms变110);
②"跳3"的3是"读+处理"总和,不是处理时间;
③若读+处理>周期(如读5处理8≥10),需重新设计跨圈调度。
实战速判:看到"顺序存放磁盘+处理时间长"题型,99%是这套路。
操作系统文件管理·位示图大小计算05/21
字长64位,磁盘512GB,物理块4MB,求位示图大小(字数)
2048字 = 2¹¹
三步法+全用2的幂次:
①磁盘块数=容量÷块大小=2³⁹÷2²²=2¹⁷块(512GB=2⁹×2³⁰B=2³⁹B;4MB=2²²B)
②位示图位数=块数=2¹⁷位(1块对应1位,0=空闲/1=占用)
③字数=位数÷字长=2¹⁷÷2⁶=2¹¹=2048字
通用公式 字数 = 磁盘容量/(块大小×字长),本题=2³⁹/(2²²×2⁶)=2¹¹。
单位换算表:1KB=2¹⁰B、1MB=2²⁰B、1GB=2³⁰B、1TB=2⁴⁰B,统一换成B或全用幂次。
口诀"块数=容量÷块,位数=块数,字数=位数÷字长"
陷阱:
①单位别混(GB和MB差2¹⁰倍);
②字长单位是"位"非"字节",64位字长=8字节;
③题目问"几个字"还是"几字节"还是"几位",看清单位再答(本题问"个字"=2048,若问字节则×8=16384B,若问位则×64=131072);
④位示图1位代表1块,不是1字节。
关联:成组链接法用块号链不用位图;UNIX多级索引也跟物理块大小相关,常组合出题。
操作系统文件管理·多级索引最大文件长度05/21
磁盘块1KB,块号3B,求二级索引最大文件长度(K字节)
116281K = 341²K
核心公式 n级索引最大文件 = mⁿ × 块大小,其中 m = 每块容纳的块号数 = 块大小÷块号字节数(向下取整)。
本题:m=1024÷3=341(余1字节浪费),二级=341×341=116281块,每块1K→116281K
索引级数速查表:
①一级=m×B(直接指向数据块)
二级=m²×B(一级索引指二级索引块,二级再指数据)
③三级=m³×B
④混合索引=直接块+一级+二级+三级 求和(UNIX inode的13个指针就是直接10+一级1+二级1+三级1模型)。
典型块号字节数:常见3B/4B(4B更主流,因为现代磁盘大);块号字节数直接决定m,进而平方/立方放大。
陷阱:
①1024÷3=341非341.33非342(整数除法向下取整);
②二级是m²不是2m(常见错答:682 K=2×341);
③看清问"几K/几B/几块",单位别错;
④若题给"前k块直接寻址"是混合索引,要分段累加;
⑤块号字节数表示一个块号编码所需字节,不是数据块大小。
与位示图对照记忆:位示图算"管几个块",索引算"寻址几个块",分母都涉及"块大小/单位字节",但位示图1块对应1位,索引1块对应1个块号(数字节)。
数据库关系规范化(范式分解)05/20
元件关系P(元件号,元件名称,供应商,供应商所在地,库存量),F={元件号→元件名称,(元件号,供应商)→库存量,供应商→供应商所在地},求主键/分解/达到范式
主键=(元件号,供应商);分解为R1(元件号,元件名称)、R2(供应商,供应商所在地)、R3(元件号,供应商,库存量);达到3NF
范式层级口诀"2NF管部分,3NF管传递":2NF=非主属性必须完全依赖整个主键(不能只靠主键一部分);3NF=非主属性必须直接依赖主键(不能通过别的非主属性中转)。
本题原关系存在部分依赖(元件名称只依赖元件号、供应商所在地只依赖供应商)→连1NF→2NF都不满足;按FD拆分后每个子关系无部分依赖无传递依赖→3NF。
操作系统文件管理·位示图字编号定位05/21
字长32位,物理块从0编号,2053号块在位示图编号几的字中
64
字编号=块号÷字长(向下取整),位编号=余数
2053÷32=64余5→落在字64(覆盖块2048~2079)的第5位。
口诀"字号=块号÷字长取整,位号=余数"
陷阱:
①编号从0开始才能直接除,若从1开始须先减1再除;
②用向下取整(商)而非向上取整。
与"位示图大小"互逆:求大小是已知总块数÷字长得字数;求定位是已知某块号÷字长得它在第几个字。
操作系统文件管理·位示图大小(非2的幂容量)05/21
字长32位,磁盘300GB,物理块4MB,求位示图字数
2400字
①块数=容量÷块大小=300GB÷4MB=(300×1024)MB÷4MB=76800块
②字数=块数÷字长=76800÷32=2400
通用公式 字数=容量÷(块大小×字长)
陷阱:本题容量300GB非2的幂,必须老实用 1GB=1024MB 换算(300GB=307200MB),不能套2的幂次速算;字长单位是"位"。
与上方"字长64位/512GB"位示图大小条同源,仅参数不同。
操作系统文件管理·索引节点多级寻址(块定位+最大文件)05/21
8地址项iaddr[0~7]各4B,索引块/数据块均1KB;iaddr[0~4]直接、iaddr[5~6]一级间接、iaddr[7]二级间接。求逻辑块5/517各走哪级+单文件最大长度
块5→一级间接;块517→二级间接;最大文件=66053KB
先算每索引块容纳块号数 m=块大小÷地址项字节=1024÷4=256
各级覆盖范围(逻辑块从0):直接=iaddr[0~4]共5块→块0~4;一级间接=2项×256=512块→块5~516(iaddr[5]管5~260、iaddr[6]管261~516);二级间接=256²=65536块→块517~65792。
故块5落一级、块517刚溢出到二级。
最大文件公式 =(直接项数+一级项数×m+二级项数×m²)×块大小=(5+2×256+1×256²)×1KB=(5+512+65536)=66053KB
陷阱:
①逻辑块从0,直接5项覆盖0~4不是1~5;
②一级间接有2项要×2、二级才1项,看清每级占几个地址项;
③最大长度三部分(5+512+65536)全加,别只算二级65536;
④m=块号个数=块大小÷地址项字节,非块大小本身;
⑤边界卡极紧(一级末尾正好516,517才进二级)。
与上方"二级索引最大文件mⁿ×块大小"同源,本题是混合索引须分段累加。
操作系统进程管理·进程状态转换(运行态去向)05/21
单处理机,P1运行/P2就绪/P3等待打印机/P4等待扫描仪,若P1时间片到,求四进程新状态
就绪、运行、等待、等待(C)
核心辨析=运行态丢掉CPU去就绪还是等待:
时间片到/被抢占→运行转就绪(进程没缺任何资源,仍可运行,只是排队等下一轮CPU);
申请资源/IO阻塞→运行转等待(缺资源,资源不到位就跑不了);
③运行结束→完成。
本题P1时间片到回就绪,空出的CPU给唯一就绪的P2→运行,P3/P4设备未就绪→照旧等待。
四态转换四条边:就绪→运行=被调度选中(进运行的唯一入口);运行→就绪=时间片到(还能跑);运行→等待=申请资源阻塞(跑不了);等待→就绪=资源到位被唤醒
陷阱:
①让出CPU时"没缺资源"进就绪、"缺资源"进等待,二者天差地别别混;
被唤醒的等待进程只能进就绪,不能直接回运行,必须重新排队等调度;
③题干虽写FCFS(严格说非抢占无时间片),本题实际考点是状态转换概念,按"时间片到"理解即可。
面向对象重载Overload与覆盖Override(与多态关系)05/21
选"不正确"的叙述
B"重载通过动态绑定机制实现多态"——错(选它)
重载是编译时/静态绑定,编译期靠"方法名+参数表(签名)"决定调哪个,与动态绑定无关;能通过动态绑定实现(运行时)多态的只有覆盖
核心对照表:重载Overload=同一类内、名同但参数表必须不同、编译时多态、静态绑定、按参数区分;覆盖Override=父子类间(继承)、名/参数/返回值全相同、运行时多态、动态绑定、按对象实际类型区分。
口诀"重载看参数编译定,覆盖看对象运行定,动态绑定只认覆盖"
陷阱:
①"覆盖通过动态绑定实现多态"是正确叙述,别因"动态绑定"陌生就误判它错;
②重载是编译时多态、不少教材不把它算真多态,真多态(动态绑定)专指覆盖;
③覆盖要求方法签名完全相同,重载恰恰要求参数表不同——签名同/不同是区分二者的关键。
面向对象软件测试四层次05/21
①测一组协同工作的类之间的相互作用属于()层 ②测类中定义的每个方法属于()层
①模板层(D) ②算法层(A)
四层次粒度由小到大:算法层<类层<模板层<系统层
对照表:算法层=测类中定义的每一个方法(单个方法,类比单元测试);类层=测同一个类内所有方法与属性的相互作用(单个类整体,类比模块测试);模板层(主题层)=测一组协同工作的类之间的相互作用(多类协作,类比集成测试);系统层=把整个系统当一个整体测(类比系统测试)。
抓关键词秒选:"每个方法"→算法;"同一类内方法+属性"→类;"一组类/类之间/协同工作"→模板;"整个系统/整体"→系统。
口诀"方法→算法,单类→类,多类协作→模板,整体→系统"
陷阱:
①"一组类协同"是模板层不是系统层(系统层指整体非几类协作);
②"类中每个方法"是算法层不是类层(类层测整个类内交互,算法层针对单个方法);
③模板层≠设计模式的模板,是固定术语别被字面带偏。
面向对象关联类(多对多关系建新类)05/21
哪两者之间的关系需要创建新类:A汽车-座位 B主人-宠物 C医生-病人 D部门-员工
C 医生和病人
判定核心=只有"多对多"关系才需创建一个新类(关联类),一对多不需要
逐项看:汽车-座位(1对多,座位只属1车)、主人-宠物(1对多)、部门-员工(1对多,员工只属1部门)全是一对多;唯有医生-病人是多对多(一医生看多病人、一病人也看多医生)。
为什么多对多要新类:关系本身携带"既不属于A也不属于B"的信息(就诊时间/诊断/处方/费用),放不进医生类也放不进病人类,须新建关联类(如"就诊记录")承载。
口诀"一对多加外键引用即可,多对多必拆中间类(关联类)"
数据库佐证:多对多无法直接用外键,必须建中间表→对应面向对象就是这个新类。
陷阱:
①别把一对多误判成多对多(看"反过来一端是否也为多");
②部门-员工/主人-宠物虽是包含/拥有关系但都是一对多不需新类;
③整体-部分(组合/聚合,如汽车-座位/部门-员工)≠需要关联类。
软件工程软件测试·黑白盒依据05/23
黑盒测试的主要依据是()
软件需求规格说明书
黑盒测试=功能测试,把程序当不透明盒子,不看内部代码,只验证"输入→输出"是否符合功能需求→依据描述功能的需求规格说明书。
核心对照:黑盒测试依据需求规格说明书(测"做什么"),白盒测试依据程序内部逻辑结构(测"怎么做",如语句覆盖/路径覆盖)。
陷阱:
设计文档(描述模块结构/接口/怎么实现)是内部实现层面,≠功能需求,易与需求说明书混淆;
②代码复杂度、程序内部逻辑均属白盒范畴。
口诀"黑盒看需求测功能,白盒看代码测结构"
数据结构堆(大顶堆/小顶堆判定)05/23
给出几个序列,问哪个满足大顶堆条件
大顶堆=每个父结点≥它的所有孩子;小顶堆=每个父结点≤它的所有孩子
判定法:序列按层填入完全二叉树(数组下标从0),下标i的左孩子=2i+1、右孩子=2i+2;只需逐个检查非叶子结点(下标0~⌊n/2⌋−1,n个结点)是否都≥(或≤)其孩子,任一处违反即排除。
核心陷阱:堆只要求父子有序,兄弟之间、堂兄弟之间无任何大小要求(堆≠排序好的数组,是常见误区);只比父子,别去比同层。
口诀"父子有序定堆,大顶父≥子小顶父≤子;只看前一半结点,2i+1/2i+2找孩子"
网络互连设备与OSI层次对应05/23
网络互连设备中属于物理层的是()属于网络层的是()
物理层=中继器(Repeater);网络层=路由器(Router)
设备↔层次必背表:物理层=中继器/集线器(Hub)(只放大再生信号、不认地址);数据链路层=网桥(Bridge)/交换机(Switch)/网卡(认MAC地址转发帧、隔离冲突域);网络层=路由器/三层交换机(认IP地址选路、隔离广播域);应用层=网关(Gateway)(协议转换全能翻译)。
最大陷阱=中继器vs网桥:网桥/交换机是数据链路层不是物理层,易误把网桥当物理层。
判定核心=认不认地址:不认地址只放大信号→物理层;认MAC→链路层;认IP→网络层。
口诀"中继集线器看信号(物理),网桥交换机看MAC(链路),路由器看IP(网络),网关翻译(应用);设备越往上越聪明"
软件工程ISO/IEC 9126质量模型(可维护性子特性)05/23
可维护性的()子特性指"与确认经修改软件所需努力有关"的属性
易测试性(Testability)
题眼="确认/验证经修改软件"=测试环节→易测试性。
可维护性4子特性按"改前→改中→改后"记"分改稳测":
易分析性=诊断缺陷/失效原因、定位待修改部分的努力(找问题);
易改变性=实施修改本身的努力(动手改);
稳定性=修改引起意外影响的风险(改了别出乱);
易测试性=确认/验证已修改软件的努力(改完去测)。
最大陷阱=易改变性vs易测试性:易改变=做修改的力气、易测试=改完验证的力气;题干"为确认"是验证非实施→易测试性。
口诀"看到确认/验证/测试选易测试,看到实施/进行修改选易改变"
9126六大质量特性:功能性、可靠性、易用性、效率、可维护性、可移植性。
UML图的选型(部署图vs组件图)05/23
展示所交付系统中软件组件和硬件之间的物理关系用()图
部署图(Deployment Diagram)
锁定关键词"硬件"+"物理关系"→UML中唯一涉及硬件的图就是部署图,描述软件构件部署到硬件节点(服务器/设备)上的运行时物理布局。
最大陷阱=组件图:题干出现"软件组件"四字诱选组件图,但组件图只描述软件内部构件间的组织与依赖,完全不含硬件;题干真正问的是"组件和硬件之间"。
排除:类图=类的静态结构、通信图=对象间消息交互(动态),均与硬件无关。
口诀"组件管软件,部署连硬件;见硬件/物理/节点/运行环境一律选部署图"
软件工程配置管理活动范围05/23
以下不属于配置管理的是()
风险管理(属于项目管理,非配置管理)。
配置管理(SCM)五项核心活动:配置项识别、版本控制、变更管理(变更控制)、配置状态报告、配置审计
版本控制/变更管理/配置状态报告都属于配置管理。
辨析陷阱:变更管理属配置管理,风险管理属项目管理,两者都叫"管理"但归属不同别混。
口诀"配置管理五件事:识别、版本、变更、状态、审计;带风险/进度/成本/质量的是项目管理"

软考考法:①给类图问是哪个模式 ②问属于哪一类(创建/结构/行为 + 类/对象) ③问意图/适用场景 ④给场景选模式 ⑤填类图角色。下面按"先定大类→再定类/对象→识别卡→易混辨析"组织。

一、三大类速查(必背:常考"属于哪类")
  • 创建型(5个)——关注"怎么创建对象":工厂方法、抽象工厂、建造者(生成器)、原型、单例。口诀"单原抽工建"
  • 结构型(7个)——关注"怎么把类/对象组合成更大结构":适配器、桥接、组合、装饰、外观、享元、代理。口诀"适桥组装外享代"
  • 行为型(11个)——关注"对象间职责分配/算法/通信":职责链、命令、解释器、迭代器、中介者、备忘录、观察者、状态、策略、模板方法、访问者。口诀"职命解迭中,备观状策模访"
二、类模式 vs 对象模式(第二维度,也常考)
  • 类模式=靠继承编译期静态确定;仅4个:工厂方法、(类)适配器、解释器、模板方法
  • 对象模式=靠对象组合/委托运行期可变;其余19个全是对象模式
  • 答题套路:答"X型对象模式/X型类模式"两个词都要给。除上面4个(可能是类模式),其余一律"对象模式"。适配器两栖(类适配器/对象适配器都有)。
三、考场识别卡(看类图/关键词→秒选模式 + 意图)

创建型

  • 单例 Singleton:私有构造+静态getInstance+静态唯一实例 → 意图"一个类仅一个实例并提供全局访问点"。
  • 工厂方法 Factory Method[类]:抽象Creator定义factoryMethod()由子类决定实例化哪个产品 → "定义创建对象接口,让子类决定实例化哪个类"。
  • 抽象工厂 Abstract Factory:一个工厂接口含多个创建方法、产出产品族 → "创建一系列相关或相互依赖对象,无需指定具体类"。
  • 建造者 Builder:Director + Builder + ConcreteBuilder + Product,Director分步调BuildPart()、ConcreteBuilder用GetResult()返回 → "将复杂对象的构建与表示分离,同一构建过程可创建不同表示"。
  • 原型 Prototype:含clone()/拷贝自身 → "用原型实例指定创建种类,通过拷贝创建新对象"。

结构型

  • 适配器 Adapter[类/对象]:Adapter包装Adaptee、转换接口 → "将一个类的接口转换成客户期望的另一接口,解决接口不兼容"。
  • 桥接 Bridge:两套独立继承体系用一条关联线搭桥(抽象持有实现引用) → "将抽象部分与实现部分分离,使它们都能独立变化"。
  • 组合 Composite:Component+Leaf+Composite构成树形、统一处理 → "将对象组合成树形(部分-整体),使单个与组合对象使用一致"。
  • 装饰 Decorator:Decorator与被装饰对象同接口、持有其引用、可层层包裹加功能 → "动态给对象增加职责,比子类更灵活"。
  • 外观 Facade:一个Facade对外、屏蔽一堆子系统 → "为子系统一组接口提供统一高层入口,简化使用"。
  • 享元 Flyweight:享元工厂+共享池+内部/外部状态分离 → "共享技术支持大量细粒度对象"。
  • 代理 Proxy:Proxy与RealSubject同接口、持有其引用、控制访问(不加功能) → "为对象提供代理以控制访问"。

行为型

  • 职责链 Chain of Responsibility:类持有自身类型next引用、请求沿链依次传 → "让多个对象都有机会处理请求,解耦收发双方;沿链传递直到有人处理"。
  • 命令 Command:把请求封装成Command对象、含execute() → "将请求封装为对象,支持参数化/排队/撤销"。
  • 解释器 Interpreter[类]:文法的AbstractExpression+Terminal/NonterminalExpression → "给定语言,定义文法表示并定义解释器解释句子"。
  • 迭代器 Iterator:Aggregate+Iterator含next()/hasNext() → "顺序访问聚合元素,不暴露内部表示"。
  • 中介者 Mediator:一个Mediator协调一堆Colleague、把网状多对多变星型 → "用中介对象封装一系列对象交互,降低耦合"。
  • 备忘录 Memento:Originator+Memento+Caretaker、保存/恢复状态 → "不破坏封装地捕获并外部保存对象状态,可恢复(撤销)"。
  • 观察者 Observer:Subject持有Observer列表、变化时notify()广播通知所有 → "对象间一对多依赖,目标变化时所有观察者自动更新(发布-订阅)"。
  • 状态 State:Context持有State引用、状态间会自动转换、行为随状态变 → "对象内部状态改变时改变行为,看似改变了类"。
  • 策略 Strategy:Context持有Strategy引用、客户主动选算法、算法间无转换 → "定义算法族并封装使可互换,算法独立于客户"。
  • 模板方法 Template Method[类]:抽象类定义templateMethod()算法骨架、子类实现某些步骤 → "定义算法骨架,将某些步骤延迟到子类"。
  • 访问者 Visitor:Element.accept(Visitor)+Visitor.visit(Element) → "不改变元素类的前提下,定义作用于这些元素的新操作"。
四、易混辨析(失分重灾区)
  • 桥接(结构) vs 策略(行为):类图都"持有一个接口引用"很像;桥接看是否有两套独立变化维度(本题应用×主题两套继承体系→桥接),策略只有一族算法。
  • 建造者 vs 抽象工厂:建造者有Director分步构建一个复杂对象、最后GetResult();抽象工厂创建产品族、无指挥者、即时返回。
  • 装饰 vs 代理:接口都不变;装饰=加功能(可叠加),代理=控制访问(不加功能)
  • 状态 vs 策略:类图几乎一样;状态会在状态间自动转换、行为由内部状态驱动,策略由客户主动选且算法互不转换。
  • 职责链 vs 观察者:职责链沿链依次传、通常一个对象处理;观察者广播、所有观察者都收到
  • 适配器 vs 桥接:适配器是事后补救已有不兼容接口;桥接是设计时主动分离两个维度。
  • 适配器是23种里唯一"两栖"模式:同时有类适配器(多重继承,类结构型)对象适配器(组合,对象结构型)两种形式→题目说"既是类结构型又是对象结构型"必选适配器。其余结构型模式都只有对象形式。
  • 三个"包一层转发请求"的结构型模式辨析(都持有另一对象引用+转发,靠意图区分):适配器=转发+换接口(让不兼容类协作);代理=转发+同接口+控制访问(不加功能);装饰器=转发+同接口+增强功能(可叠加)。代理与适配器"都提供间接性、向另一对象转发请求",区别在适配器换接口/代理同接口。
  • 外观 vs 中介者:外观对外简化子系统入口(单向);中介者协调同事对象间双向交互
  • 访问者 vs 策略:都可能有"多个子类像多种算法";访问者有 accept(visitor) 双分派 + 作用于一个对象结构,策略无accept、不针对结构、由客户直接选算法。
四点五、行为型模式"适用场景"一句话对照(选项常直接给场景描述,背熟可秒选)
  • 必须保存一个对象某时刻的(部分)状态(以便恢复/撤销) → 备忘录 Memento
  • 不明确指定接收者,向多个对象中的一个提交请求(沿链找人处理) → 职责链 Chain of Responsibility
  • 对一个对象结构中的对象进行很多不同且不相关的操作(操作与元素分离) → 访问者 Visitor
  • 在不同时刻指定、排列和执行请求(请求可排队/记录/撤销) → 命令 Command
  • 一个对象状态改变需通知并自动更新其他多个对象(一对多广播) → 观察者 Observer
  • 一个对象的行为依赖其状态、且运行时随状态改变(状态间自动转换) → 状态 State
  • 定义一族可互换算法、由客户选用(算法独立于客户、彼此无转换) → 策略 Strategy
  • 定义算法骨架、把某些步骤延迟到子类模板方法 Template Method
  • 用一个中介对象封装一组对象的交互(网状→星型降耦合) → 中介者 Mediator
  • 顺序访问聚合元素而不暴露其内部表示迭代器 Iterator
五、已考真题记录
  • 05/21 | Web应用框架(应用Blog/Store/News × 主题Light/Dark两维度,WebApplication持有Theme引用) | 是哪个模式/属于哪类 | 桥接模式;结构型对象模式。标志=两套独立继承体系用关联搭桥;意图"分离抽象与实现使其独立变化",防类爆炸(否则3×2=6类)。强混淆点:与策略(行为型)结构像,看有无两个独立维度;客户主接口=持有实现引用的抽象类(WebApplication)。
  • 05/21 | Director+Builder+ConcreteBuilder(GetResult/BuildPart)+Product,Construct()分步调BuildPart() | 是哪个模式/适用 | 建造者(生成器)模式;创建型对象模式。意图"将复杂对象的构建与表示分离,同一构建过程创建不同表示";适用"创建复杂对象的算法应独立于其组成部件及装配方式"或"构造过程须允许被构造对象有不同表示"。与抽象工厂区别:有Director分步构建一个复杂对象
  • 05/21 | Logger含#nextLogger:Logger、log()沿链传,ConsoleLogger/FileLogger/ErrorLogger | 是哪个模式/属于哪类/适用 | 职责链模式;行为型对象模式。标志=类持有自身类型next引用+请求沿链依次传;意图"让多个对象都有机会处理请求、解耦请求发送者与接收者";适用"有多个对象可处理同一请求、具体由谁处理在运行时自动确定"。与观察者区别:职责链依次传一个处理,观察者广播全收到
  • 05/21 | 超市销售系统(Item:Towel/Cookie/Yogurt;Checkout:Manual/Auto人工/自动结账;Item定义以Checkout为参数的accept操作由子类实现) | 是哪个模式/角色/属于哪类/适用 | 访问者模式;行为型对象模式。标志=Element.accept(Visitor)双分派;Item=抽象元素(定义accept)、Checkout=访问者、Manual/Auto=具体访问者、Shopping_Cart=对象结构。意图"不改变元素类的前提下定义作用于这些元素的新操作"(加新结账方式只加Checkout子类、不动Item)。适用=对一个对象结构中的对象进行很多不同且不相关的操作本题四选项=四个行为型模式适用场景(见上"四点五"对照):A保存对象状态→备忘录、B不明确接收者向多对象之一提交请求→职责链、C对象结构多种不相关操作→访问者(本题)、D不同时刻指定排列执行请求→命令。与策略区别:有accept双分派+针对对象结构=访问者,非策略
  • 05/21 | "既是类结构型又是对象结构型"的模式+与之类似(提供间接性/转发请求)的模式 | 两空选择 | ①适配器Adapter ②代理Proxy
    适配器是23种里唯一两栖:类适配器(多重继承=类结构型)+对象适配器(组合=对象结构型),题目见"既是类又是对象结构型"直接选它;排除桥接/组合/装饰器(均仅对象结构型,装饰器是常见错选)。
    ②题干"都提供一定间接性、都从自身以外接口向对象转发请求"是GoF描述代理的原话→第二空代理。适配器vs代理:适配器换接口(让不兼容类协作)、代理同接口(控制访问不加功能);再加装饰器(同接口+增强功能)构成三个"包一层转发"结构型模式,靠意图区分(详见上"易混辨析")。