我想知道两段代码的圈复杂度,
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,
上述复杂性是否正确?
答案 0 :(得分:10)
两种复杂性相同且相等3,以4种方式计算。我同意Neil使用De Morgan证明它们是相同的,我认为同样可以从图中看出它对复杂性计算很重要。
让我们从两个代码片段的图表开始。
解释词:
if and if
和if or if
,所以两个ifs。因此我的第二个节点是一个单独的节点。 正如您所看到的,在两个代码段之间,数字没有区别。节点,边缘,区域都是相同的。不同之处在于哪个节点与哪个节点连接,这来自于短路的工作原理。显然,对于没有它的语言,图形需要不同。
不止一个。复杂性等于
边缘= 5;节点= 4;退出= 1;
两种情况下复杂度= 5-4 + 2 *(1)= 3。这个定义不需要强连接图,所以我们放弃了增加的边缘。
边缘= 6;节点= 4;退出= 1;
两种情况下复杂度= 6-4 + 1 = 3。这个定义是因为它在拓扑上更有意义,并且在循环计数(图形方面)方面更容易思考。当您考虑计算许多例程/函数的复杂性(如类中的所有方法)时,它会更有用。认为可以在循环中调用函数是有意义的。但我离题了。
地区:3。
这来自欧拉公式 区域+节点 - 边缘= 2 重写这个: Regions = Edges - Nodes + 2
因此,区域数量与复杂度相同(假设一个出口点)。这意味着在一次退出子程序中简化计算复杂性。
在实践中,复合谓词如IF“c1 AND c2”THEN被视为有贡献 由于没有连接符,因此我们将得到IF c1,如果没有连接,那么两个复杂性 它有两个谓词。出于这个原因并且为了测试目的,已经发现了它 在计算复杂度时更方便计算条件而不是谓词
在两个代码段中,我们有一个复合条件,因此Decisions = 2;
复杂度= 2 + 1 = 3.
值得注意的是,圈复杂度始于计数周期,但最终是为了实际目的而计算条件。
首先尝试McCabe的论文本身:http://www.literateprogramming.com/mccabe.pdf
维基百科有一篇很好的文章依赖于论文,但我发现它没有遵循BASIC BLOCKS和CONNECTED COMPONENTS:
我在钱伯斯的网页上找到了简明扼要的摘要: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而不改变节点或边的数量。