数据结构之时间复杂度和空间复杂度

目录

 一.什么是数据结构?

二.什么是算法?

三.算法效率

1.如何衡量算法的好坏

2.算法的复杂度

四.时间复杂度

1.时间复杂度的概念

2.例题展示

五.空间复杂度

1.概念

2.注意事项

空间的销毁===>归还对空间的使用权内存空间属于操作系统的进程

3.类比理解

4.例题分析

六.小结


好久不见,uu们。沉淀了一个寒假,想必大家的水平一定突飞猛进了吧~

今天为大家呈现上的是数据结构的知识,一些关于时间复杂度和空间复杂度的理解。

规矩不乱,先赞后看~

 一.什么是数据结构?

数据结构是计算机存储,组织数据的方式,之相互之间存在一种或多种特定关系的数据元素的集合,即在内存中管理数据(包括增删查改)

二.什么是算法?

算法是定义良好的计算过程,它取一个或一组值为输入,并产生出一个或一组值作为输出。简单来说算法就是一系列计算步骤,用来将输入数据转化为输出结果。

三.算法效率

1.如何衡量算法的好坏

怎么衡量算法的好坏呢?

比如对于斐波那契数列:

 其递归实现方式非常简洁,但简洁就一定好吗?那如何来衡量好与坏呢?

2.算法的复杂度

算法在编写成可执行程序后,运行时需要耗费时间资源和空间(内存)资源。依次衡量一个算法的好坏,一般是从时间和空间两个维度来衡量,即时间和空间复杂度

时间复杂度主要是衡量算法运算的快慢,空间复杂度则是衡量一个算法运行所需的额外空间。在计算机发展的早期,计算机容量小,所有对空间复杂度很在乎,但经过计算机行业的发展,存储容量达到很高,故不再关心算法的空间复杂度
 

四.时间复杂度

1.时间复杂度的概念

时间复杂度的定义:再计算机科学中,算法的时间复杂度是一个函数(数学函数,不是c语言中的函数),它定量描述了该算法的运行时间,一个算法所耗费的时间,从理论上讲,是算不出来的,只有你把你的程序放在机器上跑起来,才知道。一个算法所花费的时间与其执行次数成正比
!!!算法的基本操作的执行次数,为算法的时间复杂度!!!

即:找到某条基本语句与问题规模N之间的数学表达式,就是算出该算法的时间复杂度!!!
 

但是

实际计算时间复杂度时,不一定精确执行次数,大概的就行---->** 大o的渐进表示法 **
    O(N*N)===》表示估算
大O符号:适用于描述函数渐进行为的数学符号
推导大O阶的方法:
1.用常数1取代运行时间中所有的加法常数(O(1)不是代表一次,而是代表常数次(常数再大也是O(1)cpu运转很快,都是平等的被看作常数次))
2.在修改后的运行次数函数中,只保留最高阶项
3.如果最高阶项存在且不为1,即无限大的时候,则去除与这个项目相乘的常数,得到结果就为大O阶

另外还有些算法的时间复杂度存在最好,最坏,平均的情况
  最坏:任意输入规模的最大运行次数(上界)
  平均:任意输入规模的期望运行次数
  最好:任意输入规模的最小运行次数(下界)
        eg.再一个长度为N的数组中搜索一个数据x
           最好情况:1次找到
           最坏情况:N次找到
           平均情况:N/2次找到
    在实际中一般情况关注的是算法的最坏情况,所有数组中搜索数据时间复杂度为O(N)
 

2.例题展示

(1)

要计算这个程序的时间复杂度

F(N) = N * N + 2 * N + 10(实际计算没必要那么精确,只需要大概的执行次数----》大o的渐进表示法)
使用大O阶的渐进表示法后,func1的时间复杂度为:O(N*N)

(2)

计算该程序的时间复杂度

O(M+N) (两者大小关系不确定,因此需要两个同时才能确定时间复杂度)

(3)

时间复杂度为O(1)

O(1)不是代表一次,而是代表常数次

(4)

时间复杂度为O(N)

因为当N无限大的时候,倍数也可以忽略不计

(5)

时间复杂度为O(N)===>做最坏的打算,降低预期,底线思维!!!

(6)

冒泡排序的时间复杂度:O(N) = N * (N - 1)/ 2 = O(N*N)
N-1 N-2 N-3 N-4.。。。  3 2 1(等差数列)

(7)

二分查找的时间复杂度:O(logN)因为找一次就要分走一半,找x次就除x个2^x = N ---> x = logN

(8)

时间复杂度为O(N)递归N次(涉及函数栈帧的知识)

五.空间复杂度

1.概念

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

空间复杂度不是程序占用了多少bytes的空间,因为这没有太大意义,所以空间复杂度算的是
变量的个数。

空间复杂度计算规则基本上和时间复杂度类似,也是用大O渐进表示法

!!!注意!!!:函数运行时所需要的栈空间(存储参数,局部变量,一些寄存器信息等)
在编译期间已经确定好了,因此空间复杂度主要是通过函数在运行时显示申请的额外空间来确定。

2.注意事项

空间的销毁===>归还对空间的使用权
内存空间属于操作系统的进程

3.类比理解

分配内存===>去酒店开房间(这时别人不能住)
销毁内存===>退房(退房后别人还能住)
进程==>酒店
空间==>酒店的房间

越界和野指针的本质:访问了不属于自己的内存(住别人的房间)

4.例题分析

(1)

计算BubbleSort的空间复杂度:O(1)<因为没有额外开辟临时的空间>

(2)

计算斐波那契数列的空间复杂度:O(N)<存在malloc开辟n的空间>

(3)

计算阶乘递归fac的空间复杂度:O(N)   递归存在函数栈帧从fac(N)到fac(1)N个空间

(4)

fib的空间复杂度:O(N) ==> 尽管是有两个函数相加,但却会从一个函数的栈帧进去,一直
往下走,直到到底之后才逐个释放,释放完之后另一个函数再重复使用上一次递归函数的空间,
故为O(N) 
总结为:!!!递归看深度!!!

(5)

涉及函数栈帧的知识:
func1和func2的结果一定是相同的,因为在func1开辟和结束之后会归还原空间的使用权,
进行到func2时会将使用权给func2,故使用同一块地址

另外一个程序中存在两个a但不会报错:在不同的函数栈帧里面,因此不会出错

六.小结

看懂了这篇博文,uu们就大概掌握了时空建复杂度六成的功力,还剩四成就得自行摸索了。

总之,每天进步,时刻学习!

撤退~

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

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

相关文章

简析:老阳分享的视频号带货蓝海项目前景如何?

随着社交媒体的快速发展&#xff0c;视频号带货已经成为电商领域的一大热点。近期&#xff0c;知名网红老阳分享了自己的视频号带货项目&#xff0c;引发了广泛关注。本文将从视频号前景、注意事项等方面&#xff0c;分析老阳分享的视频号带货项目前景如何。 首先&#xff0c;从…

二百二十八、Hive——HQL报错:删除HDFS中的Hive数据文件导致Xshell连接MySQL异常和HQL查询异常

一、目的 在删除HDFS中Hive目录下的数据文件后&#xff0c;导致HQL查询异常&#xff0c;以及XShell连接MySQL出现异常 二、问题 &#xff08;一&#xff09;HQL查询问题 SQL语句在增加group by之后查询无数据&#xff0c;没有group by则查询有数据 而且SQL语句无法动态加载…

【unity小技巧】Unity人物衣服布料系统的探究 —— Cloth组件

文章目录 一、Cloth组件解释基本介绍出于性能的考虑, 可以对Cloth产生影响的Collider只有两种打开编辑模式绘制 二、基本使用1. 创建出一个空物体2. 在空物体上添加cloth组件&#xff0c;可以直接点击Add Component搜索cloth添加&#xff0c;也可以在工具栏 Component–>phy…

STM32CubeMX学习笔记14 ---SPI总线

1. 简介 1.1 SPI总线介绍 SPI 是英语Serial Peripheral interface的缩写&#xff0c;顾名思义就是串行外围设备接口。是Motorola(摩托罗拉)首先在其MC68HCXX系列处理器上定义的。 SPI&#xff0c;是一种高速的&#xff0c;全双工&#xff0c;同步的通信总线&#xff0c;并且在…

使用Java生成JWT(JSON Web Token)的详细指南

介绍 在现代应用程序中&#xff0c;身份验证和授权是至关重要的。JSON Web Token&#xff08;JWT&#xff09;是一种开放标准&#xff08;RFC 7519&#xff09;&#xff0c;它定义了一种紧凑且自包含的方式用于在各方之间安全地传输信息。在本文中&#xff0c;我们将学习如何使…

在高并发、高性能、高可用 三高项目中如何设计适合实际业务场景的分布式id(一)

分布式ID组件&#xff1a;黄金链路上的关键基石 在现代分布式系统中&#xff0c;分布式ID组件无疑扮演着至关重要的角色。作为整个系统的黄金链路上的关键组件&#xff0c;它的稳定性和可靠性直接关乎到整个系统的正常运作。一旦分布式ID组件出现问题&#xff0c;黄金链路上的…

Windows下 OracleXE_21 数据库的下载与安装

Oracle 数据库的下载与安装 数据库安装包下载数据库安装访问数据库进行测试Navicat连接数据库 1. 数据库安装包的下载 1.1 下载地址 Oracle Database Express Edition | Oracle 中国 1.2 点击“下载 Oracle Database XE”按钮&#xff0c;进去到下载页面&#xff08;选择对…

微服务系列(一)springcloudAlibaba之Nacos注册和配置中心及openFeign远程调用

一&#xff0c;认识微服务 我们先看看开发大型项目采用单体架构存在哪些问题&#xff0c;而微服务架构又是如何解决这些问题的。 1.1 单体架构 单体架构&#xff08;monolithic structure&#xff09;&#xff1a;整个项目中所有功能模块都在一个工程中开发&#xff1b;项目部署…

vue3+ts项目创建 使用npm create vue@latest

npm create vuelatest相关创建代码&#xff1a;

Day30-Linux基础阶段总复习

Day30-Linux基础阶段总复习 1. 运维人员的三个核心职责&#xff08;了解&#xff09;2. 企业网站和应用的可用性的衡量标准&#xff08;重点&#xff09;2.1 高并发企业业务写入流程图2.2 中小型企业案例 3. Linux系统诞生发展过程中的关键代表人物4. 企业场景如何针对不同的业…

NetApp数据恢复—NetApp存储中划分的卷丢失如何恢复数据?

NetApp存储数据恢复环境&#xff1a; 北京某公司的一台NetApp某型号存储&#xff0c;通过96块磁盘组建了两组存储池&#xff0c;这2组存储池互为镜像。存储池内划分卷并映射到ESXI作为数据存储使用&#xff0c;卷内有几百台虚拟机。 NetApp存储故障&#xff1a; 操作过程中由于…

从 Language Model 到 Chat Application:对话接口的设计与实现

作者&#xff1a;网隐 RTP-LLM 是阿里巴巴大模型预测团队开发的大模型推理加速引擎&#xff0c;作为一个高性能的大模型推理解决方案&#xff0c;它已被广泛应用于阿里内部。本文从对话接口的设计出发&#xff0c;介绍了业界常见方案&#xff0c;并分享了 RTP-LLM 团队在此场景…