McCabe的圈复杂度

时间:2012-04-28 17:36:12

标签: c++ complexity-theory

为了计算代码的圈复杂度,我绘制了一个由节点和边组成的控制流程图,帮助我计算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)的结果,否则我的计算是错误的。谢谢你的帮助。

2 个答案:

答案 0 :(得分: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是常量,因此代码中只有两条独立的路径。图论模型不知道某些路径是不可能的。通过图表的可能的路径的数量有时小于圈复杂度。

答案 1 :(得分: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 */
   }
}

希望你同意!