IF((A> B)和(C> D))和IF((A> B)OR(C> D))的环的复杂性

时间:2012-09-26 10:43:49

标签: cyclomatic-complexity

我想知道两段代码的圈复杂度,

IF((A>B) AND (C>D)) 
{ a=a+b;c=c+d;}

据我所知,上述代码的圈复杂度= 2 + 1 = 3,

另一个代码

IF((A>B) OR (C>D))
{a=a+b;c=c+d;}

上述代码的复杂性为= 4 + 1 = 5,

上述复杂性是否正确?

2 个答案:

答案 0 :(得分:10)

两种复杂性相同且相等3,以4种方式计算。我同意Neil使用De Morgan证明它们是相同的,我认为同样可以从图中看出它对复杂性计算很重要。

图表

让我们从两个代码片段的图表开始。

if + or

if + and

解释词:

  1. McCabe图由基本块组成,这意味着只要控制在它们之间线性传递,我就可以将许多语句合并为一个。
  2. 我将您的代码视为简单程序,一个入口点,一个退出点。
  3. 将退出点添加为接收器,并将其全部结束。注意到这里我没有几个例子可以从McCabe计算的代码构建图表,但我没有记得那样做,但我认为这是自然的,因为什么是基本块和什么节点/边缘的意思。
  4. 退出和入口点之间的边缘仅与简化复杂度计算相关,因此笔记和不同的标记(颜色,箭头)。
  5. 基本块由可以非线性地传递控制的指令分隔:while,for,if,etc。
  6. 引用McCabe本人,AND和OR为复杂性添加+1,因为它们基本上是if and ifif or if,所以两个ifs。因此我的第二个节点是一个单独的节点。
  7. 正如您所看到的,在两个代码段之间,数字没有区别。节点,边缘,区域都是相同的。不同之处在于哪个节点与哪个节点连接,这来自于短路的工作原理。显然,对于没有它的语言,图形需要不同。

    复杂性定义

    不止一个。复杂性等于

    边缘 - 节点+ 2 *(退出)

    边缘= 5;节点= 4;退出= 1;

    两种情况下复杂度= 5-4 + 2 *(1)= 3。这个定义不需要强连接图,所以我们放弃了增加的边缘。

    边缘 - 节点+出口提供强连接图

    边缘= 6;节点= 4;退出= 1;

    两种情况下复杂度= 6-4 + 1 = 3。这个定义是因为它在拓扑上更有意义,并且在循环计数(图形方面)方面更容易思考。当您考虑计算许多例程/函数的复杂性(如类中的所有方法)时,它会更有用。认为可以在循环中调用函数是有意义的。但我离题了。

    地区

    地区:3。

    这来自欧拉公式 区域+节点 - 边缘= 2 重写这个: Regions = Edges - Nodes + 2

    因此,区域数量与复杂度相同(假设一个出口点)。这意味着在一次退出子程序中简化计算复杂性。

    决策点+ 1

    麦凯布自己也注意到了

      

    在实践中,复合谓词如IF“c1 AND c2”THEN被视为有贡献   由于没有连接符,因此我们将得到IF c1,如果没有连接,那么两个复杂性   它有两个谓词。出于这个原因并且为了测试目的,已经发现了它   在计算复杂度时更方便计算条件而不是谓词

    在两个代码段中,我们有一个复合条件,因此Decisions = 2;

    复杂度= 2 + 1 = 3.

    值得注意的是,圈复杂度始于计数周期,但最终是为了实际目的而计算条件。

    进一步阅读

    首先尝试McCabe的论文本身:http://www.literateprogramming.com/mccabe.pdf

    维基百科有一篇很好的文章依赖于论文,但我发现它没有遵循BASIC BLOCKS和CONNECTED COMPONENTS:

    1. http://en.wikipedia.org/wiki/Cyclomatic_complexity
    2. http://en.wikipedia.org/wiki/Basic_block
    3. http://en.wikipedia.org/wiki/Connected_component_(graph_theory)
    4. 我在钱伯斯的网页上找到了简明扼要的摘要:http://www.chambers.com.au/glossary/mc_cabe_cyclomatic_complexity.php

      第8章中的“软件工程集成方法”一书中有一个说明复杂度计算的例子(尽管我认为它们在图表上吃了一个边缘,见图8.7)。

      http://books.google.pl/books?id=M-mhFtxaaskC&lpg=PA385&ots=jB8P0avJU7&d&hl=pl&pg=PR1#v=onepage

答案 1 :(得分:3)

我认为它们具有相同的圈复杂度3;这可以用德摩根定律来证明。

IF((A>B) OR (C>D)) {a=a+b;c=c+d;} ELSE {}

IF(!((A>B) OR (C>D))) {} ELSE {a=a+b;c=c+d;}

IF(!(A>B) AND !(C>D)) {} ELSE {a=a+b;c=c+d;}

另一种观察方式是采用图形并交换条件块和出口点(并反转它们之间的边缘),这将它从AND转换为OR而不改变节点或边的数量。