空间复杂度动态顺序表

news2024/9/28 20:57:30

目录

1>>闲话

2>>空间复杂度 

3>>顺序表!!(有点难度)

3.1>>静态顺序表

3.2>>动态顺序表

3.2.1>>初始化动态顺序表

3.2.2>>实现尾插

4>>结语


1>>闲话

        感谢大家对小编文章的喜欢,小编会继续加油的,今天来分享空间复杂度和线性表里的顺序表部分内容,今天内容难度有点高,希望大家刚接触的坚持一下!

2>>空间复杂度 

        空间复杂度是对一个算法在运行过程中需要的额外临时开辟的空间。空间复杂度和时间复杂度一样,都是使用大O渐进表示法,

(不知道的参考上一篇文献:链接博主回归!数据结构篇启动-CSDN博客)

因为主要看重时间复杂度,所以空间就不过多介绍了,这边附上一题练习题,一起来看看这题的空间复杂度是多少吧:

这里调用了n次,创建了n个函数栈帧空间,所以空间复杂度为O(N)。

3>>顺序表!!(有点难度)

        刚学大家肯定和我有一样的疑问?这是个啥?其实顺序表是线性表的一种线性表分为顺序表、链表、栈、队列、字符串等等。线性表表示逻辑上是线性结构,物理结构不一定线性,我们通常学的数组就是物理结构连续的,也就是线性的,逻辑结构线性就表示我们想象的它是线性的一条线

接下来让我们来学习顺序表:顺序表是物理地址也是连续的一段线性结构,一般用数组存储表示。那大家又有疑问哩,顺序表和数组有啥区别?顺序表是数组的升级改造版本,实现了增删改查的操作

顺序表又分为静态顺序表和动态顺序表。

3.1>>静态顺序表

        静态顺序表不怎么常用,因为不实用,内存固定,要么设置太大造成空间浪费,要么设置太小造成空间不够,所以我们直接来学习动态。

3.2>>动态顺序表

3.2.1>>初始化动态顺序表

        实现动态顺序表需要三个文件:顺序表头文件、顺序表源文件、测试文件

        这边先附上代码(这里实现了动态顺序表的尾插功能),大家先看(不懂没事,后面一句句介绍):

seqlist.h(顺序表头文件,可以自己取名,这边方便看就取直译英文)

#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
typedef int datetype;//不知道具体类型,可以一下子改

typedef struct seqlist {
	datetype* arr;//(顺序表数组实现增、删、改、查)动态顺序表
	int size;//有效数据
	int capacity;//容量(包含有效和浪费的数据)
}SL;//将struct seqlist 重命名为typedef

void SLset(SL* ps);//初始化声明

void SLpushback(SL* ps, datetype x);//尾插

seqlist.c(顺序表源文件)


#include"seqlist.h"

void SLset(SL* ps) {
	ps->arr = NULL;
	ps->size = ps->capacity = 0;
}

void SLpushback(SL* ps, datetype x) {//x是插入数据
	//情况2:空间不够进行扩容
	assert(ps != NULL);
	if (ps->capacity == ps->size) {
		//空间不足,扩容
		int newcapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;
		datetype* tmp = (datetype*)realloc(ps->arr, newcapacity * sizeof(datetype));
		if (tmp == NULL) {
			perror("realloc fail!");
			exit(1);
		}
		ps->arr = tmp;
		ps->capacity = newcapacity;
	}

	ps->arr[ps->size++] = x;//情况1:空间够直接加
}

test.c(测试源文件)

#include"seqlist.h"

void SLtest() 
{
	SL sl;
	SLset(&sl);//初始化
	SLpushback(&sl, 1);
}
int main() 
{

	SLtest();
	return 0;
}

这边看不懂正常,难度上来了,前期看不懂是小问题滴,现在容许我一句句介绍叭。

首先:要实现动态顺序表,最基础的部分就是结构体的创建

typedef是重命名的意思,第一句表示吧int重命名为datetype,因为如果是char型的话只需要更改这里就好。其他的我已经在注释解释啦~大家康康。还有第二句的typedef是将struct seqlist重命名为SL

其次,创建完顺序表那么就要初始化里面的值,在顺序表头文件进行声明

这里使用结构体指针接收,这样在函数内才能修改到顺序表SL里面的每一项值。接着在顺序表源文件里包含头文件:

创建一个无返回值函数 SLset,通过ps指针接受结构体指针,这样才能修改里面的值,然后将arr设置为空,这样自行拓展方便,接着将有效数和容量设置为0.

接着在测试文件进行操作:

写一个测试函数SLtest,当然在main里直接写也可以(这边考虑文件较大时不好看所以拿一个函数来写里面),创建结构体变量sl,将sl取地址传到初始化函数进行初始化!一定注意传的是地址!

好了至此初始化顺序表结束!

3.2.2>>实现尾插

        尾插顾名思义就是在顺序表尾部进行插入数值,那么就要考虑到两种情况,空间够与不够:

现在头文件声明尾插函数SLpushback,需要有一个结构体指针接收,还要一个传进行来要插入尾部的值。

接着在顺序表源文件实现尾插代码:

情况1:空间够,数组【有效数值】就是需要插入的尾部空间,如:

arr={1,2,3,空},空表示多余空间,那么空下标是3,有效数值有3个,所以数组【有效数值】就是需要插入的尾部空间。

情况2:空间不够,那么就要另外开辟空间,我们一般将原有空间乘2,那什么时候进行扩容呢?再举例子说明,arr={1,2,3},此时有效三个,容量也是3个,那么size等于capacity时进行扩容!

也就是这行代码,还需要判断原本容量是否为0:

这里用三目操作符,如果为0那么就为4,否则就扩大两倍存放到新容量(newcapacity)

接下来就要使用realloc对arr进行扩容,要先判断内存是否有空间,没空间返回值是NULL,所以这里为了防止arr得到一个空值,那么就要不嫌麻烦再创建一个同类型指针接受地址。

这里还需要乘上sizeof(datetype),因为realloc扩容的是字节数,所以要乘上这个类型一个占多少字节

接着为空打印错误信息:

如果不为空那么往下走,让原来的arr接受新的tmp大小,然后容量变为新容量。

这里传一个值

就可以实现最终代码啦,大家可以自己写写调试看看

那么至此!尾插结束!

4>>结语

        总结:这篇讲述了空间复杂度和线性表里的顺序表,主要讲述了动态顺序表的尾插概念!呼~结束了,对于刚接触的我觉得还是有点难度的,不过通过这篇博客加深了印象,不至于一头雾水,也希望这篇博客能帮助到同样一头雾水的你们,感谢观看,期待与你,下篇相见!谢谢大家!

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

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

相关文章

【YOLO目标检测反光衣数据集】共2388张、已标注txt格式、有训练好的yolov5的模型

目录 说明图片示例 说明 数据集格式&#xff1a;YOLO格式 图片数量&#xff1a;2388 标注数量(txt文件个数)&#xff1a;2388 标注类别数&#xff1a;2 标注类别名称&#xff1a;reflective_clothes、other_clothes 数据集下载&#xff1a;反光衣数据集 图片示例 数据…

HJ50-四则运算:栈的运用、中缀表达式转后缀表达式并计算结果

文章目录 题目一、分析1.1表达式预处理1.2中缀表达式转后缀1.3 后缀表达式计算结果 二、答案 题目 一、分析 通过利用栈将中缀表达式转换为后缀表达式&#xff0c;在根据后缀表达式计算运算结果。由于包含负数操作数的情况&#xff0c;并且操作数位数不固定为1&#xff0c;因此…

【算法篇】二叉树类(3)(笔记)

目录 一、Leetcode 题目 1. 二叉树的最近公共祖先 2. 二叉搜索树的最近公共祖先 &#xff08;1&#xff09;递归法 &#xff08;2&#xff09;迭代法 3. 二叉搜索树中的插入操作 &#xff08;1&#xff09;递归法 &#xff08;2&#xff09;迭代法 4. 删除二叉搜索树中…

时间序列LSTM实现

这个代码参考了时间序列预测模型实战案例(三)(LSTM)(Python)(深度学习)时间序列预测(包括运行代码以及代码讲解)_lstm预测模型-CSDN博客 结合我之前所学的lstm-seq2seq里所学习到的知识对其进行预测 import time import numpy as np import pandas as pd import torch import…

革命题材网络电影《突进夹金山》将于10月上线

“长征万里险&#xff0c;最忆夹金山”。这座雪山不仅见证了红军战士们的英勇与牺牲&#xff0c;也成为了中国革命历史上的一座重要里程碑。 革命题材网络电影《突进夹金山》&#xff0c;作为四川省2024年度重点影视剧项目以及纪念红军长征90周年献礼的红色作品&#xff0c;由谢…

死磕P7: JVM类加载那些事儿,一起探知类的前世今生(二)

这是「死磕P7」系列第 006 篇文章&#xff0c;欢迎大家来跟我一起 死磕 100 天&#xff0c;争取在 2025 年来临之际&#xff0c;给自己一个交代。 接上篇&#xff0c;上一篇介绍了 JVM 类加载过程及类的生命周期&#xff0c;回顾一下&#xff1a; 死磕P7: JVM类加载那些事儿&a…

周文强聚焦助学育人,爱心图书室项目圆满完成

日前&#xff0c;一场充满爱心与希望的公益活动在四川甘孜州乡城县尼斯寄宿制小学拉开帷幕。这次名为“520爱心图书室”的公益活动&#xff0c;旨在通过捐赠图书的方式&#xff0c;支持基层青少年的阅读成长。作为此次活动的积极参与者&#xff0c;周文强不仅向学校捐赠了价值1…

python 高效读取多个geojson 写入一个sq3(Sqlite) 、效率提高90%+

1.问题缘由&#xff1a; 由于工作需求&#xff0c;需要将多个&#xff08;总量10G&#xff09;geojson文件写入到sq3库&#xff0c;众所周知&#xff0c;sqlite 不支持多线程写入&#xff0c;那该怎么办呢&#xff0c;在网上也查了很多策略&#xff0c;都没有达到立竿见影的效果…

甄选范文“论分布式存储系统架构设计”,软考高级论文,系统架构设计师论文

论文真题 分布式存储系统(Distributed Storage System)通常将数据分散存储在多台独立的设备上。传统的网络存储系统采用集中的存储服务器存放所有数据,存储服务器成为系统性能的瓶颈,也是可靠性和安全性的焦点,不能满足大规模存储应用的需要。分布式存储系统采用可扩展的…

车辆重识别(去噪扩散概率模型)论文阅读2024/9/27

[2] Denoising Diffusion Probabilistic Models 作者&#xff1a;Jonathan Ho Ajay Jain Pieter Abbeel 单位&#xff1a;加州大学伯克利分校 摘要&#xff1a; 我们提出了高质量的图像合成结果使用扩散概率模型&#xff0c;一类潜变量模型从非平衡热力学的考虑启发。我们的最…

linux驱动设备程序(内核层、应用层)

一、linux驱动程序 1、分类 字符设备&#xff08;驱动&#xff09;、块设备&#xff08;驱动&#xff09;、网络设备&#xff08;驱动&#xff09;。 2、核心 应用程序运行在用户空间&#xff08;3G&#xff09;&#xff1b;<系统调用>——><陷入>——>&…

正则表达式在过滤交换机lldp信息的应用举例

#include <iostream> #include <string> #include <regex> #include <vector> #include <unordered_map> #include <sstream> #include <unistd.h> // For usleep// 假设存在的 LOG_INFO 和 LOG_WARNING 函数 #define LOG_INFO(...)…

17.第二阶段x86游戏实战2-线程发包和明文包

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 本次游戏没法给 内容参考于&#xff1a;微尘网络安全 本人写的内容纯属胡编乱造&#xff0c;全都是合成造假&#xff0c;仅仅只是为了娱乐&#xff0c;请不要…

基于docker-compose部署openvas

目录 0.部署openvas 1.编辑docker-compose文件 2.运行compose 3.访问openvas 4.openvas扫描 5.创建任务 6.点击Task Wizard ​编辑 7.输入通讯的IP地址 8.下载报告 9.下载完成 0.部署openvas 1.编辑docker-compose文件 vim docker-compose.yaml version: 3service…

《论文阅读》 用于产生移情反应的迭代联想记忆模型 ACL2024

《论文阅读》 用于产生移情反应的迭代联想记忆模型 ACL2024 前言简介任务定义模型架构Encoding Dialogue InformationCapturing Associated InformationPredicting Emotion and Generating Response损失函数问题前言 亲身阅读感受分享,细节画图解释,再也不用担心看不懂论文啦…

通信工程学习:什么是MAI多址干扰

MAI:多址干扰 MAI多址干扰(Multiple Access Interference)是无线通信领域,特别是在码分多址(CDMA)系统中,一个关键的干扰现象。以下是对MAI多址干扰的详细解释: 一、定义 多址干扰是指在CDMA系统中,由于多个用户的信号在时域和频域上是混叠的,从而导…

区块链可投会议CCF C--FC 2025 截止10.8 附录用率

Conference&#xff1a;Financial Cryptography and Data Security (FC) CCF level&#xff1a;CCF C Categories&#xff1a;network and information security Year&#xff1a;2025 Conference time&#xff1a;14–18 April 2025, Miyakojima, Japan 录用率&#xff1…

阿里云oss配置

阿里云oss配置 我们可以使用阿里云的对象存储服务来存储图片&#xff0c;首先我们要注册阿里云的账号登录后可以免费试用OSS服务。 之后我们打开控制台&#xff0c;选择对象存储服务&#xff0c;就看到我们下面的画面&#xff1a; 我们点击创建Bucket,之后就会出现如下图界面…

退出系统接口代码开发

退出系统不需要传入参数 请求过滤404的错误--请求次数监听这些都不需要更改 从controller层开始开发代码&#xff0c;因为每个接口都需要增加接口防刷拦截&#xff0c;不然会恶意攻击&#xff0c;所以在这里增加退出系统接口防刷拦截&#xff1b;并退出系统接口没有header和t…

图像分割(九)—— Mask Transfiner for High-Quality Instance Segmentation

Mask Transfiner for High-Quality Instance Segmentation Abstract1. Intrudouction3. Mask Transfiner3.1. Incoherent Regions3.2. Quadtree for Mask RefinementDetection of Incoherent Regions四叉树的定义与构建四叉树的细化四叉树的传播 3.3. Mask Transfiner Architec…