软件复杂性表现,如何计算?

简介: 软件复杂性度量的参数很多,主要有:• 规模,即总共的指令数,或源程序行数。• 难度,通常由程序中出现的操作数的数目所决定的量来表示。• 结构,通常用于程序结构有关的度量来表示。• 智能度,即算法的难易程度。

软件复杂性

软件复杂性的基本概念

软件复杂性度量的参数很多,主要有:

  • 规模,即总共的指令数,或源程序行数。
  • 难度,通常由程序中出现的操作数的数目所决定的量来表示。
  • 结构,通常用于程序结构有关的度量来表示。
  • 智能度,即算法的难易程度。

软件复杂性主要表现在程序的复杂性。程序的复杂性主要指模块内程序的复杂性。它直接关联到软件开发费用的多少、开发周期长短和软件内部潜伏错误的多少。同时它也是软件可理解性的另一种度量。

软件复杂性的度量方法

代码行度量法

度量程序的复杂性,最简单的方法就是统计程序的源代码行数。此方法的基本考虑是统计一个程序的源代码行数,并以代码行数作为程序复杂性的质量。

McCabe度量法

McCabe度量法是由Thomas McCabe提出的一种基于程序控制流的复杂性度量方法。McCabe复杂性度量又称环路度量它认为程序的复杂性很大程度上取决于程序的复杂性。单一的顺序结构最为简单,循环和选择所构成的环路越多,程序就越复杂

这种方法以图论为工具,先画出程序图,然后用该图的环路数作为程序复杂性的度量值。程序图是退化的程序流程图。也就是说,把程序流程图的每一个处理符号都退化成一个结点,原来连接不同处理符号的流线变成连接不同结点的有向弧,这样得到的有向图就叫做程序图

McCabe度量法使用例题

程序图仅描述程序内部的控制流程,完全不表现对数据的具体操作分支和循环的具体条件。

例子

强连通的有向图G中,环的个数V(G)由以下公式给出:

                                                             V(G)=mn+2p

其中(1)公式含义:

  • V(G)是有向图G中环路数
  • m是图G中弧数
  • n是图G中结点数
  • p是图G中强连通分量个数

强连通图的p=1;也就是说2P=2;

在程序图G中,从程序图G的入口点总能到达图中任何一个结点,因此,程序总是连通的,但不是强连通的。为了使图成为强连通图,从图的入口点到出口点加一条用虚线【不计入计算的边数】表示的有向边,使图成为强连通图。

                                                               V(G)=1311+2=4

可算出McCabe环复杂度度量值为4。这里选择的4个线形无关环路,其他任何环路都是这4个环路的线形组合。

利用McCabe环复杂度度量值时,有几点说明。
  • 环路复杂度取决于程序控制结构的复杂度。当程序的分支数目或循环数目时其复杂度也增加。环路复杂度与程序中覆盖的路径条数有关。
  • 环路复杂度是可增加的。例如,模块A的复杂度为3,模块B的复杂度为4,则模块A与模块B的复杂度是7。
  • McCabe建议,对于复杂度超过10的程序,应分成几个小程序,以减少程序中的错误。
  • 这种度量的缺点是:
  1. 对于不同种类的控制流的复杂度不能区分
  2. 简单IF语句与循环语句的复杂性同等看待。
  3. 嵌套IF语句与简单CASE的复杂性是一样的。
  4. 模块间接口当成一个简单分支一样处理。
  5. 一个具有1000行的顺序程序与一行语句的复杂性相同。
目录
相关文章
|
2月前
|
机器学习/深度学习 计算机视觉 网络架构
【GhostNet】复现CVPR2020| 保证模型轻量化的同时,提升网络的性能表现
【GhostNet】复现CVPR2020| 保证模型轻量化的同时,提升网络的性能表现
569 0
【GhostNet】复现CVPR2020| 保证模型轻量化的同时,提升网络的性能表现
|
4天前
|
缓存 Unix API
C标准库函数与Unbuffered I/O函数:平台间的差异与适用性
C标准库函数与Unbuffered I/O函数:平台间的差异与适用性
8 0
|
2月前
|
移动开发 测试技术 Android开发
构建高效Android应用:从优化用户体验到提升性能表现
【5月更文挑战第15天】 在移动开发领域,一个成功的Android应用不仅需要具备吸引用户的功能,更应提供流畅和高效的用户体验。随着技术的不断进步,开发者面临着将先进技术集成到现有架构中以提高应用性能的挑战。本文将深入探讨如何通过最新的Android框架和工具来优化应用性能,包括对UI的响应性、内存管理以及多线程处理等关键方面的改进,旨在帮助开发者构建出更加强大、快速且稳定的Android应用。
|
10月前
|
编解码 监控 算法
文档管理软件中的精度优化:蝶行算法的崭露头角
蝶行算法是一种基于蝴蝶飞行的优化算法,其主要思想是模拟蝴蝶在寻找食物时的飞行路径,通过不断调整飞行方向和速度,最终找到最优解。
218 1
|
12月前
|
机器学习/深度学习 存储 监控
转:排列组合算法在监控软件中的优势、复杂性与应用场景
排列组合算法在监控软件中可能用于处理一些组合与排列问题,例如处理多个元素的组合方式或排列顺序。它在一些特定场景下具有一定的优势和适用性,但也要注意其复杂性。
77 0
|
机器学习/深度学习 算法 Windows
算法的复杂性分析
算法的复杂性分析
261 0
算法的复杂性分析
|
存储 缓存 分布式计算
深入分析软件复杂度
深入分析软件复杂度
深入分析软件复杂度
|
存储 传感器 机器学习/深度学习
V2X会是未来趋势吗?看看这种轻量级方法,大幅降低碰撞概率!
本文提出了一种Ledger概念,它通过Ledger信息的广播,在一个资源预留区间(RRI)内向网络中的每辆车传递碰撞信息。碰撞车辆知道它已经与其他车辆相撞,并将在下一个 SPS 期间重新选择。除此之外,其他协议都遵循 SPS。通过引入 Ledger,虽然牺牲了14.29% 的资源,但最终可以降低碰撞概率。本文使用蒙特卡罗模拟器对Ledger系统的性能进行了验证和分析。数值结果表明,遵循 SPS 协议,Ledger 系统可以使碰撞概率在一定数量 RRI 后收敛到零。
V2X会是未来趋势吗?看看这种轻量级方法,大幅降低碰撞概率!
|
自然语言处理 搜索推荐 数据可视化
备忘录软件综合评测:优点、缺点、评价及替代品
如何选择笔记软件? 选择笔记软件需要根据用户自己的需求。然而,现实情况是,用户的需求是复杂多变的。与此同时,也不存在满足用户几乎所有需求的完美笔记软件。因此,没有必要非此即彼。如果你需求比较简单,那么选择一款笔记软件。如果你拥有复杂的使用需求,那么比较好的解决思路不是在一款工具内过度追求 All in One, 试图挖掘和熟悉一个笔记产品的所有功能,以及在某个笔记产品内部实现所有功能。
344 0
备忘录软件综合评测:优点、缺点、评价及替代品
|
机器学习/深度学习 自然语言处理 固态存储
小红书推荐多样性解决方案:SSD在质量、多样性之间获得较好权衡
来自小红书的研究者在多样化推荐中,从用户体验和系统应用的视角出发,提出了一种滑动频谱分解(SSD)的方法,该方法可以捕捉用户在浏览长项目序列时对多样性的感知。通过理论分析、离线实验和在线 A/B 测试,验证了该方法的有效性。
458 0
小红书推荐多样性解决方案:SSD在质量、多样性之间获得较好权衡