两种复杂性相同且相等3,以4种方式计算.我同意Neil关于使用De Morgan证明它们是相同的,我认为同样可以从图中看出它对复杂性计算很重要.
图表
让我们从两个代码片段的图表开始.
解释的话:
> McCabe图由基本块组成,这意味着只要控制在它们之间线性传递,我就可以将许多语句合并为一个.
>我将您的代码视为简单的过程,一个入口点,一个出口点.
>退出点被添加为接收器,它将全部结束.注意到这里我没有几个例子可以从McCabe计算的代码构建图表,我没有回忆过这一点,但我认为这是自然的,因为什么是基本块和什么节点/边缘的意思.
>退出点和入口点之间的边缘仅与简化复杂度计算相关,因此笔记和不同标记(颜色,箭头)相关.
>基本块由可以非线性地传递控制的指令分隔:while,for,if等.
>引用McCabe本人,AND和OR为复杂性增加1,因为它们基本上是if和if if和if if so so twos.因此我的第二个节点是一个单独的节点.
如您所见,两个代码片段之间的数字没有区别.节点,边缘,区域都是相同的.不同之处在于哪个节点与哪个节点连接,这来自于短路的工作原理.显然,对于没有它的语言,图形需要不同.
复杂性定义
不止一个.复杂性等于
边缘 – 节点2 *(退出)
边缘= 5;节点= 4;退出= 1;
两种情况下复杂度= 5-4 2 *(1)= 3.此定义不需要强连接图,因此我们删除了添加的边.
边缘 – 节点出口提供强连接图
边缘= 6;节点= 4;退出= 1;
两种情况下复杂度= 6-4 1 = 3.这个定义是因为它在拓扑上更有意义,并且在循环计数(图形方面)方面更容易思考.当您考虑计算许多例程/函数的复杂性(如类中的所有方法)时,它会更有用.认为可以在循环中调用函数是有意义的.但我离题了.
地区
地区:3.
这来自欧拉公式
地区节点 – 边缘= 2
重写这个:
Regions =边缘 – 节点2
因此,区域的数量与复杂性相同(假设一个出口点).这意味着在一次退出子程序中简化图表的计算复杂性.
决定点1
麦凯布自己也注意到了这一点
in practice compound predicates such as IF “c1 AND c2” THEN are treated as contributing
two to complexity since without the connective AND we would have IF c1 THEN IF c2 THEN
which has two predicates. For this reason and for testing purposes it has been found
to be more convenient to count conditions instead of predicates when calculating complexity
在两个代码段中,我们有一个复合条件,因此Decisions = 2;
复杂度= 2 1 = 3.
值得注意的是,圈复杂度始于计数周期,但最终是为了实际目的而计算条件.
进一步阅读
维基百科有一篇很好的文章依赖于论文,但我发现它没有遵循BASIC BLOCKS和CONNECTED COMPONENTS:
第8章中的“软件工程集成方法”一书中有一个说明复杂度计算的例子(尽管我认为它们在图形上吃了一条边,图8.7).