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