学习数据结构(2)空间复杂度+顺序表

1.空间复杂度

(1)概念

空间复杂度也是一个数学表达式,表示一个算法在运行过程中根据算法的需要额外临时开辟的空间。 空间复杂度不是指程序占用了多少bytes的空间,因为常规情况每个对象大小差异不会很大,所以空间复杂度算的是变量的个数。 空间复杂度的计算规则基本和时间复杂度类似,也使用大O渐进表示法

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

(2)示例

例1:计算BubbleSort的空间复杂度

函数栈帧在编译时已经确定了,只需要关注函数在运行时额外申请的空间,有size_t end、size_t i、int exchange 三个额外创建的变量,F(N)=3,故空间复杂度为O(1)

例2:计算Fac的空间复杂度

递归算法的空间复杂度=单次递归的空间复杂度*递归次数,每调用一次递归函数开辟一个函数栈帧,这里调用了N次,空间复杂度为O(N)

2.常见复杂度对比

(这是作者在百度上找的图)

3.关于复杂度的算法题

提交代码1(循环k次,每一次先保存数组最后一位元素,循环将数组前numsSize-1个元素向后移动一位,将最后一位元素值赋给数组第一个元素):

分析可知,这段代码的时间复杂度为O(N^2),空间复杂度为O(N),代码效率不高

提交代码2(创建一个新数组,将原数组中后k个元素移到新数组的前k位,将元素组中的前numSize-k个元素移到新数组的后numSize-k位,再将新数组的每一位对应赋给原数组的每一位):

分析可知,这段代码的时间复杂度为O(N),空间复杂度为O(N),相对代码1效率提高了

提交代码3(编写一个逆置函数,将数组前numSize-k个元素逆置,再将数组后k个元素逆置,最后将数组整体逆置):

分析可知,这段代码的时间复杂度为O(N),空间复杂度为O(1)

4.线性表

线性表是n个具有相同特性的数据元素的有限序列,常见的线性表:顺序表、链表、栈、队列、字符串...

线性表在逻辑上是线性结构,在物理上通常以数组和链式结构的形式存储

5.顺序表

(1)概念

顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储,顺序表的底层结构是数组,对数组的封装,实现了常用的增删改查等接口

(2)静态顺序表和动态顺序表

静态顺序表:使用定长数组储存元素

cpp 复制代码
typedef int SLDataType;
#define N 7;
typedef struct Seqlist
{
  SLDataType a[N];//定长数组
  int size;//有效数据个数
}SL;

或另写一行代码重命名:

cpp 复制代码
typedef int SLDataType;
#define N 7;
struct Seqlist
{
  SLDataType a[N];//定长数组
  int size;//有效数据个数
};
typedef struct SeqList SL;

动态顺序表:创建指针变量,按需申请内存

cpp 复制代码
typedef int SLDataType;
typedef struct Seqlist
{
  SLDataType* a;
  int size;//有效数据个数
  int capacity;//空间容量
}SL;
相关推荐
撩得Android一次心动4 小时前
Jetpack Compose 知识点整理2【个人用】
android·笔记·学习·kotlin·compose
quaer5 小时前
弗洛伊德算法--判圈法寻找环的入口O(n) O(1)
数据结构·算法
dadaobusi5 小时前
学习:灵犀指令集
学习
xhyu616 小时前
【学习笔记】图像质量评估方法 (5.生成图像是否符合用户要求)
笔记·学习·计算机视觉
卿卿的产品经理日记8 小时前
【AI产品经理实战】Day 38|try-except 踩坑实录:报错是数据
人工智能·笔记·python·学习·产品经理
keyipatience8 小时前
TypeScript学习(1)
前端·javascript·学习·typescript·html·css3
xys_6789 小时前
深挖数据结构:树和二叉树(上)
数据结构·算法
BeiGuTing_code9 小时前
Java动态数组(一)
java·数据结构·windows
lazy H9 小时前
【计算机网络】第 2 篇:一条数据如何穿过网络?彻底理解数据封装与解封装
网络·经验分享·后端·学习·计算机网络
我命由我123459 小时前
软件工程概念 - 可插拔性
java·后端·学习·java-ee·系统架构·软件工程·学习方法