数据结构与算法——线性表的顺序储存结构

2023-11-17

目录

前言

一、顺序储存的定义及储存方式

二、地址计算方法

三、顺序存储结构的插入和删除

3.1  获得元素操作

 3.2   插入操作

3.3   删除操作

四、分析插入和删除操作的时间复杂度 

五、线性表顺序存储结构的优缺点


前言

在介绍线性表的顺序储存结构之前,咱们先来简单说一说什么是线性表。

线性表,顾名思义就是有像线一样性质的表。打一个比方,通常幼儿园的小朋友在放学的时候都会排好队,并且每天这个队列每个小朋友的位置都是固定的,这样一来老师就能快速的判断是否有人缺席,而且每个小朋友都能知道自己的前后都是谁。这样一来就如同一根线将他们串起来了,我们可以将其称之为线性表。

线性表(List):零个或多个数据元素的有限序列。

注:这里需要强调几点,首先是线性表的元素都是有顺序的;其次线性表的元素都是有限的,因为计算机处理的对象都是有限的,对于无限的对象,只能交给数学来处理研究。

线性表的长度:指的是线性表的元素个数n,当n=0时,称为空表。

线性表的位序:指的是线性表中的元素为第 i 个元素,则称 i 为线性表的位序。

好啦,线性表我们就说到这里,下面该进入正题咯。

一、顺序储存的定义及储存方式

顺序储存结构:指的是用一段地址连续的储存单元以此储存线性表的数据元素。

其实说白了,顺序储存结构就是在内存中找了一块地,将一组数据以连续的方式将其储存在这块内存中。而且每个元素的数据类型相同,所以我们可以用C语言的一维数组来实现顺序储存结构。即,把第一个数据元素存到下标为0的位置,接着把线性表相邻的元素储存在数组中相邻的位置。

下面我们给出一段顺序储存的结构代码:

#define size 40         //储存空间的初始分配量 
typedef int typeone;       //这里typeone的类型视情况而定,这里定义为int
typedef struct 
{
    typeone data[size];      //定义数组,用于储存数据元素
    int length;            //线性表当前的长度 
 }list; 

这里我们就能知道顺序储存结构的三个属性:

1.储存空间的起始位置:数组data,它的储存位置就是储存空间的起始位置;

2.线性表的最大储存容量:数组长度size;

3.线性表的当前长度:length。

注:作为初学者需要注意“数组长度”和“线性表的长度”的区别。在任意时刻,线性表的长度小于等于数组的长度。 

二、地址计算方法

地址:储存器中每个储存单元都有自己的编号,这个编号称为地址。

对于每个数据元素,不管它是整型、实型还是字符型,它都是需要占用一定的储存单元空间的。假设占用的是 c 个储存单元,那么线性表中第i+1个数据元素的储存位置和第 i 个数据元素的储存位置满足下列关系(locate表示获得储存位置的函数)

locate(Ai+1)=locate(Ai)+c

对于,第 i 个数据元素的储存位置可以由第1个元素推算得到:

locate(Ai)=locate(A1)+(i-1)*c 

有了这两个公式,我们就可以快速计算线性表中任意位置的地址,不论它是最后一个还是第一个,所需的时间都是相同的,也就是一个常数。所以根据时间复杂度的定义,这项操作的时间复杂度为O(1)。我们通常把具有这一特点的储存结构称为随机存取结构。

三、顺序存储结构的插入和删除

3.1  获得元素操作

获取元素实际上就是把第 i 个元素的值返回,其实是相对简单的。下面我们来看看代码:

#define right 1
#define wrong 0
//上面两个宏定义实际上就是用于函数返回代码运行状况的

int get(list a,int i,int *b)          //i是线性表数据元素的位置,用b将第i个数据元素的值传递出来 
{
    if(a.length==0||i<1||i>a.length)    //length是线性表的长度 
    {
        return wrong;
    }
    *b=a.data[i-1];    //注意i是在线性表中是从1开始的,数组下标是从0开始的 
    
    return right;

 3.2   插入操作

对于顺序储存结构的插入操作,同样可以用排队的思想来看待。你就可以想象一下你在排队,假设说有一个人突然在你面前插队,而且对方又很强壮你打不过他,只好自认倒霉,往后退一步。关键来了,你后退一步必将导致你后面的所有人都将后退一步,这下造成了后面的人群情激愤,直接把那个插队的人给赶跑了。

我们回到顺序储存结构来,如果要将一个元素进行插入操作,那么必将使其后面的元素的位置后退一个。我们这里给出插入算法的思路:

1.如果插入位置不合理或者线性表长度大于等于数组长度,返回异常值;

2.从最后一个元素开始向前遍历到第 i 个位置,分别将它们向后移动一个位置;

3.将要插入的元素填入位置 i 处;

4.线性表长度+1;

实现代码如下:

//在线性表a中第i个位置插入新的数据元素e,若插入成功线性表长度+1 
int insert(int *a,int i,int b)
{
    if(a.length==maxsize)       //表明线性表已满,不能再插入 
    {
        return wrong;
    }
    if(i<1||i>a.length+1)          //i的第一个位置和最后一位的后一位 
    {
        return wrong;
    }
    
    if(i<=a.length)
    {
        for(k=a.length-1;k<=i-1;k--)          //将要插入位置后的元素向后移一位 
        {
            a.data[k+1]=a.data[k];
        }
    }
    a.date[i-1]=e;     //将新元素插入到i位置 
    a.length++;        //线性表的长度+1 
    
    return right;

3.3   删除操作

删除操作实际上就是插入操作的反向操作,这里直接给出算法思路:

1.如果删除的位置不合理或者线性表为空,则返回异常值;

2.取出删除元素;

3.从删除元素开始遍历到最后一个元素,将它们都向前移动一个位置;

4.线性表长度-1。

实现代码如下:


//删除第i个数据元素,并用b传递出其值,线性表的长度-1 
int insert(int *a,int i,int *b)
{
    if(a.length==0)       //表明线性表为空 
    {
        return wrong;
    }
    if(i<1||i>a.length)      //表明删除位置不正确 
    {
        return wrong;
    }
    *b=a.data[i-1];             //取出被删除的数据元素 
    if(i<a.length)                 //如果删除的不是最后一位 
    {
        for(k=1;k<a.length;k++)           //将删除位置后继元素向前移一位 
        {
            a.data[k-1]=a.data[k];
        }
    }

    a.length--;            //线性表的长度-1 
    
    return right;

四、分析插入和删除操作的时间复杂度 

先假设一个最好的情况,如果删除或者插入的数据元素恰好都是最后一个,那么就无需移动其他元素的位置,直接进行插入和删除即可,所以其时间复杂度为O(1) 。但是,对于最坏的情况,即删除或者插入的数据元素的位置都是第一个,那么就必须将全部的元素向前或者向后移一位,其时间复杂度显然就为O(n)。

对于平均的情况,根据概率原理,每个位置插入和删除的可能性是相同的。所以,最终平均移动次数和最中间的那个元素的移动次数相等,为(n-1)/2。

因此,顺序储存结构的删除和插入操作的时间复杂度都是O(n)。这就说明它比较适合元素个数不太变化,而更多的是存取数据的应用。

五、线性表顺序存储结构的优缺点

优点:

  • 无需为表示表中元素之间的逻辑关系而增加额外的储存空间
  • 可以快速地存取表中任一位置的元素

缺点:

  • 插入和删除操作需要大量元素
  • 当线性表长度变化比较大时,难以确定储存空间的容量
  • 造成储存空间的“碎片” 
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数据结构与算法——线性表的顺序储存结构 的相关文章

  • .net 配置网关(使用Ocelot)

    本文演示一个最简单的demo 来模拟如何通过网关来访问服务 而不是直接访问服务 创建三个asp net core web api项目 一个作为网关 两个作为服务 分别配置项目的访问路径 网关的项目使用https localhost 5001
  • MQTT-java使用说明

    MQTT java使用说明 本文的资料下载 链接 https pan baidu com s 1OCfsQ NqcehKy86kYkA wg pwd 1234 提取码 1234 MQTT基本介绍 MQTT是一个客户端服务端架构的发布 订阅模
  • DNS在架构设计中的巧用

    DNS在架构设计中的巧用 一 缘起 一个http请求从客户端到服务端 整个执行流程是怎么样的呢 一个典型流程如上 1 客户端通过域名daojia com请求dns server 2 dns server返回域名对应的外网ip 1 2 3 4

随机推荐

  • python拟合二次函数_Python 最小二乘法 拟合 二次曲线

    最小二乘 Python 二次拟合 随机生成数据 并且加上噪声干扰 构造需要拟合的函数形式 使用最小二乘法进行拟合 输出拟合后的参数 将拟合后的函数与原始数据绘图后进行对比 import numpy as np import matplotl
  • 讯飞aiui的webapi+python使用记录

    1 demo一直不能出语义理解 我以为是我的问题 直到 当前页面配置修改仅在测试环境生效 设备端体验需要SDK传参时在情景模式后加 box 或 更新发布 至生产环境体验 这不坑爹吗 记得在情景模式后加 box
  • BFS的常见算法题-二叉树的最小深度

    背景 对某个二叉树 我们除了用肉眼可以看出其深度 还可以用算法来计算出它的深度 比如 下面的二叉树 一共有三层 它的深度就是3 如果某个分支的叶子结点没有左右子节点 就是它深度中较小的一个 leetcode中 有一题求最小深度 如下图 最小
  • 各种日志关系

    slf4j是日志的门面 也是会说是日志框架
  • 【Unity开发】Unity获取设备屏幕分辨率

    using UnityEngine using System Collections public class ExampleClass MonoBehaviour void Start Resolution resolutions Scr
  • Vscode ssh远程连接失败解决办法

    问题描述 Vscode 通过remote ssh连接远程ubuntu时出现 192 168 x x has fingerprint SHA256 如下图所示 按照提示选择 continue 然后输入正确密码却显示Permission Den
  • java md5 解密_“实用”的JAVA开发工具类库

    简介 Hutool是一个小而全的Java工具类库 通过静态方法封装 降低相关API的学习成本 提高工作效率 使Java拥有函数式语言般的优雅 让Java语言也可以 甜甜的 Hutool中的工具方法来自于每个用户的精雕细琢 它涵盖了Java开
  • 免费的 AI 代码辅助工具-codeium

    不是标题党 是真免费 几天之前 GitHub 发布了 GitHub Copilot X 这是一款基于 OpenAI 的 GPT 4 模型开发的 AI 代码辅助工具 看介绍应该是和 Microsoft 365 Copilot 很像的产物 属于
  • ChatGLM-6B部署笔记

    前言 本笔记基于ChatGLM 6B开源网站 https github com THUDM ChatGLM 6B 完成ChatGLM的本地部署 首先电脑已经安装python3 10 anaconda pycharm2022 3 如若使用本地
  • Application.targetFrameRate安卓apk上设置帧率问题

    一般游戏为了更好的适配各种机型 会对游戏进行锁帧 就会使用Application targetFrameRate这个方法设置帧率 pc上测试是没问题的 但是安卓机上面测试就会发现 设置的帧率只能在30和60帧两个数值来回跳动 参考了unit
  • 21-angular.merge

    通过从src对象 s 复制自己的可枚举属性到dst 深度扩展了目标对象的dst 您可以指定多个src对象 如果您想保留原始对象 那么可以通过将空对象作为目标来实现 var object angular merge object1 objec
  • 睿智的seq2seq模型1——利用seq2seq模型对数字进行排列

    睿智的seq2seq模型1 利用seq2seq模型对数字进行排列 学习前言 seq2seq简要介绍 利用seq2seq实现数组排序 实现方式 一 对输入格式输出格式进行定义 二 建立神经网络 1 神经网络的输入 2 语义编码c的处理 3 输
  • 【English】十大词性之感叹词(感叹句)

    感叹词 文章目录 感叹词 前言 一 十大高频感叹词 1 1 Oh 表示惊讶 指责 痛苦 称赞 懊恼等 可译为 哦 哎呀 噢 啊 呀 等 1 2 Ah 表示惊奇 高兴 讨厌 懊悔 藐视 威胁等 可译为 呀 啊 等 1 3 come 表示鼓励
  • 海量数据分类 liblinear使用总结

    liblinear使用总结 liblinear是libsvm的线性核的改进版本 专门适用于百万数据量的分类 正好适用于我这次数据挖掘的实验 liblinear用法和libsvm很相似 我是用的是 exe文件 利用python的subproc
  • Oracle安装详细教程

    一 安装教程 安装教程1 安装教程2 假设安装时弹出 microsoft net framework 3 5 提示你需要安装这个 你可以选择直接忽视 关掉弹窗 等待数据库复制 安装时 综合看两个教程 基本满足安装需求 二 安装测试 1 在电
  • Mac os Ventura 关闭 accent方言,长按不能连续输入问题

    Mac os Ventura 关闭 accent方言 长按不能连续输入问题 在之前的osx版本遇到长按开启方言输入 无法连续输入问题时 defaults write g ApplePressAndHoldEnabled bool false
  • Python逻辑判断顺序

    Python逻辑判断是有顺序的 如 while l1 is not None and l2 is not None and l1 val lt l2 val node1 next l1 node1 node1 next l1 l1 next
  • 从零开始,教你如何开发一款自己的 IDEA 插件!

    程序员的成长之路 互联网 程序员 技术 资料共享 关注 阅读本文大概需要 4 分钟 来自 blog csdn net smile 795 article details 125470136 idea插件介绍 作为一枚程序员 平时最常用的id
  • cdn服务器pnk_cdn服务器是什么

    对于cdn我们不陌生 你听过cdn服务器吗 CDN服务器是建立在网络上的内容分发网络 依托布置在各地的边缘服务器 用户可以经过中央渠道的负载平衡 内容分发 调度等功用模块获取附近所需的内容 然后减少网络拥塞 进步用户拜访响应速度和命中率 为
  • 数据结构与算法——线性表的顺序储存结构

    目录 前言 一 顺序储存的定义及储存方式 二 地址计算方法 三 顺序存储结构的插入和删除 3 1 获得元素操作 3 2 插入操作 3 3 删除操作 四 分析插入和删除操作的时间复杂度 五 线性表顺序存储结构的优缺点 前言 在介绍线性表的顺序