McCabe环路复杂度计算方法

软考的McCabe这种题型来说几乎每次都考,那么我来讲讲如何计算以及题型的分类:


形复杂度定量度量程序的逻辑复杂度:描绘程序控制流的流图之后,

可以用下述3种方法中的任何一种来计算环形复杂度。


(1)流图中的区域数等于环形复杂度。
(2)流图G的环形复杂度V(G)=E-N+2,其中,E是流图中边的条数,N是结点数。
(3)流图G的环形复杂度V(G)=P+1,其中,P是流图中判定结点的数目。


自己是这样理解的:

       这种环路度量法,计算的思路是这样的:它是考虑控制的复杂程度,即条件选择的分支繁杂程度


例一

如图:



根据公式:


V(G)=E-N+2


10 - 8 + 2 = 4

则得出答案选择 C.


例二:



根据公式:


V(G)=E-N+2

8 - 6 + 2 =  4 选 C


例三:


方法一:

 流图G的环形复杂度V(G)=E-N+2,其中,E是流图中边的条数,N是结点数。

 有了前面的分析,现在就好做了:

上图:8-7+2=3

下图:9-7+2=4(注意E不是10,因为G节点的自环弧线要忽略掉)


方法二:

流图G的环形复杂度V(G)=P+1,其中,P是流图中判定结点的数目。

      判断节点:

      上图:C,E,  2个点,复杂度2+1=3

      下图:C.E.D  3个点,复杂度3+1=4


### McCabe环路复杂度三种计算方法 #### 方法一:线性无关区域数量 此方法认为流图中每一个由若干线条组成的密闭空间是一个线性无关区域,外部环境也视为一个独立区域。因此,整个图形被分割成多个部分的数量即为该程序模块的环路复杂度[^3]。 例如,在给定的一个流程图中标记出所有的封闭区域能够帮助直观地理解和应用这种方法。假设存在五个不同的封闭区域,则环路复杂度为5。 #### 方法二:边减去节点加2 第二种方式依赖于公式 \( V(G) = E - N + 2 \),这里\(E\)表示有向弧(或称为边)的数量,而\(N\)则是指代节点总数。这种算法提供了一种较为直接的方式来进行复杂度评估[^1]。 对于同一个实例而言,如果有11条边和8个节点的话,按照上述公式可以得出其环路复杂度同样为5。 ```python def calculate_complexity(edges, nodes): return edges - nodes + 2 ``` #### 方法三:判定节点数加1 第三种方法关注的是判断语句的存在及其影响范围内的路径变化情况。具体来说,每当遇到具有多方向出口的选择结构时(比如if-else),这些位置就被视作“判定节点”。最终的结果可以通过统计这类特殊节点并加上常数值1获得[^4]。 继续以上述案例为例,当发现a拥有三个分支、f有两个分支以及c也有两个分支的情况下,依据这一原则所得到的结果依旧是5。 ```python def complexity_by_decision_points(decision_points): # Each decision point contributes to the cyclomatic number based on its branches. additional_paths = sum(max(0, branches - 1) for branches in decision_points.values()) return additional_paths + 1 ```
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值