当前位置: 首页 > news >正文

顺序表(数据结构初阶)

文章目录

  • 顺序表
    • 一:线性表
      • 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)

结语

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

相关文章:

顺序表(数据结构初阶)

文章目录 顺序表一:线性表1.1概念: 二:顺序表2.1概念与结构:2.2分类:2.2.1静态顺序表2.2.2动态顺序表 2.3动态顺序表的实现声明(初始化)检查空间容量尾插头插尾删头删查找指定位置之前插入数据指…...

AOF和RDB【Redis持久化篇】

文章目录 1.什么是持久化?2.RDB3.AOF 1.什么是持久化? Redis是跑在内存里的,当程序重启或者服务器崩溃,数据就会丢失,如果业务场景希望重启之后数据还在,就需要持久化,即把数据保存到可永久保存…...

数据可视化大屏UI组件库:B端科技感素材PSD

在数据可视化领域,一个出色的大屏UI设计不仅能够准确传达数据背后的信息,更能提升用户的视觉体验。然而,对于UI设计师而言,设计这样一款界面往往面临着寻找合适设计素材的挑战。为了应对这一难题,我们推出了这款数据可…...

【力扣算法】234.回文链表

快慢指针:一个指针走两步,一个指针走一步,当快指针走到链表末尾时,慢指针走到中间位置。 逆转链表:根据指针位置分成两个表,逆转第二个表。 按序判断就可以,如果是相同就是回文,反之…...

MVC流程分析

DisaptcherServlet本质是servlet&#xff0c;执行init()方法&#xff0c;自启动底层执行代码&#xff0c; 作用&#xff1a; 1、读取springmvc配置文件&#xff0c;创建Controller对象&#xff0c;放入容器中&#xff0c;map<"id",对象> 2、接收用户请求&#…...

编程中常见的技术难题有哪些?

技术的未来&#xff1a;如何驾驭变革 引言 在科技迅猛发展的今天&#xff0c;变革已成为常态。你是否感受到这一波潮流的力量&#xff1f;我们正身处一个充满机遇与挑战的时代。诸如人工智能、区块链、云计算等技术如同狂风骤雨&#xff0c;席卷我们的生活与工作方式。那么&a…...

「Mac玩转仓颉内测版50」小学奥数篇13 - 动态规划入门

本篇将通过 Python 和 Cangjie 双语介绍动态规划的基本概念&#xff0c;并解决一个经典问题&#xff1a;斐波那契数列。学生将学习如何使用动态规划优化递归计算&#xff0c;并掌握编程中的重要算法思想。 关键词 小学奥数Python Cangjie动态规划斐波那契数列 一、题目描述 …...

前端退出对话框也就是点击右上角的叉,显示灰色界面,已经解决

文章目录 遇到一个前端bug&#xff0c;点击生成邀请码 打开对话框 然后我再点击叉号&#xff0c;退出对话框&#xff0c;虽然退出了对话框&#xff0c;但是显示灰色界面。如下图&#xff1a; 导致界面就会失效&#xff0c;点击任何地方都没有反应。 发现是如下代码的问题&am…...

使div每次隐藏显示后都从顶部开始

<div ref"addmodel" > <!-- 这里内容很长&#xff0c;超出屏幕。。。 --> </div> methods:{ // 页面显示时滚动至顶部 scrollToTop() { const addmodel this.$refs.addmodel; if (addmodel) { addmodel.scrollTop 0; } }, } 在div每次显示或者…...

资源付费软件开发 资源付费系统源码 资源付费类型小程序APP

应用场景 资源付费软件广泛应用于多个领域&#xff0c;以下是其主要应用场景&#xff1a; 在线教育&#xff1a; 各类教育机构、名师通过资源付费软件提供课程、讲座等学习资源&#xff0c;为学生提供个性化的学习服务。用户可以通过软件学习专业知识、职业技能等&#xff0c…...

文件的读写

所涉及到的函数如下&#xff1a;<stdio.h> 函数介绍网站&#xff1a;cplusplus.com - The C Resources Network 读写文件之前要先打开文件&#xff0c;使用完要关闭文件归返空间&#xff1a; fopen 打开 fclose 关闭 返回的是FILE*型&#xff0c;第一个参数是文…...

城市大脑新型智慧城市数据中台建设方案

建设背景与现状 随着城市化进程的加速&#xff0c;城市数据呈现出爆炸式增长&#xff0c;但数据的整合、共享和利用却面临诸多挑战。信息孤岛、数据冗余、管理分散等问题日益突出&#xff0c;制约了智慧城市的发展。为了解决这些问题&#xff0c;构建城市大脑新型智慧城市数据…...

二三(Node2)、Node.js 模块化、package.json、npm 软件包管理器、nodemon、Express、同源、跨域、CORS

1. Node.js 模块化 1.1 CommonJS 标准 utils.js /*** 目标&#xff1a;基于 CommonJS 标准语法&#xff0c;封装属性和方法并导出*/ const baseURL "http://hmajax.itheima.net"; const getArraySum (arr) > arr.reduce((sum, item) > (sum item), 0);mo…...

【sgFileLink】自定义组件:基于el-link、el-icon标签构建文件超链接组件,支持垃圾桶删除、点击预览视频/音频/图片/PDF格式文件

sgFileLink源代码 <template><div :class"$options.name"><el-link click.stop"clickFile(data)"><img :src"getSrc(data)" /><span>{{ getFileNameAndSize(data) }}</span></el-link><el-linkcl…...

Kafka - 消息乱序问题的常见解决方案和实现

文章目录 概述一、MQ消息乱序问题分析1.1 相同topic内的消息乱序1.2 不同topic的消息乱序 二、解决方案方案一&#xff1a; 顺序消息Kafka1. Kafka 顺序消息的实现1.1 生产者&#xff1a;确保同一业务主键的消息发送到同一个分区1.2 消费者&#xff1a;顺序消费消息 2. Kafka 顺…...

【golang】匿名内部协程,值传递与参数传递

代码例子 下面代码的区别是直接调用循环变量&#xff0c;这里使用的就是这个变量的引用&#xff0c;而不是将参数的副本传递给协程执行 for task : range taskChan {wg.Add(1)go func() {defer wg.Done()task.Do() // 使用外部循环变量}() }func DistributeTasks(taskChan &…...

Jenkins与SonarQube持续集成搭建及坑位详解

Jenkins和SonarQube都是软件开发过程中常用的工具,它们在代码管理、构建、测试和质量管理方面发挥着重要作用。以下是关于Jenkins与SonarQube的作用及整合步骤环境搭建的详细解释: 一、Jenkins与SonarQube的作用 Jenkins: Jenkins是一个开源的持续集成和交付工具,它可以帮…...

.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; …...

购物车案例--分模块存储数据,发送请求数据渲染,底部总计数量和价格

shift鼠标右键&#xff0c;打开powershell&#xff0c;新建项目 自定义 只有一个页面&#xff0c;不涉及路由&#xff0c;勾选vuex,css,babel 无需保存预设 回车项目开始创建 项目用vscode打开 将src里的内容全部清空 将第七天的课程准备代码复制粘贴到src中 刷新页面&…...

PCIe学习笔记

PCIE高速串行数据总线 当拿到一块板子 比如你要用到PCIE 首先要看这块板子的原理图 一般原理图写的是 PCI express 表示PCIE 以下是Netfpga为例下的PCIE插口元件原理图 ![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/01dc604fbdc847e8998a978c83c7b2eb.png 一般主…...

Phi-4-mini-reasoning应用场景:技术文档自动逻辑校验与漏洞推理辅助工具

Phi-4-mini-reasoning应用场景&#xff1a;技术文档自动逻辑校验与漏洞推理辅助工具 1. 模型概述 Phi-4-mini-reasoning是一款由微软开发的3.8B参数轻量级开源模型&#xff0c;专为数学推理、逻辑推导和多步解题等强逻辑任务设计。该模型以"小参数、强推理、长上下文、低…...

高级应用:将Decision Transformer部署到生产环境的完整流程

高级应用&#xff1a;将Decision Transformer部署到生产环境的完整流程 【免费下载链接】decision-transformer Official codebase for Decision Transformer: Reinforcement Learning via Sequence Modeling. 项目地址: https://gitcode.com/gh_mirrors/de/decision-transfo…...

FuelUX日期选择器终极指南:集成Moment.js实现多语言时间处理

FuelUX日期选择器终极指南&#xff1a;集成Moment.js实现多语言时间处理 【免费下载链接】fuelux As of March 2019, this repository is read-only as Salesforce has archived the FuelUX open-source UI framework and will no longer be supported. 项目地址: https://gi…...

OpenClaw压力测试:千问3.5-9B连续执行100个任务的稳定性

OpenClaw压力测试&#xff1a;千问3.5-9B连续执行100个任务的稳定性 1. 为什么需要压力测试&#xff1f; 上周我在本地部署了OpenClaw对接千问3.5-9B模型&#xff0c;准备用它来处理日常的文档整理和会议纪要工作。刚开始几个简单任务执行得很顺利&#xff0c;直到某天晚上让…...

AI 术语通俗词典:矩阵乘法

矩阵乘法是线性代数、数据分析、机器学习和人工智能中非常核心的一个术语。它用来描述两组二维数值结构之间的一种特定运算规则。这个运算结果仍然是一个矩阵&#xff0c;但它并不是简单地把对应位置的元素相乘&#xff0c;而是通过“行与列”的组合来生成新的数值。如果说矩阵…...

OpenClaw自动化周报:Qwen3.5-9B-AWQ-4bit整合截图生成工作总结

OpenClaw自动化周报&#xff1a;Qwen3.5-9B-AWQ-4bit整合截图生成工作总结 1. 为什么需要自动化周报 每周五下午&#xff0c;我的电脑屏幕总会同时开着十几个窗口&#xff1a;项目管理系统截图、代码提交记录、会议纪要文档、临时笔记文件……把这些碎片信息整理成结构化周报…...

002、零基础搭建你的第一个AI开发环境

昨天帮隔壁组实习生看代码&#xff0c;小伙子对着屏幕发愁&#xff1a;“环境都跑不起来&#xff0c;一训练就报cuda版本不匹配。”我凑过去一看&#xff0c;好家伙&#xff0c;系统里装了三个Python版本&#xff0c;conda环境混着pip装&#xff0c;torch版本和cuda差了两位小数…...

Matlab代码源码实现:复杂环境下的非饱和非均质土坡三维稳定性分析极限研究

Matlab代码源码实现&#xff1a;复杂条件下非饱和非均质土坡三维稳定性极限分析MATLAB 代码的功能介绍文章&#xff0c;涵盖了代码的整体目标、结构、功能模块及其在工程与科研中的应用价值。一、项目背景与研究目标 本 MATLAB 程序集旨在实现 复杂条件下非饱和非均质土坡的三维…...

网络协议封神考点:TCP协议是如何保证可靠传输的?原理+流程图+硬核详解

网络协议封神考点&#xff1a;TCP协议是如何保证可靠传输的&#xff1f;原理流程图硬核详解一、前言二、基础定义&#xff1a;什么是TCP可靠传输&#xff1f;三、TCP保证可靠传输的6大核心机制&#xff08;必考&#xff09;3.1 机制1&#xff1a;面向连接&#xff08;三次握手 …...

打造行业大模型更好还是做垂直 Agent 更好

打造行业大模型更好还是做垂直 Agent 更好&#xff1f;从小学生的糖果王国管理谈起&#xff0c;拆解AI落地的终极选择题关键词&#xff1a;行业大模型、垂直 Agent、AI落地、通用 vs 垂直、能力边界、ROI模型、端云协同、大模型Agent架构摘要&#xff1a;这篇文章从「小学生管理…...