数据结构:时间复杂度和空间复杂度计算

1.什么是时间复杂度和空间复杂度?


1.1算法效率


算法效率分析分为两种:第一种是时间效率,第二种是空间效率。时间效率被称为时间复杂度,
而空间效率被称作空间复杂度。 时间复杂度主要衡量的是一个算法的运行速度,而空间复杂度主
要衡量一个算法所需要的额外空间,在计算机发展的早期,计算机的存储容量很小。所以对空间
复杂度很是在乎。但是经过计算机行业的迅速发展,计算机的存储容量已经达到了很高的程度。
所以我们如今已经不需要再特别关注一个算法的空间复杂度。


1.2 时间复杂度的概念


时间复杂度的定义:在计算机科学中,算法的时间复杂度是一个函数,它定量描述了该算法的运
行时间。一个算法执行所耗费的时间,从理论上说,是不能算出来的,只有你把你的程序放在机
器上跑起来,才能知道。但是我们需要每个算法都上机测试吗?是可以都上机测试,但是这很麻
烦,所以才有了时间复杂度这个分析方式。一个算法所花费的时间与其中语句的执行次数成正比
例,算法中的基本操作的执行次数,为算法的时间复杂度。


1.3 空间复杂度的概念


空间复杂度是对一个算法在运行过程中临时占用存储空间大小的量度 。空间复杂度不是程序占用
了多少bytes的空间,因为这个也没太大意义,所以空间复杂度算的是变量的个数。空间复杂度计
算规则基本跟实践复杂度类似,也使用大O渐进表示法。
 

 大O的渐进表示法

#include <stdio.h>// 请计算一下Func1基本操作执行了多少次?
void Func1(int N)
{int count = 0;for (int i = 0; i < N; ++i){for (int j = 0; j < N; ++j){++count;}}for (int k = 0; k < 2 * N; ++k){++count;}int M = 10;while (M--){++count;}printf("%d\n", count);
}

 Func1 执行的基本操作次数 :F(N)=N^2+N*2+10

        实际中我们计算时间复杂度时,我们其实并不一定要计算精确的执行次数,而只需要大概执行次数,那么这里我们使用大O的渐进表示法。大O符号(Big O notation):是用于描述函数渐进行为的数学符号。
推导大O阶方法:
        1、用常数1取代运行时间中的所有加法常数。
        2、在修改后的运行次数函数中,只保留最高阶项。
        3、如果最高阶项存在且不是1,则去除与这个项目相乘的常数。得到的结果就是大O阶。
使用大O的渐进表示法以后,Func1的时间复杂度为:O(N^2)

 N = 10 F(N) = 100
N = 100 F(N) = 10000
N = 1000 F(N) = 1000000

通过上面我们会发现大O的渐进表示法去掉了那些对结果影响不大的项,简洁明了的表示出了执
行次数。
另外有些算法的时间复杂度存在最好、平均和最坏情况:
最坏情况:任意输入规模的最大运行次数(上界)
平均情况:任意输入规模的期望运行次数
最好情况:任意输入规模的最小运行次数(下界)
例如:在一个长度为N数组中搜索一个数据x
最好情况:1次找到
最坏情况:N次找到
平均情况:N/2次找到
在实际中一般情况关注的是算法的最坏运行情况,所以数组中搜索数据时间复杂度为O(N)
 

 2.时间复杂度与空间复杂度的区别

时间复杂度:

判断算法的时间复杂度通常是通过分析算法中的基本操作次数来进行的。以下是一些常用的判断时间复杂度的方法:

1. 计算操作的执行次数:根据算法的实际代码或伪代码,计算出每个操作(比如循环、条件判断、函数调用等)在最坏情况下执行的次数。

2. 识别循环结构:对于循环结构,需要确定循环的迭代次数,并将循环体中的操作次数乘以迭代次数。

3. 分析递归算法:对于递归算法,可以使用递归树或递归方程的方法来进行分析,推导出递归的深度和每层的操作次数。

4. 考虑最坏情况:时间复杂度通常使用算法最坏情况下的操作次数来表示,这样可以保证算法在任何情况下的时间表现。

5. 忽略常数项和低阶项:在计算时间复杂度时,通常忽略操作次数的常数项和低阶项,只保留最高阶的项,使用大O符号表示。

需要注意的是,时间复杂度只是对算法的一个粗略估计,它描述的是算法运行时间与输入规模的增长趋势,并不具体表示实际的执行时间。此外,时间复杂度是在理论上对算法效率的分析,实际运行时的表现可能受到各种因素影响。

因此,在分析时间复杂度时,需要结合具体的算法实现、输入规模以及实际的运行环境等因素来进行判断和评估。


空间复杂度 

判断算法的空间复杂度通常是通过分析算法在执行过程中所需的额外空间来进行的。以下是一些常用的判断空间复杂度的方法:

1. 计算变量占用的空间:根据算法中定义的变量、数据结构和临时存储空间等,计算出在最坏情况下所需的额外空间。

2. 考虑递归函数调用栈:对于使用递归的算法,需要考虑递归函数调用时占用的栈空间。

3. 分析数据结构的空间复杂度:对于使用的数据结构(如数组、链表、栈、队列等),需要根据其存储方式和元素数量来分析其占用的额外空间。

4. 考虑函数调用和递归深度:在算法执行过程中,如果有函数调用或递归调用,需要考虑每次调用时所需的栈空间。

5. 忽略常数项和低阶项:与时间复杂度类似,空间复杂度的计算中通常忽略常数项和低阶项,只保留最高阶的项,使用大O符号表示。

需要注意的是,空间复杂度表示的是算法在执行过程中所需的额外空间,而不是算法所操作的原始输入数据的空间。因此,在计算空间复杂度时,应将注意力放在算法运行过程中所需额外空间的分析上。

与时间复杂度类似,空间复杂度也只是对算法的一个粗略估计,它描述的是算法所需额外空间随输入规模的增长趋势,并不具体表示实际的空间使用情况。在实际应用中,也要结合具体的算法实现、数据规模以及可用内存等因素来进行判断和评估。


 二者的区别

时间复杂度和空间复杂度是用来衡量算法效率的两个重要指标。它们分别关注算法在执行过程中所需的时间和空间资源消耗。

时间复杂度(Time Complexity)衡量的是算法执行所需的时间,也可以说是算法的运行时间。它描述的是算法执行所消耗的操作步骤数量与输入规模之间的关系。常用大O符号(O)表示时间复杂度。

时间复杂度反映了算法在处理数据时所需的时间随着输入规模的增加而增长的速度。一般来说,时间复杂度越低,算法的执行效率越高。常见的时间复杂度包括常数时间O(1)、线性时间O(n)、对数时间O(log n)、平方时间O(n^2)等。

空间复杂度(Space Complexity)衡量的是算法执行所需的额外空间,也可以说是算法的存储空间。它描述的是算法所需的额外空间与输入规模之间的关系。同样,常用大O符号(O)表示空间复杂度。

空间复杂度反映了算法在处理数据时所需的额外空间随着输入规模的增加而增长的速度。一般来说,空间复杂度越低,算法所需的额外空间越小。常见的空间复杂度包括常数空间O(1)、线性空间O(n)、对数空间O(log n)等。

需要注意的是,时间复杂度和空间复杂度是独立且不可兼得的。某个算法可能在时间复杂度上表现良好,但在空间复杂度上较高,或者反之。因此,在选择算法时,需要根据实际情况综合考虑时间和空间的权衡。

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

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

相关文章

UE4 显示遮挡物体

SceneDepth是你相机能够看见的物体的深度距离 CustomDepth是你相机包括看不见被遮挡的物体的深度距离 如果CustemDepth比SceneDepth的距离相等&#xff0c;那么就是没有被遮挡的物体&#xff0c;如果被遮挡那么就是CustemDepth比SceneDepth深度距离远&#xff0c;然后再做对应…

【业务功能篇91】微服务-springcloud-多线程-线程池执行顺序

一、线程的实现方式 1. 线程的实现方式 1.1 继承Thread class ThreadDemo01 extends Thread{Overridepublic void run() {System.out.println("当前线程:" Thread.currentThread().getName());} }1.2 实现Runnable接口 class ThreadDemo02 implements Runnable{…

Win7下设置“定时关机”的方法

【Win7下设置定时关机的方法】 ●【所有程序】→【附件】→【系统工具】→【任务计划程序】 ● 右键单击&#xff0c;选择【创建基本任务】&#xff0c;然后在【任务名称】中填自定义名称&#xff0c;如“定时关机” ● 之后&#xff0c;按照下面各图的提示进行“任务触发器”…

在Ubuntu上安装CUDA和cuDNN以及验证安装步骤

在Ubuntu上安装CUDA和cuDNN以及验证安装步骤 本教程详细介绍了如何在Ubuntu操作系统上安装CUDA&#xff08;NVIDIA的并行计算平台&#xff09;和cuDNN&#xff08;深度神经网络库&#xff09;&#xff0c;以及如何验证安装是否成功。通过按照这些步骤操作&#xff0c;您将能够…

QTday4

一、闹钟 头文件 源文件 二、XMind思维导图

EM算法总结(一)

文章目录 前言参数分析 前言 EM算法广泛用于含有隐藏变量的模型的极大似然估计。 参考&#xff1a; 文曲经典&#xff1a;统计学习方法-李航 参数分析 θ [ P ( z 1 ∣ x ) , P ( z 2 ∣ x ) , ⋯ , P ( z m ∣ x ) , P ( y 1 ∣ z 1 , x ) , P ( y 2 ∣ z 1 , x ) , ⋯ , …

Vue框架--理解MVVM

我们知道&#xff0c;MVVM是Model-View-ViewModel的简写。它本质上就是MVC的改进版。我们看看MVVM的模型架构&#xff0c;如下所示: 架构理解与实例

《C和指针》笔记19: 条件操作符

条件操作符接受三个操作数。它也会控制子表达式的求值顺序。下面是它的用法&#xff1a; expression1 ? expression2 : expression3条件操作符的优先级非常低&#xff0c;所以它的各个操作数即使不加括号&#xff0c;一般也不会有问题。但是&#xff0c;为了清楚起见&#xf…

stable diffusion实践操作-重绘

系列文章目录 本文专门开一节写局部重绘相关的内容&#xff0c;在看之前&#xff0c;可以同步关注&#xff1a; stable diffusion实践操作 提示&#xff1a;写完文章后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 系列文章目录前言一、局…

9.1.tensorRT高级(4)封装系列-自动驾驶案例项目self-driving-道路分割分析

目录 前言1. 道路分割总结 前言 杜老师推出的 tensorRT从零起步高性能部署 课程&#xff0c;之前有看过一遍&#xff0c;但是没有做笔记&#xff0c;很多东西也忘了。这次重新撸一遍&#xff0c;顺便记记笔记。 本次课程学习 tensorRT 高级-自动驾驶案例项目self-driving-道路分…

数据结构学习系列之单向链表的三种删除方式

方式1&#xff1a;删除单向链表头结点后的结点&#xff0c;即头删法&#xff0c;代码如下&#xff1a;示例代码&#xff1a; int delete_link_list_1(node_t *phead){if(NULL phead){printf("入参为NULL\n");return -1;}if(NULL phead->next){printf("链表…

java-初识Servlet,Tomcat,JDBC

文章目录 前言一、ServletServlet 生命周期Servlet 实例Servlet 过滤器 二、TomcatJDBCJDBC连接数据库实例 总结 前言 java入门须知的重要概念/名词/技术 等 一、Servlet Servlet是Java Web开发中的一个核心组件&#xff0c;它是基于Java语言编写的服务器端程序&#xff0c;…

Boa服务器与Cgi简介

Boa是一个单任务的HTTP服务器&#xff0c;Boa只能依次完成用户的请求&#xff0c;而不会fork出新的进程来处理并发连接请求。Boa支持CGI。Boa的设计目标是速度和安全&#xff0c;这很符合嵌入式的需要&#xff0c;他的特点就是可靠性和可移植性。 Boa的作用&#xff1a; 负责h…

Redis 内存淘汰策略详解

Redis 内存淘汰策略详解 一、简介Redis内存管理问题 二、内存淘汰策略1.为什么需要内存淘汰策略2.内存淘汰策略分类&#xff08;1&#xff09;noeviction&#xff08;2&#xff09;allkeys-lru&#xff08;3&#xff09;allkeys-lfu&#xff08;4&#xff09;volatile-lru&…

Error: PostCSS plugin autoprefixer requires PostCSS 8 问题解决办法

报错&#xff1a;Error: PostCSS plugin autoprefixer requires PostCSS 8 原因&#xff1a;autoprefixer版本过高 解决方案&#xff1a; 降低autoprefixer版本 执行&#xff1a;npm i postcss-loader autoprefixer8.0.0

Dubbo 应用切换 ZooKeeper 注册中心实例,流量无损迁移

首先思考一个问题&#xff1a;如果 Dubbo 应用使用 ZooKeeper 作为注册中心&#xff0c;现在需要切换到新的 ZooKeeper 实例&#xff0c;如何做到流量无损&#xff1f; 本文提供解决这个问题的一种方案。 场景 有两个基于 Dubbo 的微服务应用&#xff0c;一个是服务提供者&…

降噪音频转录 Krisp: v1.40.7 Crack

主打人工智能降噪服务的初创公司「Krisp」近期宣布推出音频转录功能&#xff0c;能对电话和视频会议进行实时设备转录。该软件还整合的ChatGPT&#xff0c;以便快速总结内容&#xff0c;开放测试版于今天上线。 随着线上会议越来越频繁&#xff0c;会议转录已成为团队工作的重…

6 | 从文本文件中读取单词并输出不重复的单词列表

Transformation 操作 Transformation 操作是用于从一个 RDD(Resilient Distributed Dataset)创建一个新的 RDD,通常是通过对原始 RDD 的元素进行映射、筛选、分组等操作来实现的。Transformation 操作不会立即执行,而是惰性计算,只有在 Action 操作触发时才会真正执行。以…

Linux执行命令

命令格式 主命令 选项 参数&#xff08;操作对象&#xff09;例如&#xff1a; 修改主机名 hostname set-hostname 新名称显示/目录下的文件的详细信息 ls -l /命令 内置命令&#xff08;builtin&#xff09;&#xff1a;shell程序自带的命令。 外部命令&#xff1a;有独立…

git企业级使用

1.初始Git 1.1创建Git仓库 要提前说的是&#xff0c;仓库是进⾏版本控制的⼀个⽂件⽬录。我们要想对⽂件进⾏版本控制&#xff0c;就必须先创建⼀个仓库出来。创建⼀个Git本地仓库对应的命令为 git init &#xff0c;注意命令要在⽂件⽬录下执⾏&#xff0c;例如&#xff1a;…