2

为了计算代码的圈复杂度,我绘制了一个由节点和边组成的控制流程图,它帮助我计算了 V (G) = E - N + 2 在我的例子中 E = 15 和 N = 11。产生一个圈6.复杂度

现在为了确认我的答案,我想在寻找代码爆炸的线性独立路径方面得到一些帮助:

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) 的结果,否则我的计算是错误的。感谢您的帮助。

4

2 回答 2

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();
}

从图论的角度来看,这具有三的圈复杂度。但是,由于do_special是常量,因此代码中只有两条独立的路径。图论模型不知道有些路径是不可能的。通过图的可能路径的数量有时小于圈复杂度。

于 2012-04-28T18:56:32.740 回答
0

Hammen,一个很好的例子,说明这个指标给出了上限。但是不知何故,你可能在给出这个例子的复杂性时忽略了一点。由于您已经展示了 do_something_...(),它们是函数调用。因此,在这种情况下 P = 3,因此循环复杂度将由 V(G) = E - N - 2*P 给出,E 和 N 也应该包括被调用函数的边和节点。我认为相反,这个例子可以写成:

void func (const bool do_special) {

   if (do_special) {
      /* do something at start */
   }
   :
   /* do something at middle */
   :
   if (do_speical) {
      /* do something at end */
   }
}

希望你同意!

于 2012-05-23T06:28:20.487 回答