5 分钟了解下【圈复杂度】是如何计算的?

简介: 5 分钟了解下【圈复杂度】是如何计算的?

image.png

圈复杂度用来衡量代码结构的复杂程度;


公式法



如图是一张简单的程序流程控制图:

image.png


程序由红色的节点开始运行,然后进入循环(红色节点下由三个节点组成),离开循环后有条件分支,最后运行蓝色节点后结束;


由此流程控制图,我们便可以开始计算该程序的 圈复杂度

计算公式:M = E − N + 2*P

E 为图中边的个数,N 为图中节点的个数,P 为图中连通分量的个数。

此图中,E = 9, N = 8, P = 1,因该程序圈复杂度为 9 - 8 + (2*1) = 3 ;

边的个数和节点的个数很好理解,但:


什么是 连通分量

  • 原来,在无向图中,如果任意两个顶点之间都能够连通,则称此无向图为连通图;

image.png


虽然 V1 和 V3 没有直接关联,但从 V1 到 V3 存在两条路径,分别是 V1-V2-V3 和 V1-V4-V3,因此称 V1 和 V3 之间是连通的。

  • 若无向图不是连通图,但图中存储某个子图符合连通图的性质,则称该子图为 连通分量;如图示:

image.png


  • 而在有向图中,若任意两个顶点 Vi 和 Vj,满足从 Vi 到 Vj 以及从 Vj 到 Vi 都连通,也就是都含有至少一条通路,则称此有向图为 强连通图
  • 若有向图本身不是强连通图,但其包含的最大连通子图具有强连通图的性质,则称该子图为 强连通分量

image.png


注意:圈复杂度计算中,计算变量是连通分量,而不是强连通分量!


判定法



上面通过公式来计算圈复杂度,似乎有点太过麻烦,计算边、节点、连通分量,都要费不少劲!


有没有更加粗暴简单的方法呢?答案就是:判定法!

当程序遇到这些判定条件时,圈复杂度在原有基础上加 1 即可;


  • if 语句
  • while 语句
  • for 语句
  • case 语句
  • catch 语句
  • and 和 or 布尔操作
  • ? : 三元运算符


接着以上节程序控制图为例,正常顺序的圈复杂度为 1,遇到 for 循环 +1,然后遇到 if 语句,再 +1 ,最后结果为 3;


怎样,是不是够粗暴简单?判定法用于简单程序的圈复杂度计算还是很有效果的;

需要注意的是:对于多分支的 case 结构或多个 if - else 结构,必须统计全部实际的判定条件数;


圈复杂度是评判代码优劣的标准之一,通常来说,圈复杂度不要大于 5 ,否则代码将会被判定为 不易读!


降低圈复杂度大致有如下方法:

  • 简化、合并条件表达式
  • 将条件判定提炼出独立函数
  • 将大函数拆成小函数
  • 以明确函数取代参数
  • 替换算法


从先计算后降低圈复杂度的角度来优化代码,使代码更加易读、易扩展、易维护,这就叫【专业】!


相关文章
|
25天前
|
Shell API 开发工具
Claude Code 快速上手指南(新手友好版)
AI编程工具卷疯啦!Claude Code凭借任务驱动+终端原生的特性,成了开发者的效率搭子。本文从安装、登录、切换国产模型到常用命令,手把手带新手快速上手,全程避坑,30分钟独立用起来。
3994 25
|
3月前
|
Kubernetes 监控 安全
别再说“多活一份数据就安全了”:云上灾备的真相,是你根本没想清楚 RTO / RPO
别再说“多活一份数据就安全了”:云上灾备的真相,是你根本没想清楚 RTO / RPO
324 9
|
3月前
|
存储 人工智能 网络安全
保姆级教程:OpenClaw 阿里云/本地部署及集成 Skills 步骤,立即让 AI 干活!
如果说OpenClaw与大模型的组合是给AI助理赋予了“智能大脑”,那么Skills就是为它装上了“灵活手脚”。作为OpenClaw的核心扩展能力,Skills是可安装、可卸载的功能模块,能够让基础版OpenClaw突破原生限制,解锁网页浏览、邮件管理、文件处理、多平台交互等复杂操作。截至2026年2月,Clawhub(OpenClaw官方技能市场)已收录超过5700个各类Skills,覆盖办公、开发、娱乐、生活等多场景,安装量最高的技能下载量突破2000次,成为提升OpenClaw实用性的关键。
2650 8
|
Cloud Native 安全 Java
代码圈复杂度治理小结
我们一直在说系统很复杂,那到底什么是系统复杂度呢?作为团队的稳定性底盘负责人,也经常和大家探讨为什么会因为圈复杂度高而被扣分。那么,怎么才能写的一手可读,可扩展,可维护的好代码?本文作者尝试结合在团队内部的实践,分享下过程中心得。
代码圈复杂度治理小结
|
7月前
|
机器学习/深度学习 人工智能 前端开发
终端里的 AI 编程助手:OpenCode 使用指南
OpenCode 是开源的终端 AI 编码助手,支持 Claude、GPT-4 等模型,可在命令行完成代码编写、Bug 修复、项目重构。提供原生终端界面和上下文感知能力,适合全栈开发者和终端用户使用。
54351 11
|
SQL 人工智能 数据可视化
16.1k star! 只需要DDL就能一键生成数据库关系图!开源神器ChartDB让你的数据结构"看得见"
ChartDB是一款开源的数据库可视化神器,通过一句智能查询就能自动生成专业的数据库关系图。无需安装客户端、不用暴露数据库密码,打开网页就能完成从数据建模到迁移的全流程操作,堪称开发者的"数据库透视镜"。
2818 67
|
10月前
|
存储 缓存 开发工具
Git stash命令的详细使用说明及案例分析。
通过上述案例,我们看到stash命令能够在不丢失进度的情况下,帮助开发者临时切换开发上下文,这在处理多个任务或紧急bug时特别有用。正确使用Git stash可以大大提高开发的灵活性和效率。
2601 0
|
SQL 容灾 关系型数据库
让X不断延伸, 从跨AZ到跨Region再到跨Cloud
本文从“空间”这一维度,聊一聊PolarDB-X在跨空间部署能力上的不断发展和延伸,以及在不同空间范围下的高可用和容灾能力,并着重介绍一下最新的产品能力——GDN(Global Database Network)。
9087 23