2012-04-28 104 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也應包含被調用函數的邊和節點。我認爲相反,這個例子可以寫成:

希望你同意!