数据结构:线性表的顺序表示和实现

news2024/12/23 13:43:29

在实际应用程序中涉及的线性表的基本操作都需要针对线性表的具体存储结构加以实现。线性表可以有两种存储表示方法:顺序存储表示和链式存储表示。下面我们先说说顺序存储表示。

1、顺序表——线性表的顺序存储表示

在计算机中表示线性表的最简单的方法是用一组地址连续的存储单元依次存储线性表的数据元素。换句话说,将线性表中的数据元素一个挨着一个地存放在某个存储区域中称线性表的这种存储方式为线性表的顺序存储表示。相应地,把采用这种存储结构的线性表称为顺序线性表,简称顺序表

由于程序设计语言中的一维数组在内存中占据的也是一个地址连续的存储区域,因此可以用一维数组来描述顺序表中数据元素的存储区域。同时,由于线性表的长度可变。因此在顺序表的结构定义中,还需要设立一个表示线性表当前长度的域,并且因为线性表所需容量随问题不同而异,则还应该考虑数组容量可以进行动态扩充

在这里插入图片描述
在这里插入图片描述

2、顺序表中基本操作的实现

容易看出,当线性表以上述定义的顺序表表示时,某些操作很容易实现。例如求线性表的长度和取得线性表中第i个数据元素等,因为线性表的长度是顺序表的一个“属性”,又第i个数据元素即为数组中第 i-1 个分量的值。因此,我们只讨论顺序表的其他几个主要操作的实现算法。

1.初始化操作

即构造一个空的顺序表。首先要按需为其动态分配一个存储区域,然后设其当前长度为 0。动态分配线性表的存储区域可以更有效地利用系统的资源,当不需要该线性表时可以使用销毁操作及时释放掉占用的存储空间。顺序表允许的最大容量maxsize 和需要扩容时的增量 incresize 大小可由用户设定,也可以不设定而采用系统规定的“默认值”。具体程序如下所示:

在这里插入图片描述

2.查找元素操作

要在顺序表 L 中查找其值与给定值 e 相等的数据元素,最简单的方法是,从第一个元素起,依次和 e 相比较,直至找到一个其值与 e 相等的数据元素,则返回它在线性表中的“位序”;或者查遍整个顺序表都没有找到其值和 相等的元素后返回“0”。在描述查找过程的程序中,设置了一个指示“位序”的整型变量 i 和指向顺序表中第 i 个元素存储位置的“指针”p。具体程序如下所示:
在这里插入图片描述

3.插入元素操作

假设有一个顺序存储表示的线性表 L:
(5,8,12,18,25,30,37,46,51,89)
需要在其第 4 个和第 5 个元素之间(即在第 5 个元素之前插人一个数据元素 23。显然,要实现这个“插入”,首先需要将存储在数组 L.Elem 中第 10 个分量至第 5 个分量中的数据元素“依次向后移动一个位置”,然后将 23 插入到 L.elem[4] 中,如图 2.2 所示。
在这里插入图片描述
一般情况下,在顺序表 L 中第 i个元素之前插入一个新的元素时,首先需将L.elem[L.length-1]至 L.elem[i-1]依次向后移动一个位置。显然,此时顺序表的长度应该小于数组的最大容量;否则,在移动元素之前,必须先为顺序表“扩大数组容量”。具体程序如下所示:
在这里插入图片描述
在这里插入图片描述

其中,顺序表追加空间的函数为:
在这里插入图片描述
从算法中可见,一般情况下,当插入位置 i=L.length+1 时,for 循环的执行次数为 0,即不需要移动元素;反之,若 i=1,则需将表中全部( 个)元素依次向后移动。然而,当顺序表中数据元素已占满空间时,不论插入位置在何处,为了扩大当前的数组容量,都必须移动全部数据元素,因此,从最坏的情况考虑,顺序表插入算法的时间复杂度为 O(n),其中 n 为线性表的长度。容易看出,“扩容”的算法是很费时间的,特别是对当前表长较大的情况。因此在实际的应用程序中,应该尽量少用,也就是说,尽可能一次为顺序表分配足够使用的数组空间

这其中有个自定义的错误处理函数ErrorMessage。该函数具体实现如下:
在这里插入图片描述

4.删除元素操作

假设需要从顺序存储表示的线性表 L:
(5,8,12,18,25,30,37,46,51,89)
中删除数据元素 25。为了使删除之后的线性表仍然保持顺序表的特点(元素“30”应该紧挨着元素“18”),必须将数组 L.elem 中从元素“30”至元素“89”依次向前移动一个位置,如图 2.3 所示。
在这里插入图片描述
般情况下,从顺序表 L 中删除第个元素时,需将 L.elem [i- I]至L.elem[L.length-1]的元素依次向前移动一个位置。具体程序如下:
在这里插入图片描述
和插人的情况相类似,当删除位置i=L. length时,for循环的执行次数为0,即不需要移动元素;反之,若i=1,则需将顺序表中从第2个元素起至最后一个元素(共n-1个元素)依次向前移动一个位置。因此,顺序表删除元素算法的时间复杂度也为0(n),其中n为线性表的长度。

5.销毁结构操作

和结构创建相对应,当程序中的数据结构不再需要时,应该及时进行“销毁”,并释放它所占的全部空间,以便使存储空间得到充分的利用。具体程序如下:

在这里插入图片描述在这里插入图片描述

6.插入和删除操作的时间分析

从上述实现操作的算法中容易看出,在顺序表中插人或删除一个数据元素时,其时间主要消耗在移动元素上。并且,从描述移动的 for 循环语句中循环变量的上、下界看出,所需移动元素的个数和两个因素有关;其一是线性表的长度;其二是被插或被删元素在线性表中的位置。当元素被插入到线性表中最后一个元素之后或者被删除的是线性表中最后一个元素时,不需要移动顺序表中其他元素:反之,当元素被插入到线性表中第一个元素之前或者被删除的是线性表中第一个元素时,需要将顺序表中所有元素均向表尾或表头移动一个位置。由于插入和删除都可能在线性表的任何位置上进行,从统计意义上讲,考虑在顺序表的任一位置上进行插人或删除的“平均时间特性”更有实际意义。因此需要分析它们的平均性能,即分析在顺序表中任何一个合法位置上进行插入或删除操作时“需要移动元素个数的平均值”

令 Ein(n)表示在长度为 n 的顺序表中进行一次插入操作时所需进行“移动”个数的期望值(即平均移动个数),则
在这里插入图片描述
其中,pi是在第i个元素之前插入一个元素的概率,n-i+1 是在第 个元素之前插人一个元素时所需移动的元素个数。由于可能插入的位置 i=1,2, … ,n+1 共 n+1个,假设在每个位置上进行插入的机会均等,则
在这里插入图片描述
由此,在上述等概率假设的情况下,
在这里插入图片描述
类似地,令 Edl(n)表示在长度为 n 的顺序表中进行一次删除操作时所需进行“移动”个数的期望值(即平均移动个数),则
在这里插入图片描述
其中,qi是删除第 i 个元素的概率,n-i 是删除第 i 个元素时所需移动元素的个数。同样假设在 n 个可能进行删除的位置 i=1,2, … ,n 机会均等,则
在这里插入图片描述
由此,在上述等概率的假设下,
在这里插入图片描述
由式(2-4)和式(2-7)可见,在顺序存储表示的线性表中插入或删除一个数据元素,平均约需移动表中一半元素。这在线性表的长度较大时是很可观的。这个缺陷完全是由于顺序存储要求线性表的元素依次紧挨存放所造成的。因此,这种顺序存储表示仅适用于不经常进行插入和删除操作并且表中元素相对稳定的线性表

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

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

相关文章

Linux:自动化构建工具make/Makefile

文章目录一.前言二.Makefile如何写入/make命令使用2.1清楚依赖关系和依赖方法2.2删除文件2.3Makefile中的关键字.PHONY2.4一个小补充一.前言 在此之前我们已经可以用vim编写代码和用gcc编译代码。但是如果现在要写一个大型项目,一下子写了很多源文件,在…

C. Zero Path(DP)

Problem - 1695C - Codeforces 给你一个有n行和m列的网格。我们用(i,j)表示第i(1≤i≤n)行和第j(1≤j≤m)列的方格,用aij表示那里的数字。所有的数字都等于1或等于-1。 你从方格(1,1)开始,每次可以向下或向右移动一个方格。最后&…

基于结点的数据结构——链表(单链表双向循环链表)| 附完整源码 | C语言版

本章内容 1.什么是链表 2.链表常见几种形式 3.无头单向非循环链表的实现 3.1结点结构的定义 3.2函数接口的实现 3.2.1尾插 3.2.2尾删 4. 带头双向循环链表的实现 4.1结点结构的定义 4.2函数接口的实现 5.两种链表的差异 ①尾插与尾删的时间复杂度 ②头插与头删的时…

Ai 作图 stable-diffusion-webui prompt

文章参考了 prompt指导手册 : https://strikingloo.github.io/stable-diffusion-vs-dalle-2 https://prompthero.com/stable-diffusion-prompt-guide 一般来说,最好的稳定扩散提示会有这样的形式: “ [主要主题]的[图片类型] &#xff0…

C语言-文件操作(13.1)

目录 思维导图: 1. 为什么使用文件 2. 什么是文件 2.1 程序文件 2.2 数据文件 2.3 文件名 3. 文件的打开和关闭 3.1 文件指针 3.2 文件的打开和关闭 4. 文件的顺序读写 4.1 对比一组函数 5. 文件的随机读写 5.1 fseek 5.2 ftell 5.3 rewind 6. 文本…

FeignClient调用源码解析

文章目录一、FeignClient二、整体流程1.使用FeignClient2.FeignClient整体调用流程三、源码解析1. 注解EnableFeignClients2. FeignClientsRegistrar3. Feign其他配置4. FactoryBean5. 方法调用一、FeignClient FeignClient作为SrpingCloud进行http请求的一个基础组件&#xf…

IP地址和MAC地址是什么?Dhcp和arp又是什么?

本期武汉海翎光电的小编和大家聊聊 计算机是如何通信的?IP地址和MAC地址是什么?Dhcp和arp又是什么?在我们的家庭网络中,有许多的网络设备,比如我们可以有两台计算机A和B, 一台手机一台电视机,他们都连接到了…

【尚硅谷】Java数据结构与算法笔记09 - 哈希表

文章目录一、哈希表引入二、基本介绍三、Google公司的一个上机题3.1 题目描述3.2 代码实现一、哈希表引入 1)看一个实际需求, google 公司的一个上机题: 2)有一个公司, 当有新的员工来报道时, 要求将该员工的信息加入(id,性别,年龄, 住址…), 当输入该员…

【Linux】理解文件系统——软硬链接

我们之前讨论的都是进程和被打开文件的关系,而如果一个文件是没有被打开呢?没有被打开的文件操作系统如何管理? 没有被打开的文件在磁盘上,所以磁盘上有大量的文件,这些文件要被静态管理起来,方便我们随时…

1588_AURIX_TC275_PMU简介

全部学习汇总: GreyZhang/g_TC275: happy hacking for TC275! (github.com) PMU是编程存储单元的缩写,但是落实到了具体的硬件模块上其实是一个Flash模块。在TC275中,只有一个PMU模块。在所有的AURIX芯片中,只有PMU0支持BootROM的…

React--》React组件的三大核心属性

目录 state 事件绑定 props 函数式组件使用props refs state state是组件对象最重要的属性,值是对象(可以包含多个 key-value的组合);组件被称为“状态机”,通过更新组件来对应页面显示(重新渲染组件),也就是有状态组件&…

ASP.NET Core 3.1系列(29)——System.Text.Json实现JSON的序列化和反序列化

1、前言 在Web开发中,JSON数据可以说是无处不在。由于具有轻量、易读等优点,JSON已经成为当前主流的数据传输格式。在ASP.NET Core 3.0之前,大多数项目都会使用Newtonsoft.Json组件来实现JSON的序列化和反序列化操作,而从ASP.NET…

《王道》操作系统整理

操作系统第1章 OS概述第1节 OS基本概念第2节 OS发展与分类第3节 OS运行机制和体系结构1.3.1 操作系统的运行机制1. 时钟管理2. 中断机制3. 原语4. 系统资源管理或系统控制的数据结构及处理1.3.2 中断和异常1.3.3 系统调用第2章 进程管理第3章 内存管理第4章 文件管理第5章 IO管…

【8】SCI易中期刊推荐——计算机 | 人工智能(中科院4区)

🚀🚀🚀NEW!!!SCI易中期刊推荐栏目来啦 ~ 📚🍀 SCI即《科学引文索引》(Science Citation Index, SCI),是1961年由美国科学信息研究所(Institute for Scientific Information, ISI)创办的文献检索工具,创始人是美国著名情报专家尤金加菲尔德(Eugene Garfield…

【SpringCloud11】Hystrix断路器

Hystrix断路器1.概述1.1分布式系统面临的问题1.2Hystrix 是什么1.3Hystrix 的作用1.4官网资料1.5Hystrix官宣停更进维2.Hystrix重要概念2.1服务降级(fallback)2.2服务熔断(break)2.3服务限流(flowlimit)3.H…

手把手教你使用Python实现推箱子小游戏(附完整源码)

文章目录项目介绍项目规则项目接口文档项目实现过程前置方法编写move核心方法编写项目收尾项目完善项目整体源码项目缺陷分析项目收获与反思项目介绍 我们这个项目是一个基于Python实现的推箱子小游戏,名叫Sokoban: 这个游戏的目的是让玩家&#xff0…

jfow-代码分析

jfow-代码分析目录概述需求:设计思路实现思路分析1.代码:2.代码2:3.CashFrmTemplate4.chartType5.DataColumnData:参考资料和推荐阅读Survive by day and develop by night. talk for import biz , show your perfect code,full busy&#xf…

Vue实战第1章:学习和使用vue-router

学习和使用vue-router 前言 本篇在讲什么 简单讲解关于vue-router的使用 仅介绍简单的应用,仅供参考 本篇适合什么 适合初学Vue的小白 适合想要自己搭建网站的新手 适合没有接触过vue-router的前端程序 本篇需要什么 对Html和css语法有简单认知 对Vue有…

2023/1/14 js基础学习

1 js基础学习-基本数据类型基本语法 请参考 https://blog.csdn.net/m0_48964052?typeblog https://gitee.com/hongjilin/hongs-study-notes/blob/master/%E7%BC%96%E7%A8%8B_%E5%89%8D%E7%AB%AF%E5%BC%80%E5%8F%91%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/HTMLCSSJS%E5%9F%BA%E…

Arthas 入门到实战(二)在线热更新

1. 结合 jad/mc 命令在线修改使用 jad 命令: 将 JVM 中实际运行的 class 的 byte code 反编译成 java 代码,便于你理解业务逻辑; mc命令:Memory Compiler/内存编译器,编译.java文件生成.class。 redefine命令:加载…