当前位置: 首页 > news >正文

数据结构——算法效率的度量(时间复杂度与空间复杂度)

算法的优劣主要体现在两个方面:运行所需的时间占用的存储空间。为了在理论上比较不同算法的效率,我们需要找到一种通用的度量方法。

(1)时间复杂度

1)基本概念
在分析算法时,我们常常统计基本操作(例如比较、赋值、加法)的执行次数。假设输入规模为 nnn,算法中基本操作的执行次数记为 T(n)T(n)T(n)。由于不同机器的运行速度不同,我们不关心具体的秒数,而是关心随着 nnn 增大,运行次数如何增长

于是,我们引入渐近时间复杂度

T(n)=O(f(n)) T(n) = O(f(n)) T(n)=O(f(n))

其中,f(n)f(n)f(n) 表示一个简单的函数(如 nnnn2n^2n2log⁡n\log nlogn),用来描述增长趋势,忽略常数因子和低阶项。

2)例子
考虑下面的简单查找:

i = n
while(i > 0 && A[i] != k) i = i - 1
  • 如果数组中没有值为 kkk 的元素,循环要执行 nnn 次,时间复杂度为 O(n)O(n)O(n)
  • 如果最后一个元素刚好等于 kkk,循环只执行 1 次,复杂度为 O(1)O(1)O(1)

这说明:同一个算法可能有最好情况最坏情况平均情况三种时间复杂度。为了保证算法在任何情况下都不会太差,我们通常取最坏情况复杂度作为衡量标准。

3)规律总结
常见的复杂度大小关系如下:

O(1)<O(log⁡n)<O(n)<O(nlog⁡n)<O(n2)<O(2n)<O(n!) O(1) < O(\log n) < O(n) < O(n\log n) < O(n^2) < O(2^n) < O(n!) O(1)<O(logn)<O(n)<O(nlogn)<O(n2)<O(2n)<O(n!)

在实际题目中,我们主要关心如何根据循环次数递归式来判断复杂度。例如:

  • 顺序执行:取最大项;
  • 嵌套循环:次数相乘;
  • 二分法:每次规模减半,复杂度为 O(log⁡n)O(\log n)O(logn)

(2)空间复杂度

1)基本概念
空间复杂度 S(n)S(n)S(n) 用来度量算法在运行过程中额外需要的存储量。除了存放输入数据所需的内存外,算法往往还需要一些辅助空间。

2)常见情况

  • 常量级空间:只用到少量变量,例如交换两个数。复杂度 O(1)O(1)O(1)
  • 与规模相关的辅助空间:如排序时需要一个额外数组,复杂度可能达到 O(n)O(n)O(n)
  • 递归调用的栈空间:递归深度为 ddd,则辅助空间为 O(d)O(d)O(d)。例如快速排序平均为 O(log⁡n)O(\log n)O(logn),最坏为 O(n)O(n)O(n)

(3)时间与空间的权衡

有些算法通过“增加空间”来换取“减少时间”(如哈希表查找只需 O(1)O(1)O(1)),有些算法则通过“减少空间”而增加时间(如原地排序节省内存,但操作更多)。这种时间—空间权衡思想是算法设计的重要原则。


小结

  • 时间复杂度反映了算法随输入规模增长所需的运算次数,是算法效率的主要指标。
  • 空间复杂度反映了算法需要的额外内存,是评价实现可行性的重要因素。
  • 考研题目中常要求推算循环与递归的时间复杂度,并比较不同算法在时间与空间上的优劣。
http://www.dtcms.com/a/353429.html

相关文章:

  • Elasticsearch 启动反复重启排查实录:从“内存不足”到“vm.max\_map\_count 过小”
  • 图表可视化地理趋势-Telerik WPF Chart
  • 智能汽车制造:海康NVR管理平台/工具EasyNVR多品牌NVR管理工具/设备实现无插件视频监控直播方案
  • R语言贝叶斯方法在生态环境领域中的技术应用
  • 攻克 Java 分布式难题:并发模型优化与分布式事务处理实战指南
  • APP与WEB测试的区别?
  • 人工智能在医疗领域中辅助外科手术的应用综述
  • 【VSCode】使用VSCode创建Java C/S架构项目
  • 如何用Renix实现网络测试自动化: 从配置分离到多厂商设备支持
  • 【网络编程】NtyCo协程服务器的框架(轻量级的协程方案,人称 “小线程”)
  • 从浏览器无法访问到Docker容器的 FastAPI 服务地址【宿主机浏览器和容器不在同一个网络层面:端口映射】
  • 前端AI应用实践指南:从基础概念到高级实现
  • 云手机的未来发展怎么样?
  • 数据结构(C语言篇):(二)顺序表
  • 状态设计模式
  • 手机冻结技术发展时间轴
  • Flutter项目详解
  • 深度学习实战117-各种大模型(Qwen,MathGPT,Deepseek等)解高考数学题的应用,介绍架构原理
  • C++工程实战入门笔记6-函数(三)关于base16编码的原理和函数模块化实战
  • LINUX --- 网络编程(二)
  • OpenAi在中国拿下“GPT”商标初审!
  • October 2019 Twice SQL Injection
  • Qt图片上传系统的设计与实现:从客户端到服务器的完整方案
  • 对比视频处理单元(VPU)、图形处理器(GPU)与中央处理器(CPU)
  • 多模态模型如何处理和理解图片
  • PPT处理控件Aspose.Slides教程:在.NET中开发SVG到EMF的转换器
  • STM32学习日记
  • 替身演员的艺术:pytest-mock 从入门到飙戏
  • Java基础 8.27
  • 如何使用windows实现与iphone的隔空投送(AirDrop)