2012-04-28 73 views
2

为了计算代码的圈复杂度,我绘制了一个由节点和边组成的控制流程图,它帮助我计算V(G)= E - N + 2在我的情况下,E = 15和N = 11造成6McCabe的圈复杂度

一个cyclomativ复杂性我们确认我的回答,我想在寻找的代码打击线性无关的路径一些帮助:

int maxValue = m[0][0];   
for (int i = 0; i < N; i++)   
{      
    for (int j = 0; j < N; j++)   
    {       
     if (m[i][j] > maxValue)   
     {      
     maxValue = m[i][j];    
     }      
    }       
}     
cout << maxValue << endl;   
int sum = 0;      
for (int i = 0; i < N; i++)   
{      
    for (int j = 0; j < N; j++)   
    {       
     sum = sum + m[i][j];   
    }       
}       
cout << sum << endl; 

这应该相等,则结果为我V (G),否则我的计算是错误的。感谢您的帮助。

回答

2

McCabe的圈复杂度给出了一个上界。考虑以下内容:

void func (const bool do_special) { 
    if (do_special) { 
     do_something_special_at_the_start(); 
    } 

    always_do_this_stuff_in_the_middle(); 

    if (do_special) { 
     do_something_special_at_the_end(); 
} 

从图论的角度来看,它的圈复杂度为3。但是,由于do_special是恒定的,因此只有两条独立的代码路径。图论模型并不知道有些路径是不可能的。 可能的数目通过图的路径有时小于圈复杂度。

+0

您的圈复杂度为6是正确的。如何计算节点和边缘的变化(我计数16个节点,20个边),但是如果计数一致,则圈复杂度总是6。 – 2012-04-28 19:16:21

0

Hammen, 一个很好的例子表明这个度量给出了上限。但不知何故,您可能错过了关于这个例子的复杂性的一点,同时给它三个。既然你已经显示了do_something _...(),它们是函数调用。因此,在这种情况下,P = 3,因此圆环复杂度将由V(G)= E - N - 2 * P给出,E和N也应包含被调用函数的边和节点。我认为相反,这个例子可以写成:

希望你同意!