软考计算题 · McCabe复杂度 · 边点法

环路复杂度边点法怎么算?

边点法是环路复杂度里最像计算题的一种:题目给你控制流图,或者直接给边数 E、节点数 N,让你代入 V(G)=E-N+2。它不难,但特别容易在数图时手滑,所以这类题最重要的不是背公式,而是先把“边”和“节点”数稳。

计算题专题 软考题库编辑部 持续更新

边点法先记一句人话:边减点再加2

V(G)=E-N+2 里面,E 是控制流图的边数,N 是控制流图的节点数。考试里如果已经明确给出 E 和 N,基本就是代数题;如果给的是图,就先不要急着算,先把每条箭头和每个节点标出来。

老师一般会提醒:边不是代码行,节点也不是自然段。控制流图是把程序控制结构抽象出来,顺序语句可能被合并成一个节点,分支和循环会形成更多边。你如果按代码行硬数,很容易多算节点。

公式V(G)=E-N+2
E控制流图中的边数,可以理解为箭头数量
N控制流图中的节点数,可以理解为控制流经过的处理点或判断点

题目给数字时,按三步走

第一步,把题干里的边数和节点数分别圈出来;第二步,按 E-N+2 写出代入过程;第三步,看结果是否合理。一般环路复杂度不会是负数,也不会离判断结构数量差得特别离谱。

比如题目说某控制流图有 12 条边、9 个节点,那么 V(G)=12-9+2=5。这里最常见的错法是写成 9-12+2,或者算完 12-9 就停了,忘记最后的 +2。

小例子

已知 E=12,N=9。

V(G)=E-N+2=12-9+2=5。

这表示基本路径测试至少要关注 5 条独立路径。

为什么有时候要和判定法互相校验

如果题目既给了图,又能明显数出判定节点,就可以用判定节点数+1 做一个快速校验。两种方法算出来一般应当一致。如果不一致,大概率不是公式错了,而是边、节点或判定节点数数错了。

考场上不一定有时间把图画得特别漂亮,但至少要养成一个习惯:每数一条边就做个小标记,每数一个节点也做个标记。边点法的失分,很多不是不会,是漏数。

常见失分点

第一,把 E 和 N 写反。公式是 E-N+2,不是 N-E+2。第二,忘记 +2。第三,把普通顺序语句拆成太多节点,导致 N 偏大。第四,漏掉循环回边,导致 E 偏小。

做这类题时,最后最好把答案翻译成一句话:这个程序至少需要多少条独立路径测试。能翻译出来,说明你不是只在机械套公式。

相关题目解析

下面这些题目和本专题的判断方法关联较强,适合读完概念后回到具体题干里校验理解。