数据结构时间复杂度与空间复杂度


文章目录

  • 引入
    • 算法
  • 1、时间复杂度
    • 1.概念
    • 2.大O渐进表示法
    • 3.常见时间复杂度计算举例
  • 2、空间复杂度
    • 1.概念
    • 2.常见空间复杂度计算举例


引入

算法

算法就是一段能将一个物体从初始状态转换到某个目标转态的一个有限长序列方法的统称

算法效率:考虑一个方法是否好,就要从它的效率上考虑,能高质量(即高效)的完成目标的算法,就是一个好的算法;而对于算法效率要怎么来进行判定呢?

与算法效率有关的因素有很多,包括:算法所需的时间、空间成本等因素;在计算机相关中包括网络运行速度,硬件等因素都会对效率产生影响,而这些因素都是我们所无法掌控的,所以我们在进行算法效率评定中大致以所需的时间和空间作为主要的衡量标志,来对算法效率进行一个判定,这就是时间复杂度与空间复杂度。

1、时间复杂度

1.概念

在计算机中,算法的时间复杂度也有定量的函数,其实也就是他将目标从初始状态转换为目标状态所需花费的时间。就从理论上来讲,想要获取一个算法的时间复杂度,那就必须将在计算机上运行,然后测量所需的时间,才能计算出它的时间复杂度。但在实际生活中,这种方式较为难以实现,所以我们将算法中基本操作的执行次数来作为它的时间复杂度。

我们就以下方的代码来进行一个举例:

//请计算Test1中++count所执行的次数
void Test1(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);
}

在如上代码中++count一共执行了:N^2 + 2N + 10次

实际上我们计算算法的时间复杂度时,并不需要将准确的执行次数计算出来,而是只需要渐进的表示。因为当你将量级拉大,比如几十万、几百万次执行中,几十、几百次的执行次数对于整体来说影响也不大。我们通常使用的方法是大O渐进表示法。

2.大O渐进表示法

1.表示方法:O(表达式中影响最大的哪一项)
2.推荐大O表示法
 1)确定的常数次,我们都使用O(1) 来表示;原因:只要是常数次,它就不是未知数的影响,无论基数多大,它都不会变,意味着效率不变
 2)O(N) 意味着随着N的变化,运算时间变长
 3)对于有些会有最好情况、最坏情况、与平均情况,这时候的时间复杂度是保守的估算,取最坏结果
3.注意:
 1)不是说一次循环就是O(n),两次循环就是o(n^2),具体要通过程序区分析
 2)时间复杂度计算,不能去数代码执行的次数,要根据思想去计算时间复杂度,然后看哪个更优,再去实现

4.常见的时间复杂度:O(N^2) , O(N) , O(logN) , O(1)

3.常见时间复杂度计算举例

void Test2(int N)
{int count = 0;for (int k = 0; k < 2 * N; ++k){++count;}int M = 10;while (M--){++count;}printf("%d\n", count);
}void Test3(int N, int M)
{int count = 0;for (int k = 0; k < M; ++k){++count;}for (int k = 0; k < N; ++k){++count;}printf("%d\n", count);
}

Test2就是刚刚我们所计算的那道题,用大O表示法来进行表示,它的时间复杂度是:O(N^2)

Test3中基本操作执行了M+N次,有两个未知数M和N,时间复杂度为 O(N+M)

2、空间复杂度

1.概念

空间复杂度也是一个数学表达式,是对一个算法在运行过程中临时占用存储空间大小的量度 。

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

在当今世界中由于电脑,手机等的储存空间大大增加,所以我们在实际处理问题中对与时间复杂度考虑式要优先于空间复杂度的。

2.常见空间复杂度计算举例

// 计算BubbleSort的空间复杂度?
void Test4(int* a, int n)
{assert(a);for (size_t end = n; end > 0; --end){int exchange = 0;for (size_t i = 1; i < end; ++i){if (a[i - 1] > a[i]){Swap(&a[i - 1], &a[i]);exchange = 1;}}if (exchange == 0)break;}
}// 计算阶乘递归Fac的空间复杂度?
long long Test5(size_t N)
{if (N == 0)return 1;return Fac(N - 1) * N;
}

Test4中使用了常数个额外空间,所以空间复杂度为 O(1)

Test5中递归调用了N次,开辟了N个栈帧,每个栈帧使用了常数个空间。空间复杂度为O(N)

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

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

相关文章

网站优化之robots.txt

本文于2015年底完成。 在查询favicon.ico相关的资料时&#xff0c;无间中看到了robots.txt。当时没有太注意&#xff0c;后来在百度的站长平台上看到了robots.txt的说明&#xff0c;咨询了度娘&#xff0c;找到几处说明&#xff0c;这里摘抄过来。 robots.txt文件是一个文本文件…

使用setdefault撰写文本索引脚本(出自Fluent Python案例)

背景介绍 由于我们主要介绍撰写脚本的方法&#xff0c;所以用一个简单的文本例子进行分析 a[(19,18),(20,53)] Although[(11,1),(16,1),(18,1)] ambiguity[(14,16)] 以上内容可以保存在一个txt文件中&#xff0c;任务是统计文件中每一个词&#xff08;包括字母&#xff0c;数…

评估LLM在细胞数据上的实用性(2)-细胞层面的评估

本文衔接上一篇&#xff1a;评估LLM在细胞数据上的实用性(1)-基本概述 目录 定义参数和任务批次整合多模态整合细胞类型注释 细胞层面的评估批次整合多模态整合细胞类型注释 定义 我们考虑一个预训练LLM表示为 M ( x , θ ) M(x,\theta) M(x,θ)&#xff0c;其基于单细胞数据…

SpringMVC数据传递及数据处理

ModelAndView传递 编写controller Controller RequestMapping("/account") public class AccountController {//也可以不创建ModelAndView&#xff0c;直接在参数中指定RequestMapping(value "/findAccount9")public ModelAndView findAccount9(ModelAndV…

npm 和yarn的安装和使用方法

npm 和yarn的安装和使用方法 一、npm安装 gnvm install 10.24.1 gnvm use 10.24.1 gnvm ls gnvm npm global#npm i 报错问题error Unexpected token ‘.’ #解决办法 node降级安装为node 14.21.3版本 npm 6.14.18版本 #gnvm search 14.. gnvm install 14.21.3 gnvm ls gnvm …

RAG 评估框架 -- RAGAS

原文 引入 RAG&#xff08;Retrieval Augmented Generation&#xff09;的原因 随着ChatGPT的推出&#xff0c;很多人都理所当然直接用LLM当作知识库回答问题。这种想法有两个明显的缺点&#xff1a; LLM无法得知在训练之后所发生的事情&#xff0c;因此无法回答相关的问题存…

从零开始学习Python基础语法:打开编程大门的钥匙

文章目录 一、引言1.1 Python作为一种流行的编程语言的介绍1.2 Python的应用领域和适用性 二、为什么选择Python2.1 Python的简洁性和易读性2.2 Python的跨平台特性 三、Python在数据科学和人工智能领域的应用3.1 第一个Python程序3.1.1 Hello, World!&#xff1a;编写并运行你…

学习python仅此一篇就够了(内置模块)

内置模块 导入模块 import 关键字导入 --------- import math import 模块名称 as alias(别名) import hashlib as h (给hashlib起别名) from 包 import 模块名称 random模块 该模块主要用来产生随机数&#xff08;伪随机数,计算机产生不了真正的随机数&#xff0c;是依…

统信UOS_麒麟KYLINOS上使用Remmina远程Windows并传输文件

原文链接&#xff1a;统信UOS/麒麟KYLINOS上使用Remmina远程Windows并传输文件 hello&#xff0c;大家好啊&#xff01;继之前我们讨论了在统信UOS/麒麟KYLINOS与Windows之间通过Open SSH实现文件传输之后&#xff0c;今天我要给大家带来的是如何使用Remmina软件在统信UOS/麒麟…

第二百六十五回

文章目录 概念介绍使用方法示例代码 我们在上一章回中介绍了Flutter中如何使用三方包相关的内容&#xff0c;本章回中将介绍Widget的生命周期.闲话休提&#xff0c;让我们一起Talk Flutter吧。 概念介绍 本章回中介绍的生命周期是指Widget从创建到结果的整个过程&#xff0c;这…

12.2内核空间基于SPI总线的OLED驱动

在内核空间编写SPI设备驱动的要点 在SPI总线控制器的设备树节点下增加SPI设备的设备树节点&#xff0c;节点中必须包含 reg 属性、 compatible 属性、 spi-max-frequency 属性&#xff0c; reg 属性用于描述片选索引&#xff0c; compatible属性用于设备和驱动的匹配&#xff…

【数据结构】树和二叉树堆(基本概念介绍)

&#x1f308;个人主页&#xff1a;秦jh__https://blog.csdn.net/qinjh_?spm1010.2135.3001.5343&#x1f525; 系列专栏&#xff1a;《数据结构》https://blog.csdn.net/qinjh_/category_12536791.html?spm1001.2014.3001.5482 ​​ 目录 前言 树的概念 树的常见名词 树与…

linux TIME_WAIT时间变短

在Linux中&#xff0c;TIME_WAIT状态表示TCP连接已经关闭但还未完全清除的过程。默认情况下&#xff0c;TIME_WAIT状态会持续2分钟&#xff08;120秒&#xff09;以确保网络上没有重复的数据包被传输到错误的目标地址。 要将TIME_WAIT时间设置为更短的值&#xff0c;可以通过修…

2024.1.14每日一题

LeetCode 83.删除排序链表中的重复元素 83. 删除排序链表中的重复元素 - 力扣&#xff08;LeetCode&#xff09; 题目描述 给定一个已排序的链表的头 head &#xff0c; 删除所有重复的元素&#xff0c;使每个元素只出现一次 。返回 已排序的链表 。 示例 1&#xff1a; 输…

手把手教你学会接口自动化系列十-将用例写在json中,持久化管理起来上

我们之前写的把url,登录都封装了,但是用例的数据怎么用其他文件管理起来,和代码分离呢?由次,我就行了json进行用例的管理。 从接口的角度我们分析,我们都知道接口请求有以下几方面: url method headers data 由次我将我的用例管理格式设置成下面的 {"url"…

关闭免费版pycharm社区版双击shift时出现的搜索框

Pycharm 在双击 shift 的时候总是弹出搜索框&#xff0c;但作为中国玩家&#xff0c;经常需要双击 shift 循环切换中英文。这就很困恼。 下面就解决这个问题。单独关闭双击shift的功能。 步骤 1.左上角 File -> Settings 2. 如图&#xff0c;输入‘advan’ 找到高级设置&…

基于AidLux的智慧教育版面分析应用

基于AidLux的智慧教育版面分析应用 1. Aidlux平台介绍 融合架构操作系统AidLux,可以为单一ARM设备同时提供Android和Linux运行环境&#xff0c;双系统既能独立使用又能相互通信。 非虚拟机方式实现双系统融合并行 同时拥有两个系统的完整用户体验无需重启即可在两个系统之间…

RibbonGroup 添加QRadioButton

RibbonGroup添加QRadioButton&#xff1a; QRadioButton * pRadio new QRadioButton(tr("Radio")); pRadio->setToolTip(tr("Radio")); groupClipboard->addWidget(pRadio); connect(pRadio, SIGNAL(clicked(…

扩展卡尔曼滤波(Extended Kalman Filter, EKF):理论和应用

扩展卡尔曼滤波&#xff08;Extended Kalman Filter, EKF&#xff09;&#xff1a;理论、公式和应用 引言 卡尔曼滤波是一种广泛应用于估计动态系统状态的技术&#xff0c;但当系统的动态模型或测量模型是非线性的时候&#xff0c;传统的卡尔曼滤波方法就显得无能为力。扩展卡…

Ubuntu中用useradd创建用户后无法用su切换过去

原因&#xff1a; 没有设置密码&#xff0c;没有指定家目录和shell版本&#xff0c;就不能su切换到新用户 解决方法&#xff1a; su - root //切换到root权限 useradd -m -s /bin/bash node1 //-m自动创建home目录&#xff0c;-s指定shell版本 passwd node1 //设置密码 参考链…