边点法先记一句人话:边减点再加2
V(G)=E-N+2 里面,E 是控制流图的边数,N 是控制流图的节点数。考试里如果已经明确给出 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 偏小。
做这类题时,最后最好把答案翻译成一句话:这个程序至少需要多少条独立路径测试。能翻译出来,说明你不是只在机械套公式。
相关题目解析
下面这些题目和本专题的判断方法关联较强,适合读完概念后回到具体题干里校验理解。
- 已知边数和节点数时 McCabe 复杂度怎么算?McCabe / 环路复杂度
- 已知判定节点数时环路复杂度怎么算?环路复杂度 / McCabe