顺序表(数据结构初阶)

文章目录

  • 顺序表
    • 一:线性表
      • 1.1概念:
    • 二:顺序表
      • 2.1概念与结构:
      • 2.2分类:
        • 2.2.1静态顺序表
        • 2.2.2动态顺序表
      • 2.3动态顺序表的实现
        • 声明(初始化)
        • 检查空间容量
        • 尾插
        • 头插
        • 尾删
        • 头删
        • 查找
        • 指定位置之前插入数据
        • 指定位置之后插入数据
        • 销毁
      • 2.4顺序表算法题
        • 2.4.1移除元素
        • 2.4.2删除有序数组中的重复项
        • 2.4.3合并两个有序数组
      • 2.5顺序表的问题与思考
  • 结语

欢迎大家来到我的博客,给生活来点impetus
在这里插入图片描述
今天我们主要学习顺序表(数据结构初阶)

顺序表

一:线性表

1.1概念:

线性表(linear list)是n个具有相同特性的数据元素的有限序列。线性表是⼀种在实际中⼴泛使⽤的数据结构,常⻅的线性表:顺序表、链表、栈、队列、字符串…
线性表在逻辑上是线性结构,也就说是连续的⼀条直线。但是在物理结构上并不⼀定是连续的,线性表在物理上存储时,通常以数组链式结构的形式存储。

理解:
相同特性:分为物理结构逻辑结构,物理结构指数据元素在计算机存储器中的存储方式。它主要包括顺序存储结构(底层逻辑是数组)和链式存储结构。理解链式结构具体可参考单链表(SList)
逻辑结构指用户角度看到的数据结构,与数据的存储无关,带主观因素.

二:顺序表

2.1概念与结构:

概念:顺序表是⽤⼀段物理地址连续的存储单元依次存储数据元素的线性结构,⼀般情况下采⽤数组存储

从定义我们可以明白:
1:顺序表在物理结构和逻辑结构上都是连续的
2:顺序表的底层逻辑就是数组
.

那么数组与顺序表的区别体现在哪里呢?
顺序表的底层结构是数组,对数组的封装,实现了常⽤的增删改查等接⼝
看下方的图解你就明白了:
在这里插入图片描述
这样是不是就能够清晰的明白数组与顺序表的区别了。

2.2分类:

2.2.1静态顺序表

概念:使用定长数组存储元素
来看一下基本代码:在这里插入图片描述

静态顺序表缺点:,空间不灵活。空间给少了不够用,给多了空间浪费
结论:只有知道了总共的数据大小后,才可能会使用静态顺序表。

2.2.2动态顺序表

概念:使用了变长数组来存储元素。
来看一下基本代码:
在这里插入图片描述

1:下方int不使用typedef定义后的名字是因为有效数据和空间容量只可能是整数
2:在绝大多数的情况下,动态顺序表比静态顺序表要更好

2.3动态顺序表的实现

在这里,我们将会实现在顺序表中将实现声明(初始化),检查空间容量,申请空间,销毁空间,尾插,头插,尾删,头删,查找,指定位置之前插入数据,指定位置之后插入数据

声明(初始化)

在这里插入图片描述

检查空间容量

扩容?那么究竟按照几倍来扩容呢?
结论:按照两倍来扩容。当按照很低倍数扩容:编译器频繁的寻找新空间,拷贝旧空间,释放旧空间,使得编译效率大大减低,当按照很高倍数扩容,容易造成空间的浪费
使用二倍扩容,利用数学概率论的知识,能够更好的描述数据个数的变化趋势,这里仅做了解,知道结论就好。

来看一下这部分的代码:
在这里插入图片描述

在这里容易犯错的几个点
1:malloc创建空间的大小单位是字节,所以要利用sizeof计算动态结构体的大小。
2:创建空间要使用判断语句判断是否开辟成功
3:要在函数中完成对实参的修改需要传地址
4:考虑特殊情况,如这里的初始值都为0的情况。

最后,只要是数据的插入(增加)都需要事先判断空间是否需要扩容(追加)

尾插

代码如下:
在这里插入图片描述

以下对数据进行操作都需要断言传过来的指针是否为空指针

头插

来看代码:
在这里插入图片描述

总结:时间复杂度:o(n),相较于链表中的头插,该处时间复杂度还是较高,效率还是较低。

尾删

代码如下:
在这里插入图片描述

总结
1:删除必须断言是否有元素
2:利用size(有效数据个数)对尾删进行操作

头删

在这里插入图片描述

这里的细节仍然是断言

查找

在这里插入图片描述

指定位置之前插入数据

在这里插入图片描述

这里需要注意判断pos(插入的位置是否是正确的)

指定位置之后插入数据

在这里插入图片描述

与上一个操作的区别在于:pos是否需要移动

销毁

在这里插入图片描述
到这里,我们对顺序表中的数据进行基本的增删查改操作就有一定的认识了。
下面我们来刷几道题来巩固一下吧!!!

2.4顺序表算法题

2.4.1移除元素

https://leetcode.cn/problems/remove-element/description/
说明一下思路:

方法一:
1. 从前往后遍历nums,找到val第一次出现的位置
2. 将val之后的所有元素整体往前搬移,即删除该val
3. nums中有效元素个数减少一个
循环进行上述操作,直到nums中所有值为val的元素全部删除完
时间复杂度:O(N^2) 空间复杂度:O(1)

方法二:
1. 创建一个长度与nums相同的数组temp
2. 遍历nums,将nums中所有与val不同的元素搬移到temp中
3. 将temp中所有元素拷贝回nums中
时间复杂度: O(N) 空间复杂度: O(N)
优化:
因为题目说了,数组中元素个数最大为100,所以不用动态申请,至二级创建100个元素数组即可

方法三:
解题思路:
1. 设置一个变量count,用来记录nums中值等于val的元素的个数
2. 遍历nums数组,对于每个元素进行如下操作:
a. 如果num[i]等于val,说明值为val的元素出现了一次,count++
b. 如果nums[i]不等于元素,将nums[i]往前搬移count个位置
因为nums[i]元素之前出现过count个值等于val的元素,已经被删除了
因此次数需要将nums[i]往前搬移
3. 返回删除之后新数组中有效元素个数
时间复杂度:O(N) 空间复杂度:O(1)

2.4.2删除有序数组中的重复项

https://leetcode.cn/problems/remove-duplicates-from-sorted-array/description/
说明一下思路:

方法一:
1. 设置一个计数,记录从前往后遍历时遇到的不同元素的个数
由于不同的元素需要往前搬移,那count-1就是前面不同元素
搬移之后,最后一个元素的位置,下一次在遇到不同元素就应该
搬移到count位置
2. 遍历数组,如果nums[i]与nums[count-1]不等,就将nums[i]搬移
到nums[count]位置,不同元素多了一个,给count++
3. 循环结束后,返回count

2.4.3合并两个有序数组

https://leetcode.cn/problems/merge-sorted-array/description/
说明一下思路:

方法一:
解题思路:
1. 从后往前遍历数组,将nums1和nums2中的元素逐个比较
将较大的元素往nums1末尾进行搬移
2. 第一步结束后,nums2中可能会有数据没有搬移完,将nums2中剩余的元素逐个搬移到nums1
时间复杂度:O(m+n)空间复杂度: O(1)

2.5顺序表的问题与思考

中间/头部的插⼊删除,时间复杂度为O(N)
• 增容需要申请新空间拷⻉数据释放旧空间。会有不⼩的消耗。
• 增容⼀般是呈2倍的增⻓,势必会有⼀定的空间浪费。例如当前容量为100,满了以后增容到200,我们再继续插⼊了5个数据,后⾯没有数据插⼊了,那么就浪费了95个数据空间。

思考:如何解决以上问题呢?
接下来请移步单链表,进行单链表的学习,让我们对于上述问题提供解决方案。
单链表(SList)

结语

穷且益坚,不坠青云之志
在这个充满诱惑的年代,希望读者能够坚定本心矢志不渝
高中第一个我的恩施才哥跟我说过:在这里插入图片描述
加油!!!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

活动报名:Voice Agent 开发者分享会丨RTE Meetup

引入 voice agent 的口语学习应用 Speak 估值已达 10 亿美元 Voice Agent 开发者分享会 一同探索语音驱动的下一代人机交互界面,一场 voice agent builder 的小规模深度交流会。 RTE Meetup 迎来第六期!12 月 15 日(周日)上午&…

STM32 CubeMx HAL库 独立看门狗IWDG配置使用

看门狗这里我就不多介绍了,能搜到这篇文章说明你了解 总之就是一个单片机重启程序,设定好超时时间,在超时时间内没有喂狗,单片机就会复位 主要应用在单片机异常重启方面,比如程序跑飞(注意程序跑飞时你就…

pdb调试器详解

文章目录 1. 启动 pdb 调试器1.1 在代码中插入断点1.2 使用命令行直接调试脚本 2. 常用调试命令2.1 基本命令2.2 高级命令2.3 断点操作 3. 调试过程示例4. 调试技巧4.1 条件断点4.2 自动启用调试4.2.1 运行程序时指定 -m pdb4.2.2在代码中启用 pdb.post_mortem4.2.3 使用 sys.e…

(转,自阅,侵删)【LaTeX学习笔记】一文入门LaTeX(超详细)

【LaTeX学习笔记】一文入门LaTeX(超详细)-阿里云开发者社区LaTeX中主要分为导言区和正文区导言区通常用于定义文档的格式、语言等(全局设置)。常用的LaTex命令主要有\documentclass,\usepackage等。下面分别对几个常用…

MongoDB-ObjectID 生成器

前言 MongoDB中一个非常关键的概念就是 ObjectID,它是 MongoDB 中每个文档的默认唯一标识符。了解 ObjectID 的生成机制不仅有助于开发人员优化数据库性能,还能帮助更好地理解 MongoDB 的设计理念。 什么是 MongoDB ObjectID? 在 MongoDB …

MFC学习笔记专栏开篇语

MFC,是一个英文简写,全称为 Microsoft Foundation Class Library,中文翻译为微软基础类库。它是微软开发的一套C类库,是面向对象的函数库。 微软开发它,是为了给程序员提供方便,减少程序员的工作量。如果没…

GPTcelltype——scRNA-seq注释

#安装包 install.packages("openai") remotes::install_github("Winnie09/GPTCelltype") #填写API Sys.setenv(OPENAI_API_KEY your_openai_API_key) #加载包 #Load packages library(GPTCelltype) library(openai) #准备文件 #Assume you have already r…

WebRTC服务质量(03)- RTCP协议

一、前言: RTCP(RTP Control Protocol)是一种控制协议,与RTP(Real-time Transport Protocol)一起用于实时通信中的控制和反馈。RTCP负责监控和调节实时媒体流。通过不断交换RTCP信息,WebRTC应用…

用户认证系统登录界面

下面是使用HTML和JavaScript实现的一个中文版登录界面&#xff0c;包含登录、注册和修改密码功能。注册成功后会显示提示信息&#xff0c;在登录成功后进入一个大大的欢迎页面。 1.代码展示 <!DOCTYPE html> <html lang"zh-CN"> <head><meta …

uniapp中vuex(全局共享)的应用

一、Vuex概述 1.1 官方解释 Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。 它采用集中式存储管理 应用的所有组件的状态&#xff0c;并以相应的规则保证状态以一种可预测的方式发生变化 - Vuex 也集成到 Vue 的官方调试工具 devtools extension&#xff0c;提供了诸…

不能通过 ip 直接访问 共享盘 解决方法

from base_config.config import OpenSMB, SMB import os, time, calendar, requests, decimal, platform, fs.smbfsinfo_dict SMB.EPDI_dict info_dict[host] (FS03,10.6.12.182) info_dict[direct_tcp] True# smb OpenSMB(info_dict)print(ok)# 根据 ip 查询电脑名 impor…

JavaEE初阶——多线程(线程安全-锁)

复习上节内容&#xff08;部分-掌握程度不够的&#xff09; 加锁&#xff0c;解决线程安全问题。 synchronized关键字&#xff0c;对锁对象进行加锁。 锁对象&#xff0c;可以是随便一个Object对象&#xff08;或者其子类的对象&#xff09;&#xff0c;需要关注的是&#xff…

day2 数据结构 结构体的应用

思维导图 小练习&#xff1a; 定义一个数组&#xff0c;用来存放从终端输入的5个学生的信息【学生的信息包含学生的姓名、年纪、性别、成绩】 1>封装函数 录入5个学生信息 2>封装函数 显示学生信息 3>封装函数 删除第几个学生信息&#xff0c;删除后调用显示学…

五、网络层:控制平面,《计算机网络(自顶向下方法 第7版,James F.Kurose,Keith W.Ross)》

目录 一、导论 二、路由选择算法 2.1 路由&#xff08;route&#xff09;的概念 2.2 网络的图抽象 2.2.1 边和路由的代价 2.2.2 最优化原则 2.3 路由的原则 2.4 路由选择算法的分类 2.5 link state 算法 2.5.1 LS路由工作过程 2.5.2 链路状态路由选择&#xff08;lin…

内网是如何访问到互联网(H3C源NAT)

H3C设备NAPT配置 直接打开29篇的拓扑&#xff0c;之前都配置好了 「模拟器、工具合集」复制整段内容 链接&#xff1a;https://docs.qq.com/sheet/DV0xxTmFDRFVoY1dQ?tab7ulgil 现在是出口路由器可以直接访问61.128.1.1&#xff0c;下面的终端访问不了&#xff0c;需要做NAPT源…

生产者-消费者模型

目录 生产者-消费者模型介绍 生产者-消费者模型优点 生产者-消费者之间的关系 基于阻塞队列实现生产者-消费者模型 基于环形队列实现生产者-消费者模型 生产者-消费者模型介绍 ● 计算机中的生产者和消费者本质都是线程/进程 ● 生产者和消费者不直接通讯&#xff0c;而是…

.NET6 WebAPI从基础到进阶--朝夕教育

1、环境准备 1. Visual Studio 2022 2. .NET6 平台支持 3. Internet Information Services 服务器&#xff08; IIS &#xff09; 4. Linux 服务器 【 CentOS 系统】 ( 跨平台部署使用 ) 5. Linux 服务器下的 Docker 容器&#xff08; Docker 部署使用&#xff09; …

Linux系统中进程的概念 -- 冯诺依曼体系结构,操作系统,进程概念,查看进程,进程状态,僵尸进程,孤儿进程,进程优先级,进程切换,进程调度

目录 1. 冯诺依曼体系结构 2. 操作系统(Operator System) 2.1 操作系统的概念 2.2 设计操作系统(OS)的目的 2.3 系统调用和库函数概念 3. 进程 3.1 进程的基本概念与基本操作 3.1.1 进程的基本概念 3.1.2 PCB -- 描述进程 3.1.3 task_ struct 3.1.4 查看进程 3.1.5…

4.redis通用命令

文章目录 1.使用官网文档2.redis通用命令2.1set2.2get2.3.redis全局命令2.3.1 keys 2.4 exists2.5 del(delete)2.6 expire - (失效时间)2.7 ttl - 过期时间2.7.1 redis中key的过期策略2.7.2redis定时器的实现原理 2.8 type2.9 object 3.生产环境4.常用的数据结构4.1认识数据类型…

Web项目图片视频加载缓慢/首屏加载白屏

Web项目图片视频加载缓慢/首屏加载白屏 文章目录 Web项目图片视频加载缓慢/首屏加载白屏一、原因二、 解决方案2.1、 图片和视频的优化2.1.1、压缩图片或视频2.1.2、 选择合适的图片或视频格式2.1.3、 使用图片或视频 CDN 加速2.1.4、Nginx中开启gzip 三、压缩工具推荐 一、原因…