循环复杂度

简介: 循环复杂度

循环复杂度(Cyclomaticcomplexity)也称为条件复杂度,是一种软件度量,是由老托马斯·J·麦凯布(英语:ThomasJ.McCabe,Sr.)在1976年提出,用来表示程式的复杂度,其符号为VG或是M。

循环复杂度由程式的源代码中量测线性独立路径的个数。

此概念有些类似的量测文字复杂度的Flesch-Kincaid可读性测试

(英语:Flesch-KincaidReadabilityTest),不过方法不完全相同。

循环复杂度是由程式的控制流图(英语:controlflowgraph)来计算:

有向图的节点对应程式中个别的程式码,而若一个程式执行后会立刻执行另一程式码,会有边连结二程式码对应的节点。圈复杂度可应用在程式的子程序、模组、方法或类别。

麦凯布首先提出一种称为“基础路径测试”(BasisPathTesting)的软件测试方式,是测试程式中的每一线性独立路径,此情形的测试用例个数即为程式的循环复杂度。

"循环复杂度"的名称有时会让人误解,因为此复杂度不只计算程式中的循环个数。

循环复杂度是指程式的控制流图中,若将结束点到启始点再增加一个边时,控制流图中的圈(几个边形成封闭路径)的个数。

例如:

我们利用循环做一个累加器

package com.item.action;
public class Main {
  public static void main(String args[]) {
    int i = 1;// 1、初始值
    int sum=0;
    while(i<101) {//2、表达式
      sum+=i;//3、循环体
      i++;//4、迭代器
    }
    System.out.println(sum);
  }
}

这样会一直的累加到5050,一共执行了100次,一个循环,循环复杂度也就是1,但是我们通常用时间复杂度【O(n)】与空间复杂度【S(n)】来表示。

相关文章
|
1月前
|
算法
尾递归和迭代的区别是什么?
【10月更文挑战第24天】尾递归和迭代各有优缺点,在实际编程中需要根据具体情况选择合适的方法。在一些情况下,尾递归可以提供更简洁高效的实现方式;而在另一些情况下,迭代可能是更为可靠的选择。
|
存储 算法 数据处理
for 循环嵌套 for 循环,你需要懂的代码性能优化技巧!
本篇分析的技巧点其实是比较常见的,但是最近的几次的代码评审还是发现有不少兄弟没注意到。 所以还是想拿出来说下。
241 4
|
缓存 索引
这 11 个 for 循环优化你得会
这 11 个 for 循环优化你得会
|
缓存 算法 Java
使用迭代优化递归程序
大家好,我是王有志。 今天我们将会分析上篇文章中递归算法存在的问题,并通过迭代去优化。
118 1
使用迭代优化递归程序
|
Web App开发 测试技术
优化循环的方法-循环展开
优化循环的方法-循环展开
99 0
|
机器学习/深度学习 算法 C语言
[最全算法总结]我是如何将递归算法的复杂度优化到O(1)的
[最全算法总结]我是如何将递归算法的复杂度优化到O(1)的
223 0
[最全算法总结]我是如何将递归算法的复杂度优化到O(1)的
|
算法 C语言
关于冒泡排序复杂度O(n)
我在许多书本上看到冒泡排序的最佳时间复杂度是O(n),即是在序列本来就是正序的情况下。 但我一直不明白这是怎么算出来的,因此通过阅读《算法导论-第2版》的2.2节,使用对插入排序最佳时间复杂度推算的方法,来计算冒泡排序的复杂度。
1836 0
|
算法
分析复杂度来判断算法效率
算法复杂度用于分析算法运行所需计算机资源的量,需要的时间资源为时间复杂度,需要的空间资源为空间复杂度。 在判断一个算法的优劣时,可以抛开软件和硬件因素,只考虑问题的规模。编写程序前预先估计算法优劣,可以改进并选择更高效的算法。
160 0
分析复杂度来判断算法效率
|
Java Python
追根揭底-循环\迭代\分治详细使用
追根揭底-循环\迭代\分治详细使用
93 0
表达式树练习实践:C#循环与循环控制
表达式树练习实践:C#循环与循环控制
150 0