空间复杂度和时间复杂度

news/2025/9/24 14:05:31/文章来源:https://www.cnblogs.com/kaoyujiang/p/19109156

要理解和计算时间复杂度与空间复杂度,关键是分析算法中重复执行的操作次数(时间)和额外开辟的存储空间(空间)如何随输入规模n变化。下面通过具体代码示例详细说明计算方法。

一、时间复杂度计算

时间复杂度关注核心操作的执行次数与n的关系,忽略常数项和低阶项,只保留最高阶项。

示例1:O(1) 常数时间

def get_first_element(arr):return arr[0]  # 无论数组长度n多大,只执行1次
  • 分析:无论输入规模n(数组长度)如何变化,操作次数始终为1,因此时间复杂度为 O(1)

示例2:O(n) 线性时间

def sum_array(arr):total = 0for num in arr:  # 循环执行n次(n为数组长度)total += numreturn total
  • 分析:循环执行次数与输入规模n成正比(n次),因此时间复杂度为 O(n)

示例3:O(n²) 平方时间

def print_pairs(arr):n = len(arr)for i in range(n):      # 外层循环n次for j in range(n):  # 内层循环n次print(arr[i], arr[j])
  • 分析:外层循环n次,内层循环每次也执行n次,总操作次数为n×n = n²,因此时间复杂度为 O(n²)

示例4:O(log n) 对数时间

def binary_search(arr, target):left, right = 0, len(arr) - 1while left <= right:mid = (left + right) // 2  # 每次将问题规模缩小一半if arr[mid] == target:return midelif arr[mid] < target:left = mid + 1else:right = mid - 1return -1
  • 分析:二分查找每次将搜索范围缩小一半,执行次数为log₂n(以2为底的对数),因此时间复杂度为 O(log n)

示例5:O(n log n) 线性对数时间

def merge_sort(arr):  # 归并排序if len(arr) <= 1:return arrmid = len(arr) // 2left = merge_sort(arr[:mid])  # 递归拆分(log n层)right = merge_sort(arr[mid:])return merge(left, right)  # 合并操作(每层总耗时O(n))def merge(left, right):  # 合并两个有序数组result = []i = j = 0while i < len(left) and j < len(right):if left[i] <= right[j]:result.append(left[i])i += 1else:result.append(right[j])j += 1result.extend(left[i:])result.extend(right[j:])return result
  • 分析:归并排序通过递归将数组拆分为log n层,每一层的合并操作总耗时为O(n),因此总时间复杂度为 O(n log n)

二、空间复杂度计算

空间复杂度关注算法额外开辟的存储空间与n的关系,不包含输入数据本身的空间。

示例1:O(1) 常数空间

def swap(a, b):temp = a  # 只使用1个临时变量,与n无关a = bb = temp
  • 分析:无论输入规模如何,额外空间仅为1个临时变量,因此空间复杂度为 O(1)

示例2:O(n) 线性空间

def copy_array(arr):new_arr = [0] * len(arr)  # 新数组长度与n成正比for i in range(len(arr)):new_arr[i] = arr[i]return new_arr
  • 分析:创建了一个与输入数组等长的新数组,额外空间为n,因此空间复杂度为 O(n)

示例3:O(log n) 对数空间

def factorial_recursive(n):  # 递归计算阶乘if n == 0:return 1return n * factorial_recursive(n - 1)
  • 分析:递归调用会在栈内存中保存log n层调用帧(每次递归问题规模减小),因此空间复杂度为 O(log n)

示例4:O(n²) 平方空间

def create_matrix(n):matrix = []for i in range(n):row = [0] * n  # 每行n个元素matrix.append(row)return matrix  # 总空间为n×n = n²
  • 分析:创建了一个n×n的二维数组,额外空间为,因此空间复杂度为 O(n²)

三、总结

  1. 时间复杂度
    统计核心操作的执行次数,保留与n相关的最高阶项(如n² + n简化为O(n²))。

  2. 空间复杂度
    统计额外开辟的存储空间(如临时变量、新数组、递归栈等),同样保留最高阶项。

  3. 常见场景:

    • 循环次数与n成正比 → O(n)
    • 嵌套循环 → O(n²)(两层)、O(n³)(三层)
    • 递归深度为log nO(log n)
    • 新数组长度为nO(n)

通过这些例子,可以更清晰地理解如何分析算法的效率,从而在实际编程中选择更优的实现方式。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/915793.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

河北网站快速排名建设学电脑培训班多少一个月

排查流程 hive任务停止是调用org.apache.hive.jdbc.HiveStatement的close()方法实现的 其底层是委托给org.apache.hive.service.cli.thrift.TCLIService.Iface客户端实例来实现。 同时&#xff0c;通过JDK动态代理为其织入了synchronized同步机制&#xff1a;其底层是委托给…

自己做免费手机网站外贸商做英文网站的目的

目录 一、问题引入 二、缓冲区 1、什么是缓冲区 2、刷新策略 3、缓冲区由谁提供 4、重看问题 三、缓冲区的简单实现 一、问题引入 我们先来看看下面的代码&#xff1a;我们使用了C语言接口和系统调用接口来进行文件操作。在代码的最后&#xff0c;我们还使用fork函数创建…

深圳松岗网站建设wordpress xmlseo

转自&#xff1a;技术分享 | MemAvailable 是怎么计算的-腾讯云开发者社区-腾讯云 背景 前两天安装 OceanBase 时遇到一个小问题&#xff1a; 很明显&#xff0c;安装OB时要求服务器可用内存至少 8G&#xff0c;不达标就无法安装。为了凑这3台10G内存的服务器我已经费了不少劲…

基于IOS26的iOS 内存分析与必要内存界定

本文是基于IOS26的iOS 内存分析与必要内存界定,能够从一定角度理解Apple系列设备的内存使用机制。前言: 最近将15和16Pro更新了IOS26,在网上翻阅了一下,没有看见IOS26的内存分析文章,于是自己分析,整理笔记并水一…

深入解析:ARM架构学习9——LM75温度传感器+ADC转换器

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

破局 “节能不省钱” 悖论:开源 EMS 生态如何让中小企业用 1/3 成本实现能效跃升?

对于广大中小企业而言,能源成本是运营中不容忽视的核心支出。一个普遍的共识是:节能就是省钱。然而,当企业主们真正调研能源管理系统(EMS)时,往往会被高昂的初始投入和隐形成本劝退——动辄数十万的软件许可费、…

旅游网站开发目标网站建设人员叫什么

在使用Windows 10工作时会遇到形形色色的问题&#xff0c;比如笔记本电脑搜索不到无线网络。那么如何排除故障呢&#xff1f;下面小编与你分享具体步骤和方法。工具/材料Windows 10操作系统操作方法第1&#xff1a;启动Windows 10操作系统&#xff0c;如图所示。点击任务栏&quo…

实用指南:U盘歌单管理器 (专业车载音乐播放列表制作工具)

实用指南:U盘歌单管理器 (专业车载音乐播放列表制作工具)2025-09-24 13:58 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important…

iOS 26 性能测试实战,如何评估启动速度、CPUGPU 负载、帧率与系统资源适配(uni-app 与 iOS 原生应用性能方案)

本文围绕 iOS 26 性能测试展开,结合 Liquid Glass 特效与系统机制变化,介绍启动速度、CPU/GPU 渲染、帧率、资源加载等关键指标测试方法与工具组合,并给出 uni-app 与原生 App 的实战优化策略。iOS 26 正式发布后,…

P14062 【MX-X21-T7】[IAMOI R5] 若我不曾见过太阳 题解

考虑对于每个 \(i\) 求出使 \([1,i]\) 全部排到 \([i+1,n]\) 之前的最小操作次数。将 \(\le i\) 的数视为 \(0\),\(>i\) 的数视为 \(1\),根据操作的顺序,位置差较大的 \((1,0)\) 有序对会优先被交换。 也就是说,…

unity确定性帧同步框架

https://github.com/aaa719717747/TrueSyncExample

03-堆和栈

概述 堆和栈是程序运行时内存分配的两个核心区域,用途、管理方式和特性差异很大。且堆(内存区域)与上篇文章的链表(数据结构)有一定关联,但本质不同 —— 堆是一块内存空间,而链表常被用作管理堆内存的工具。下…

深入解析:Django事务

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

做网站6000左右的电脑网上购物商城系统设计

3.mysql数据库3.10 单表查询3.10.1. 简单查询查询在数据库中使用的频率是最高的&#xff1a;十次查询&#xff0c;一次增删改。1)建表2)插入数据3.10.1.1. 选择字段&#xff1a;selectselect 字段名1,字段名2…… from 表名 where 条件;3.10.1.2. 字段重命名(别名)&#xff1a;…

视频汇聚平台EasyCVR如何构建智慧农业监控监管系统?

视频汇聚平台EasyCVR如何构建智慧农业监控监管系统?现代农业的迅速发展中,集成监控管理系统已成为提高农业生产效率和优化管理的关键工具。EasyCVR视频汇聚平台作为一个具有高度可扩展性、灵活的视频处理能力和便捷的…

一套自用的git提交规范,可清晰的识别到关联的任务/bug - 实践

一套自用的git提交规范,可清晰的识别到关联的任务/bug - 实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Con…

学做ps的软件的网站有哪些内容石家庄网站建设王道下拉棒

博主介绍&#xff1a;黄菊华老师《Vue.js入门与商城开发实战》《微信小程序商城开发》图书作者&#xff0c;CSDN博客专家&#xff0c;在线教育专家&#xff0c;CSDN钻石讲师&#xff1b;专注大学生毕业设计教育和辅导。 所有项目都配有从入门到精通的基础知识视频课程&#xff…

高平市规建设局网站学生个人网站布局

这年头&#xff0c;在职场不但要会做&#xff0c;还要会说。 会说还不能平铺直叙的说&#xff0c;还要能把普通的工作说出话来&#xff0c;这就需要一些“考究”的用词。尤其是在某些头部企业的带领下&#xff0c;业务不够、产品不行、解决方案不够新&#xff0c;就用华丽的辞…

撕开厂商锁定黑箱:MyEMS 如何用开源代码夺回能源管理的 “自主控制权”?

在能源管理数字化浪潮中,许多企业曾满怀期待引入专业系统,却最终陷入深深的困境:系统建成之日,竟是受制于人之时。高昂的许可费、昂贵的定制开发、无休止的升级服务费、封闭的数据格式……这些看似专业的能源管理系…

继续 Vibe Coding 撸工具:Markdown写作 + 一键发布

又是感谢Vibe Coding的一天,最近尝试用 CodyBuddy 来重构一下之前的文章发布工具OpenWrite,经过一周的迭代,现在基本差不多恢复之前80%的功能了。如果你跟我一样,平时写点东西,又讨厌自己的文章被别人搬运,那么可…