数据结构之数组、矩阵和广义表

数据结构之数组、矩阵和广义表

  • 1、数组
    • 1.1、数组的定义及基本运算
    • 1.2、数组的顺序存储
  • 2、矩阵
    • 2.1、特殊矩阵
    • 2.2、稀疏矩阵
  • 3、广义表
    • 3.1、广义表的基本操作
    • 3.2、广义表的特点
    • 3.3、广义表的存储结构

  数据结构是程序设计的重要基础,它所讨论的内容和技术对从事软件项目的开发有重要作用。学习数据结构要达到的目标是学会从问题出发,分析和研究计算机加工的数据的特性,以便为应用所涉及的数据选择适当的逻辑结构、存储结构及其相应的操作方法,为提高利用计算机解决问题的效率服务。
  数据结构是指数据元素的集合及元素间的相互关系和构造方法。元素之间的相互关系是数据的 逻辑结构,数据元素及元素之间关系的存储称为 存储结构(或物理结构)。数据结构按照逻辑关系的不同分为 线性结构非线性结构两大类,其中,非线性结构又可分为树结构和图结构。
  线性结构是一种基本的数据结构,主要用于对客观世界中具有单一前驱和后继的数据关系进行描述。线性结构的特点是数据元素之间呈现一种线性关系,即元素“一个接一个排列”。
  数组与广义表可看作是线性表的推广,其特点是数据元素仍然是一个表。这里讨论多维数组的逻辑结构和存储结构,特殊矩阵和矩阵的压缩存储,广义表的逻辑结构、存储结构和基本运算。

1、数组

1.1、数组的定义及基本运算

  (1)数组的定义
  数组是定长线性表在维数上的扩展,即线性表中的元素又是一个线性表。n 维数组是一种“同构”的数据结构,其每个数据元素类型相同、结构一致。
  设有 n 维数组 A[b1,b2,…,bn],其每一维的下界都为 1,bi是第 i 维的上界。从数据结构的逻辑关系角度来看,A 中的每个元素 A[j1,j2,…,jn] (1≤ji≤bi) 都被 n 个关系所约束。在每个关系中,除第一个和最后一个元素外,其余元素都只有一个直接后继和一个直接前驱。因此就单个关系而言,它仍是线性的。
  以二维数组 4[m,n]为例,可以把它看成是一个定长的线性表,它的每个元素也是一个定长线性表。
在这里插入图片描述

  A 可看成一个行向量形式的线性表:
A m , n = [ [ a 11 a 12 ⋅ ⋅ ⋅ a 1 n ] , [ a 21 a 22 ⋅ ⋅ ⋅ a 2 n ] , ⋅ ⋅ ⋅ , [ a m 1 a m 2 ⋅ ⋅ ⋅ a m n ] ] A_{m,n}=[ [a_{11} a_{12} ···a_{1n}],[a_{21} a_{22} ··· a_{2n}] ,···,[a_{m1}a_{m2}···a_{mn}]] Am,n=[[a11a12⋅⋅⋅a1n],[a21a22⋅⋅⋅a2n],⋅⋅⋅,[am1am2⋅⋅⋅amn]]
  或列向量形式的线性表:
A m , n = [ [ a 11 a 21 ⋅ ⋅ ⋅ a m 1 ] , [ a 12 a 22 ⋅ ⋅ ⋅ a m 2 ] , ⋅ ⋅ ⋅ , [ a 1 n a 2 n ⋅ ⋅ ⋅ a m n ] ] A_{m,n}=[ [a_{11} a_{21} ···a_{m1}],[a_{12} a_{22} ··· a_{m2}] ,···,[a_{1n}a_{2n}···a_{mn}]] Am,n=[[a11a21⋅⋅⋅am1],[a12a22⋅⋅⋅am2],⋅⋅⋅,[a1na2n⋅⋅⋅amn]]
  数组结构的特点如下。
  ① 数据元素数目固定,一旦定义了一个数组结构,就不再有元素个数的增减变化。
  ② 数据元素具有相同的类型。
  ③ 数据元素的下标关系具有上下界的约束且下标有序。
  (2)数组的两个基本运算
  ① 给定一组下标,存取相应的数据元素。
  ② 给定一组下标,修改相应的数据元素中某个数据项的值。
  所有的高级程序设计语言都提供了数组类型。实际上,在程序语言中把数组看成是具有共同名字的同一类型的多个变量的集合。

1.2、数组的顺序存储

  数组一般不做插入和删除运算,一旦定义了数组,则结构中的数据元素个数和元素之间的关系就不再发生变动,因此数组适合于采用顺序存储结构。
  二维数组的存储结构可分为以行为主序和以列为主序的两种方法,如下图所示
在这里插入图片描述

  设每个数据元素占用 L 个单元,m、n 为数组的行数和列数,Loc(a11)表示元素a11的地址,那么以行为主序优先存储的地址计算公式为
L o c ( a i j ) = L o c ( a 11 ) + ( ( i − 1 ) × n + ( j − 1 ) ) × L Loc(a_{ij})=Loc(a_{11})+((i-1)×n+(j-1))×L Loc(aij)=Loc(a11)+((i1)×n+(j1))×L
  同理,以列为主序优先存储的地址计算公式为
L o c ( a i j ) = L o c ( a 11 ) + ( ( j − 1 ) × n + ( i − 1 ) ) × L Loc(a_{ij})=Loc(a_{11})+((j-1)×n+(i-1))×L Loc(aij)=Loc(a11)+((j1)×n+(i1))×L
  推广至多维数组,在按下标顺序存储时,先排最右的下标,从右向左直到最左下标,而逆下标顺序则正好相反。

2、矩阵

  矩阵是很多科学与工程计算领域研究的数学对象。在数据结构中,主要讨论如何在节省存储空间的情况下使矩阵的各种运算能高效地进行。
  在一些矩阵中,存在很多值相同的元素或者是0元素。为了节省存储空间,可以对这类矩阵进行压缩存储,即为多个值相同的元素只分配一个存储单元,对0不分配存储单元。假如值相同的元素或0元素在矩阵中的分布有一定的规律,则称此类矩阵为特殊矩阵,否则称其为稀疏矩阵。

2.1、特殊矩阵

  若矩阵中元素(或非0元素)的分布有一定的规律,则称之为特殊矩阵。常见的特殊矩阵有对称矩阵、三角矩阵和对角矩阵等。对于特殊矩阵,由于其非0元素的分布有一定的规律,所以可将其压缩存储在一维数组中,并建立起每个非0元素在矩阵中的位置与其在一维数组中的位置之间的对应关系。
  若矩阵 An×n中的元素特点为 aij=aji(1≤i,j≤n),则称之为n阶对称矩阵。
  若对称矩阵中的每一对元素仅占用一个存储单元,那么可将 n2个元素压缩存储到能存放n(n+1)/2 个元素的存储空间中。不失一般性,以行为主序存储下三角(包括对角线)中的元素。假设以一维数组 B[(n+1)/2]作为 n 阶对称矩阵 A 中元素的存储空间,则 B[k] (1≤k<n(n+1)/2)与矩阵元素 aij(aji) 之间存在着一一对应的关系,如下所示。
在这里插入图片描述

  对角矩阵是指矩阵中的非 0 元素都集中在以主对角线为中心的带状区域中,即除了主对角线上和直接在对角线上、下方若干条对角线上的元素外,其余的矩阵元素都为 0。一个 n 阶的三对角矩阵如下图 所示。
在这里插入图片描述

  若以行为主序将n阶三对角矩阵An×n的非0元素aij存储在一维数组 B[k] (1≤k≤3×n-2)中,则元素位置之间的对应关系为
k = 3 × ( i − 1 ) − 1 + j − i + 1 + 1 = 2 i + j − 2 ( 1 ≤ i , j ≤ n ) k=3×(i-1)-1+j-i+1+1=2i+j-2 (1≤i, j≤n) k=3×(i1)1+ji+1+1=2i+j2(1i,jn)
  其他特殊矩阵可做类似的推算,这里不再一一说明。

2.2、稀疏矩阵

  在一个矩阵中,若非 0 元素的个数远远少于 0 元素的个数,且非 0元素的分布没有规律,则称之为稀疏矩阵。对于稀疏矩阵,存储非 0 元素时必须同时存储其位置(即行号和列号),所以三元组 (i,j,aij)可唯一确定矩阵 A 中的一个元素。由此,一个稀疏矩阵可由表示非 0 元素的三元组及其行、列数唯一确定。下图 所示的是一个 6 行 7 列的稀疏矩阵,其三元组表为((1,2,12),(1,3,9),(3,1,-3), (3,6,14),(4,3,24),(5,2,18),(6,1,15),(6,4,-7))。
在这里插入图片描述

  稀疏矩阵的三元组表的顺序存储结构称为三元组顺序表,常用的三元组表的链式存储结构是十字链表。

3、广义表

  广义表是线性表的推广,是由 0 个或多个单元素或子表组成的有限序列。
  广义表与线性表的区别在于: 线性表的元素都是结构上不可分的单元素,而广义表的元素既可以是单元素,也可以是有结构的表。
  广义表一般记为
L S = ( α 1 , α 2 , ⋅ ⋅ ⋅ , a n ) LS=(α_1,α_2,···,a_n) LS=(α1,α2,⋅⋅⋅,an)
  其中,αj(1 ≤ i ≤ n)既可以是单个元素,又可以是广义表,分别称为原子和子表。
  广义表的长度是指广义表中元素的个数。广义表的深度是指广义表展开后所含的括号的最大层数。

3.1、广义表的基本操作

  与线性表类似,广义表也有查找、插入和删除等操作。由于广义表的结构较复杂,其各种运算的实现也不如线性表简单,这里只讨论两个重要的运算。
  (1)取表头 head(LS)。非空广义表 LS 的第一个元素称为表头,它可以是一个单元素,也可以是一个子表。
  (2) 取表尾 tail(LS)。在非空广义表中,除表头元素之外,由其余元素所构成的表称为表尾。非空广义表的表尾必定是一个表。

3.2、广义表的特点

  (1)广义表可以是多层次的结构,因为广义表的元素可以是子表,而子表的元素还可以是子表。
  (2)广义表中的元素可以是已经定义的广义表的名字,所以一个广义表可被其他广义表所共享。
  (3)广义表可以是一个递归的表,即广义表中的元素也可以是本广义表的名字。

3.3、广义表的存储结构

  由于广义表中的元素本身又可以具有结构,它是一种带有层次的非线性结构,因此难以用顺序存储结构表示,通常采用链式存储结构。由上面的讨论可知,若广义表不空,则可分解为表头和表尾两部分。反之,一对确定的表头和表尾可唯一确定一个广义表。针对原子和子表可分别设计不同的结点结构,如下图 所示。
在这里插入图片描述

  对于广义表 LS=(a,(b,c,d)),其链式存储结构如下图所示。
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

力扣:416. 分割等和子集 1049. 最后一块石头的重量 II (动态规划)(二合一,一次吃透两道题)

力扣&#xff1a;416. 分割等和子集 & 1049. 最后一块石头的重量 II 用的方法都是01背包解法&#xff0c;思路也是近乎一样&#xff0c;这里就放在一起讲解了&#xff08;主要讲解第一题&#xff0c;第二题大家可以直接自己AC&#xff09;。01背包解法详细讲解请见上篇博客…

CentOS搭建DNS服务器

服务器规划 DNS服务器IP为&#xff1a;172.16.32.253 需要自定义域名解析 172.16.32.253 dns.zhangsan.com 172.16.32.128 test1.zhangsan.com 172.16.32.129 test2.zhangsan.com 172.16.32.130 www.zhangsan.com 1. 服务器初始化 [rootlocalhost ~]# hostnamectl set-hostnam…

C++的命名空间域

一、域作用限定符 :: 即是域作用限定符&#xff0c;它的作用是指明一个标识符&#xff08;变量、函数或类&#xff09;来自哪一个作用域范围 二、编译器搜索变量、函数等的原则 1.先搜索局部变量&#xff0c;2.再搜索全局变量&#xff0c;3.最后搜索指定的命名空间域 三、…

2023.1.17 关于 Redis 持久化 AOF 策略详解

目录 引言 AOF 策略 实例演示一 缓冲区 重写机制 手动触发 自动触发 AOF 重写流程 实例演示二 引言 Redis 实现持久化的两大策略 RDB ——> Redis DataBase&#xff08;定期备份&#xff09;AOF ——> Append Only File&#xff08;实时备份&#xff09; 注意&…

15.云原生之k8s容灾与恢复实战

云原生专栏大纲 文章目录 Velero与etcd介绍Velero与etcd备份应用场景Velero与etcd在k8s备份上的区别 Velero备份恢复流程备份工作流程Velero备份时&#xff0c;若k8s集群发送变化&#xff0c;会发发生情况&#xff1f;Velero 备份pv&#xff0c;pv中数据变化&#xff0c;会发发…

开发「定位线上问题」小工具总结

文章目录 1. 写在最前面1.1 背景1.2 思路 2. 如何快速解决问题2.1 分析问题2.2 补救问题2.2.1 思路2.2.2 实现 3. 碎碎念 1. 写在最前面 1.1 背景 同事给处理各种线上问题以及处理紧急要交付的需求版本的我&#xff0c;紧急插入了一个线上的问题&#xff1a; 问题说明&#…

Java中的System类和一些练习

​​​​​​​ 目录 常用方法&#xff1a; 第一个方法&#xff1a; 第二个方法&#xff1a; 第三个方法&#xff1a; 方法 三 的拓展&#xff1a; System 和 Math 一样&#xff0c;也是一个工具类&#xff0c;提供了一些与系统相关的方法 常用方法&#xff1a; 第一个方…

【机器学习】机器学习变量分析第02课

当我们谈论用机器学习来预测咖啡店的销售额时&#xff0c;我们实际上是在处理一系列与咖啡销售相关的变量。这些变量就像是我们用来理解销售情况的“线索”或“指标”。那么&#xff0c;让我们用通俗易懂的方式来聊聊这些变量是怎么工作的。 特征变量&#xff1a;咖啡店的“档…

分类预测 | Matlab实现ZOA-CNN-MATT-SVM斑马优化卷积神经网络多头注意力机制结合支持向量机的数据分类预测【24年新算法】

分类预测 | Matlab实现ZOA-CNN-MATT-SVM斑马优化卷积神经网络多头注意力机制结合支持向量机的数据分类预测【24年新算法】 目录 分类预测 | Matlab实现ZOA-CNN-MATT-SVM斑马优化卷积神经网络多头注意力机制结合支持向量机的数据分类预测【24年新算法】分类效果基本描述程序设计…

mall整合Redis实现缓存功能

mall整合Redis实现缓存功能 本文主要讲解mall整合Redis的过程&#xff0c;以短信验证码的存储验证为例。 Redis的安装和启动 Redis是用C语言开发的一个高性能键值对数据库&#xff0c;可用于数据缓存&#xff0c;主要用于处理大量数据的高访问负载。 下载Redis,下载地址&…

【HTML】-- 02 HTML进阶

2.HTML进阶 2.1 块元素和行内元素 块元素 无论内容多少&#xff0c;该元素独占一行(p段落标签、h1-h6标题标签…) 行内元素 内容撑开宽度&#xff0c;左右都是行内元素的可以排在一行(a链接标签 . strong粗体 . em斜体 …) 2.2 列表标签 列表就是信息资源的一种展示形式。…

VUE组件--动态组件、组件保持存活、异步组件

动态组件 有些场景可能会需要在多个组件之间进行来回切换&#xff0c;在vue中则使用<component :is"..."> 来实现组件间的来回切换 // App.vue <template><component :is"tabComponent"></component><button click"change…