5.线性结构-数组和广义表

数组和广义表

数组和广义表是两种特殊的线性表。数组的特殊性在于它的长度是固定的。

广义表的特殊性在于它的数据元素的类型可以不同。

数组

多维数组的顺序存储

一维数组的存储比较简单,按照数据元素在数组中的顺序存储在一组连续的地址单元中。

对于多维数组而言,采用顺序存储时,有两种方式:

  • 以行为主
    • 将数组的每一行视为一个数据元素
  • 以列为主
    • 将数组的每一列是视为一个数据元素

矩阵的以行为主的顺序存储也称为按行优先的顺序存储,以列为主的顺序存储也称为按列优先的顺序存储。

以行为主的顺序存储

设有m行n列的二维数组A:
在这里插入图片描述
可以把二维数组A看做一个具有m个数据元素的线性表。

  • A=(α1,α2,,αm)
    • α1=(a11,a12,,a1n)
    • α2=(a21,a22,,a2n)
    • αm=(am1,am2,,amn)

整个二位数组的存储格式如下
在这里插入图片描述
二维数组按顺序结构存储时,整个二维数组存储在一组连续的存储单元中,相邻数组元素的存储地址也是相邻的,故可以根据数组元素a11的存储地址求出其他数组元素的地址。

假设以ADDR(aij)表示数组元素aij的存储地址,则可根据以下公式计算该地址:

ADDR(aij)=ADDR(a11)+[(i-1)×n+j-1]×k

其中,K表示每个数组元素所需的存储单元数。

以列为主的顺序存储

设有m行n列的二维数组A:
在这里插入图片描述
可以把二维数组A看做一个具有n个数据元素的线性表。

  • A=(β1,β2,,βn)
    • β1=(a11,a21,,am1)
    • β2=(a12,a22,,am2)
    • βn=(a1n,a2n,,amn)

整个二位数组的存储格式如下
在这里插入图片描述

二维数组按顺序存储时,整个二维数组是存储在一组连续的存储单元中的,相邻数组元素的存储地址也是相邻的,故可以根据数组元素a11的存储地址求出其他数组元素的地址。

假设以ADDR(aij)表示数组元素aij的存储地址,则根据以下公式计算该地址:

ADDR(aij)=ADDR(a11)+[(i-1)×n+j-1]×k

其中,K表示每个数组元素所需的存储单元数。

特俗矩阵的压缩存储

矩阵是数学中常见的处理对象。矩阵在形式上和二维数组一致,故常用二维数组来表示和处理矩阵。

对于某些特殊的矩阵,如元素分布有规律或者有大量的元素为0,在存储的时候无需将它的所有元素都存储起来,这样可以节省大量的存储单元,这种存储方式称为矩阵的压缩存储。

对于特殊矩阵的压缩存储,要根据矩阵元素的分布情况,设计具体的压缩存储策略。

三角矩阵

三角矩阵分为上三角矩阵和下三角矩阵。在上三角矩阵中,对角线以下的元素全为0。在下三角矩阵中,对角线以上的元素全为0。

下三角矩阵A:
在这里插入图片描述
下三角矩阵的元素aij的分布规律如下:
在这里插入图片描述
在下三角矩阵中,约有一半的0元素,且其位置是有规律的,故在存储时,无需存储这些0元素。

在下三角矩阵中,非0元素的个数为n(n+1)/2个,故可以用一个长度为n(n+1)/2的一维数组B来存储其非0元素。设下三角矩阵的非0元素aij(1≤i、j≤n)存储在一维数组B中的下标为k[0≤k<n(n+1)/2]的位置,则k与i、j之间的关系如下。

在这里插入图片描述
由此,可以通过下式得到矩阵A的元素。
在这里插入图片描述

对角矩阵

对角矩阵是指主对角线及对称于主对角线的若干对角线上的元素非0,其余元素为0的矩阵。三对角矩阵是最简单的对角矩阵,其非0元素分布在以主对角线为中心的3条对角线上。

在这里插入图片描述
三对角矩阵的元素aij的分布规律如下。

在这里插入图片描述

三对角矩阵中非0元素共有3n-2个,故可以用一个长度为3n-2的一维数组B来存储其非0元素。设三对角矩阵的非0元素aij(1≤i≤n,i-1≤j≤i+1)存储在一维数组B中的下标为k(0≤k<3n-2)的位置,则k与i、j之间的关系如下。
在这里插入图片描述
由此,可以通过下式得到矩阵A的元素。
在这里插入图片描述

对称矩阵

对称矩阵是矩阵中的元素以主对角线为对称轴而对称分布的矩阵。对称矩阵元素的分布规律如下。
在这里插入图片描述
实现压缩存储时,只存储对称位置两个元素中的一个,只存储主对角线及其以下的元素,存储的元素数量与下三角矩阵相同,需要一个长度为n(n+1)/2的一维数组B。

设对称矩阵主对角线及以下的元素aij(1≤i≤n,j≤i)存储在一维数组B中的下标为k[0≤k<n(n+1)/2]的位置,则k与i、j之间的关系如下。

在这里插入图片描述
设对称矩阵主对角线以上的元素aij(1≤i≤n,i<j)存储在一维数组B中的下标为t[0≤t<n(n+1)/2]的位置,元素aij的存储下标与它的对称元素aji的存储下标相同,则t与i、j之间的关系如下。

在这里插入图片描述
由此,可以通过下式得到矩阵A的元素。
在这里插入图片描述

稀疏矩阵

稀疏矩阵是非0元素数量很少且分布无规律的矩阵。例如,下面的矩阵A就是一个稀疏矩阵。
在这里插入图片描述
稀疏矩阵中的非0元素很少且分布没有规律,压缩存储时不能用一个统一的公式来概括元素的存储位置。常用三元组表示法来存储稀疏矩阵。

在三元组表示法中,用一个三元组(i,j,v)来表示一个非0元素aij,其中,i是该元素在矩阵中的行号,j是该元素在矩阵中的列号,v是该元素的值。

按照行(或列)优先的顺序,将稀疏矩阵的所有三元组排列起来可以得到一个线性表,线性表的元素为三元组,稀疏矩阵A的三元组线性表如图所示。

在这里插入图片描述

稀疏矩阵的三元组线性表既可以采用顺序存储结构,又可以采用链式存储结构。

广义表

广义表是由有限个元素构成的一个序列。

一个包含 n 个元素 a1,a2,,an的广义表记为 LS=(a1,a2,,an),其中,LS 是广义表名,a1,a2,,an是广义表的元素。

广义表的元素既可以是单个元素,又可以是一个广义表。

如果广义表的元素是单个元素,则称为广义表的原子;
如果广义表的元素是一个广义表,则称为广义表的子表。

习惯上,用小写字母表示原子,大写字母表示子表。

广义表中元素的个数n称为广义表的长度,长度为0的广义表称为空表。

当广义表不为空时,它的第一个元素a1称为广义表的表头,其余元素构成的表(a2,a3,,an)称为广义表的表尾。

广义表的深度是指广义表中括号嵌套的重数。空表和只有原子的广义表的深度都为1。

广义表的示例如下。

  • P=()。该广义表的长度为0,是一个空表。为了叙述方便,空的广义表也可以记为P()。广义表P()的深度为1。
  • Q=(a,b)。广义表Q的长度为2,只包含两个原子。可将其记为Q(a,b)。广义表Q的表头为a,表尾为(b),表头是一个原子,表尾是包含一个元素的子表。广义表Q(a,b)的深度为1。
  • R=(c,Q)。广义表R的长度为2,包含一个原子和一个子表,可记为R(c,Q)。广义表Q的表头为c,表尾为(Q),表头是一个原子,表尾是包含一个子表的子表。广义表R(c,Q)的深度为2。
  • S=((),R,d)。广义表S的长度为3,包含两个子表和一个原子,可记为S((),R,d)。广义表S的表头是(),表尾是(R,v),表头是一个空表,表尾是一个长度为2的子表。广义表S((),R,d)的深度为3。

为了方便交流,可以用直观的图形来表示广义表的逻辑结构,该图称为广义表图。

广义表图包含以下3种元素。

  • 圆圈,用于描述广义表中的子表结点及广义表自身。
  • 方块,用于描述广义表中的原子结点。
  • 连线,用于描述广义表中结点之间的联系。
    在这里插入图片描述

广义表的存储

因为广义表的元素类型可能不一致,不适宜用顺序存储结构来存储广义表,故常常采用链式存储结构来存储广义表。

广义表的3种结点结构如图所示,头结点的类型为0,原子结点的类型为1,子表结点的类型为2。

在这里插入图片描述
广义表空表的表示
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值