时间复杂度与空间复杂度计算方法介绍

文章目录

  • 时间复杂度(Time Complexity)
    • 基本概念
    • 示例
  • 空间复杂度(Space Complexity)
    • 基本概念
    • 示例
  • 参考

时间复杂度(Time Complexity)

基本概念

  • 时间复杂度衡量的是算法执行所需的时间,它通常表示为输入数据的规模 ( n ) 的函数。

    一个算法执行所耗费的时间,从理论上说是不能算出来的,因为只有当把程序放在机器上跑起来,才能知道具体时间。但是需要每个算法都上机测试吗?是可以都上机测试,但是这很麻烦,所以才有了时间复杂度这个分析方式。

    一个算法所花费的时间与其中语句的执行次数成正比例,算法中的基本操作的执行次数,为算法的时间复杂度。

  • 大 O 符号(Big O Notation):用来描述算法的时间复杂度的上界,表示最坏情况下的时间增长趋势。

  • 常见的时间复杂度:

    • O(1) :常数时间复杂度,不随输入规模变化。eg:O(100) -> O(1)
    • O(log n) :对数时间复杂度,常见于二分查找。
    • O(n) :线性时间复杂度,常见于简单遍历算法。
    • O(n log n) :线性对数时间复杂度,常见于快速排序、归并排序。
    • O(n²) :平方时间复杂度,常见于嵌套循环。
    • O(2ⁿ) :指数时间复杂度,常见于递归的组合问题。
    • O(n!) :阶乘时间复杂度,常见于排列问题。
  • 计算方法

    • 逐步分析法:分析算法的每一行代码,累加时间复杂度。

      • 赋值语句、算术运算、比较运算等基本操作的时间复杂度都是 O(1)
      • 对于循环结构,如果循环次数是 n ,那么该部分的时间复杂度是 O(n)
      • 对于嵌套循环,如果内外层分别有 n 次和 m 次,那么时间复杂度是 O(n^m)
    • 取最大量级:最终时间复杂度为各部分时间复杂度的最大值。忽略系数和低阶项。

      • 忽略低阶项:eg:O(N^2+N) -> O(N^2)

      • 忽略系数:eg:O(2N^2) -> O(N^2)

        如果最高阶项存在且不是1,则去除与这个项目相乘的常数


示例

  • 常数时间复杂度 O(1)

    int a = 10;
    int b = a + 5;
    

    说明:无论输入数据的规模如何,上述代码中的每个操作都只需要常数时间。因此,这段代码的时间复杂度是 O(1)

  • 线性时间复杂度 O(n)

    示例1:

    for (int i = 0; i < n; i++) {// O(1) 操作
    }
    

    说明:这里有一个简单的循环,循环执行了 n 次,每次循环执行 O(1) 的操作。因此,总时间复杂度是 O(n)

    示例2:

    for (int i = 0; i < n; i++) {for (int j = i; j < n; j++) {// O(1) 操作}
    }
    

    说明:在这个例子中,循环运行了 n 次,每次加法操作的时间复杂度是 O(1)。因此,总时间复杂度是 O(n) 。

  • 平方时间复杂度 O(n²)

    示例1:

    for (int i = 0; i < n; i++) {for (int j = 0; j < n; j++) {// O(1) 操作}
    }
    

    说明:这是一个双重嵌套循环。外层循环执行 n 次,内层循环也执行 n 次,每次内层循环的操作时间复杂度是 O(1)。因此,总时间复杂度是 O(n×n) = O(n²)

    示例2:

    for (int i = 0; i < n; i++) {for (int j = i; j < n; j++) {// O(1) 操作}
    }
    

    说明:在这个例子中,内层循环的次数随外层循环的次数变化,第一次内层循环执行 n 次,第二次执行 n−1 次,以此类推,总时间复杂度为 O(n(n+1)/2) ,简化后依然为 O(n²)

  • 对数时间复杂度 O(log n)

    示例:

    int binarySearch(int arr[], int n, int target) {int low = 0;int high = n - 1;while (low <= high) {int mid = low + (high - low) / 2;if (arr[mid] == target)return mid;else if (arr[mid] < target)low = mid + 1;elsehigh = mid - 1;}return -1;
    }
    

    说明:这是二分查找算法的实现 。在每次循环中,搜索区间都减半,因此时间复杂度为 O(log n)

  • 线性对数时间复杂度 O(n log n)

    示例:

    void mergeSort(int arr[], int l, int r) {if (l < r) {int m = l + (r - l) / 2;mergeSort(arr, l, m);mergeSort(arr, m + 1, r);merge(arr, l, m, r);}
    }
    

    说明:归并排序是一种典型的 O(n log n) 时间复杂度算法。它将数组递归地分成两半,直到每个子数组只剩一个元素,然后再合并这些子数组。每次合并的复杂度是 O(n) ,递归深度是 O(log n) ,因此总时间复杂度为 O(n log n)

  • 指数时间复杂度 O(2ⁿ)

    示例:

    int fibonacci(int n) {if (n <= 1)return n;elsereturn fibonacci(n-1) + fibonacci(n-2);
    }
    

    说明:这里是递归计算斐波那契数列的代码。每次递归调用都需要计算两个子问题,导致时间复杂度为 O(2ⁿ) 。这种复杂度通常会导致非常长的执行时间,不适用于大规模数据。


空间复杂度(Space Complexity)

基本概念

  • 空间复杂度衡量的是算法执行过程中所需的存储空间,它表示为输入数据规模 ( n ) 的函数。
  • 大O符号:同样使用大O符号表示,表示所需空间的增长趋势。
  • 常见的空间复杂度:
    • O(1) :常数空间复杂度,表示不随输入规模变化的额外空间需求。
    • O(n) :线性空间复杂度,表示需要与输入规模成正比的空间。
    • O(n²) :平方空间复杂度,表示需要与输入规模平方成正比的空间。
  • 计算方法
    • 逐步分析法:分析算法中所需的存储空间,累加所有部分的空间复杂度。
    • 简单变量(如整型、浮点型)占用的空间是 ( O(1) )。
    • 数组、列表等数据结构占用的空间与其长度有关,例如一个长度为 ( n ) 的数组占用的空间是 ( O(n) )。
      递归调用时,需要考虑调用栈的空间开销。

示例

  • 常数空间复杂度 O(1)

    示例:

    int a = 5;
    int b = 10;
    int c = a + b;
    

    说明:无论输入数据的规模如何,这段代码只占用了固定的内存空间。因此,空间复杂度是 O(1)

  • 线性空间复杂度 O(n)

    示例:

    int arr[n];
    

    说明:如果声明了一个长度为 n 的数组,那么空间复杂度是 O(n) ,因为数组的大小随 n 的增加而增加

  • 平方空间复杂度 O(n²)

    示例:

    int matrix[n][n];
    

    说明:这里声明了一个 n×n 的矩阵,因此空间复杂度为O(n²) ,因为存储该矩阵所需的空间随 n 的平方增长

  • 指数空间复杂度 O(2ⁿ)

    示例:

    void allSubsets(int arr[], int n) {int subset_count = pow(2, n);for (int i = 0; i < subset_count; i++) {for (int j = 0; j < n; j++) {if (i & (1 << j))printf("%d ", arr[j]);}printf("\n");}
    }
    

    说明:生成一个集合的所有子集需要存储 2ⁿ 个子集。每个子集都可能占用额外的存储空间,导致总体空间复杂度为 O(2ⁿ)


参考

  • 算法:时间复杂度与空间复杂度计算方法

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

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

相关文章

有什么AI辅助阅读文献工具推荐?

AI的发展速度非常快&#xff0c;在很多方面都已经可以提供货真价实的辅助能力。 比如AI辅助阅读方面&#xff0c;可以获取、分析和理解大量文献资料。这可以帮助我们快速浏览和理解PDF文件和其他文档&#xff0c;提高我们的工作效率和学习效率&#xff0c;达到降本增效。 作为…

各个Spring Cloud版本有何主要差异

Spring Cloud 的各个版本之间确实存在一些关键差异&#xff0c;这些差异主要体现在功能更新、性能优化、对新技术的支持以及对旧有技术的替代等方面。 1. Spring Cloud Dalston 这是 Spring Cloud 的一个早期版本&#xff0c;它提供了微服务架构所需的基本组件&#xff0c;如服…

【翻译】审慎对齐:推理使更安全的语言模型成为可能

原文&#xff1a;https://arxiv.org/abs/2412.16339 出自OpenAI 摘要 随着大规模语言模型对安全关键领域的影响越来越大&#xff0c;确保它们可靠地遵守定义良好的原则仍然是一个基本挑战。本文提出慎思校准&#xff0c;一种新的范式&#xff0c;直接教模型安全规范&#xff…

1、ELK的架构和安装

ELK简介 elk&#xff1a;elasticsearch logstash kibana&#xff0c;统一日志收集系统。 elasticsearch&#xff1a;分布式的全文索引引擎的非关系数据库&#xff0c;json格式&#xff0c;在elk中存储所有的日志信息&#xff0c;架构有主和从&#xff0c;最少需要2台。 …

使用连字符容易出错,尽量使用驼峰式的

在<Select>组件中&#xff0c;存在一个拼写错误。在option - value属性中&#xff0c;正确的写法应该是option - value&#xff08;使用连字符&#xff09;或者optionValue&#xff08;如果是按照Vue组件属性的驼峰命名法&#xff09;&#xff0c;这里写成了option - val…

CentOS7 解决ping:www.baidu.com 未知的名称或服务

CentOS7 解决ping&#xff1a;www.baidu.com“未知的名称或服务 在VM查看网络配置 查看虚拟网络编辑器 编辑网络配置文件 vi /etc/sysconfig/network-scripts/ifcfg-ens33注意&#xff1a;不同机器的配置文件名可能不相同&#xff0c;通过 ip addr 命令查看 将 ONBOOT 从 no 改…

QT----------文件系统操作和文件读写

一、输入输出设备类 功能&#xff1a; Qt 提供了一系列的输入输出设备类&#xff0c;用于处理不同类型的 I/O 操作&#xff0c;如文件、网络等。 二、文件读写操作类 QFile 类&#xff1a; 提供了对文件的读写操作&#xff0c;可以打开、读取、写入和关闭文件。示例&#x…

Android14 CTS-R6和GTS-12-R2不能同时测试的解决方法

背景 Android14 CTS r6和GTS 12-r1之后&#xff0c;tf-console默认会带起OLC Server&#xff0c;看起来olc server可能是想适配ATS(android-test-station)&#xff0c;一种网页版可视化、可配置的跑XTS的方式。这种网页版ATS对测试人员是比较友好的&#xff0c;网页上简单配置下…

2024-12-29-sklearn学习(26)模型选择与评估-交叉验证:评估估算器的表现 今夜偏知春气暖,虫声新透绿窗纱。

文章目录 sklearn学习(26) 模型选择与评估-交叉验证&#xff1a;评估估算器的表现26.1 计算交叉验证的指标26.1.1 cross_validate 函数和多度量评估26.1.2 通过交叉验证获取预测 26.2 交叉验证迭代器26.2.1 交叉验证迭代器–循环遍历数据26.2.1.1 K 折26.2.1.2 重复 K-折交叉验…

免费容器镜像服务--统信容器镜像平台

原文链接&#xff1a;免费容器镜像服务--统信容器镜像平台 Hello&#xff0c;大家好啊&#xff01;今天给大家带来一篇关于 免费容器镜像服务——统信容器镜像平台 的文章。统信容器镜像平台是由统信软件推出的免费容器镜像服务&#xff0c;遵循 OCI&#xff08;Open Containe…

Vue 3.0 中 template 多个根元素警告问题

在 Vue 2.0 中&#xff0c;template 只允许存在一个根元素&#xff0c;但是这种情况在 Vue 3.0 里发生了一些变化。 在 Vue 3.0 中开始支持 template 存在多个根元素了。但是因为 VSCode 中的一些插件没有及时更新&#xff0c;所以当你在 template 中写入多个根元素时&#xf…

基于JavaWeb的汽车维修保养智能预约系统

作者简介&#xff1a;Java领域优质创作者、CSDN博客专家 、CSDN内容合伙人、掘金特邀作者、阿里云博客专家、51CTO特邀作者、多年架构师设计经验、多年校企合作经验&#xff0c;被多个学校常年聘为校外企业导师&#xff0c;指导学生毕业设计并参与学生毕业答辩指导&#xff0c;…

Kafka 幂等性与事务

文章目录 幂等性实现机制配置使用局限性 事务使用场景配置使用实现机制事务过程事务初始化事务开始事务提交事务取消事务消费 幂等性 Producer 无论向 Broker 发送多少次重复的数据&#xff0c;Broker 端只会持久化一条&#xff0c;保证数据不丢失且不重复。 实现机制 通过引…

ActiveMQ支持哪些传输协议

ActiveMQ 支持多种传输协议&#xff0c;以满足不同场景下的需求。这些协议包括但不限于以下几种&#xff1a; 1. OpenWire&#xff1a; • 这是 ActiveMQ 的默认和专有协议。 • 提供了高效、可靠的消息传递功能。 • 支持多种消息传递模式&#xff0c;如点对点和发布/订阅。 2…

MySQL数据库——常见慢查询优化方式

本文详细介绍MySQL的慢查询相关概念&#xff0c;分析步骤及其优化方案等。 文章目录 什么是慢查询日志&#xff1f;慢查询日志的相关参数如何启用慢查询日志&#xff1f;方式一&#xff1a;修改配置文件方式二&#xff1a;通过命令动态启用 分析慢查询日志方式一&#xff1a;直…

Qt天气预报系统设计界面布局第四部分左边

Qt天气预报系统设计 1、第四部分左边的第一部分1.1添加控件1.2修改控件名字 2、第四部分左边的第二部分2.1添加控件2.2修改控件名字 3、第四部分左边的第三部分3.1添加控件3.2修改控件名字 4、对整个widget04l调整 1、第四部分左边的第一部分 1.1添加控件 拖入一个widget&…

【嵌入式硬件】嵌入式显示屏接口

数字显示串行接口&#xff08;Digital Display Serial Interface&#xff09; SPI 不过多赘述。 I2C-bus interface 不过多赘述 MIPI DSI MIPI (Mobile Industry Processor Interface) Alliance, DSI (Display Serial Interface) 一般用于移动设备&#xff0c;下面是接口…

一个在ios当中采用ObjectC和opencv来显示图片的实例

前言 在ios中采用ObjectC编程利用opencv来显示一张图片&#xff0c;并简单绘图。听上去似乎不难&#xff0c;但是实际操作下来&#xff0c;却不是非常的容易的。本文较为详细的描述了这个过程&#xff0c;供后续参考。 一、创建ios工程 1.1、选择ios工程类型 1.2、选择接口模…

el-input输入框需要支持多输入,最后传输给后台的字段值以逗号分割

需求&#xff1a;一个输入框字段需要支持多次输入&#xff0c;最后传输给后台的字段值以逗号分割 解决方案&#xff1a;结合了el-tag组件的动态编辑标签 那块的代码 //子组件 <template><div class"input-multiple-box" idinputMultipleBox><div>…