数据结构 数组和广义表

文章目录

  • 1 数组的定义
  • 2 数组的顺序表示和实现
    • 2.1 二维数组
    • 2.2 n维数组
    • 2.3 随机存储结构
  • 3 矩阵的压缩存储
    • 3.1 特殊矩阵
      • 3.1.1 对称矩阵
      • 3.1.2 对角矩阵
    • 3.2 稀疏矩阵
      • 3.2.1 稀疏因子
      • 3.2.2 三元组顺序表
      • 3.2.3 行逻辑链接的顺序表
      • 3.2.4 十字链表
  • 4 广义表的定义
    • 4.1 形式表示
    • 4.2 原子和子表
    • 4.3 表头与表尾
    • 4.4 递归定义
    • 4.5 广义表特点
  • 5 广义表的存储结构
    • 5.1 表结点
    • 5.2 原子结点
  • 6 m元多项式的表示
  • 7 广义表的递归算法
    • 7.1 求广义表的深度
    • 7.2 复制广义表
    • 7.3 建立广义表的存储结构

1 数组的定义

n维数组中含有 ∏ i = 1 n b i \prod _ {i = 1} ^ n b_i i=1nbi个数据元素,每个数据元素都受着n个关系的约束

在每个关系中,元素 a j 1 j 2 ⋯ j n ( 0 ≤ j i ≤ b i − 2 ) a _ {j _ 1 j _ 2 \cdots j _ n}(0 \le j _ i \le b _ i - 2) aj1j2jn(0jibi2)都有一个直接后继元素。

因此,就其单个关系而言,这n个关系仍是线性关系。

  • 与线性表一样,所有数据元素都必须属于同一数据类型。

  • 数组一旦被定义,它的维数和维界就不再改变。因此,除了结构的初始化和销毁之外,数组只有存取元素和修改元素值的操作。

2 数组的顺序表示和实现

由于数组一般不做插入或删除操作,

因此,我们采用顺序存储结构表示数组。

2.1 二维数组

二维数组可以以列序为主序,也可以以行序为主序。

以行序为主序

L O C ( i , j ) = L O C ( 0 , 0 ) + ( b 2 × i + j ) L LOC(i, j) = LOC(0, 0) + (b_2 \times i + j)L LOC(i,j)=LOC(0,0)+(b2×i+j)L

其中, L O C ( i , j ) LOC(i, j) LOC(i,j) a i j a_{ij} aij的存储位置

L O C ( 0 , 0 ) LOC(0, 0) LOC(0,0) a 00 a{00} a00的存储位置,即二维数组 A A A的起始存储位置,也称为基地址或基址。

b 2 b_2 b2在以行序为主序的存储结构时为每行存储元素的个数(列数)

2.2 n维数组

2.3 随机存储结构

由于计算各个元素存储位置的时间相等,所以存取数组中任一元素的时间也相等。

我们称具有这一特点的存储结构为随机存储结构。

3 矩阵的压缩存储

在数值分析中经常出现一些阶数很高的矩阵,同时在矩阵中有许多值相同的元素或者是零元素。

有时为了节省存储空间,可对这类矩阵进行压缩存储。

所谓压缩存储是指:为多个值相同的元只分配一个存储空间;对零元不分配空间

3.1 特殊矩阵

值相同的元素或者零元素在矩阵中的分布具有一定规律

3.1.1 对称矩阵

矩阵中的元满足

a i j = a j i , 1 ≤ i , j ≤ n a_{ij} = a_{ji},1 \le i, j \le n aij=aji,1i,jn

我们可以存储其下三角(包括对角线)中的元。

3.1.2 对角矩阵

所有的非零元都集中在以主对角线为中心的带状区域中。

我们对其可以按照某种原则(或以行为主,或以对角线的顺序)将其压缩存储到一维数组上。

3.2 稀疏矩阵

值相同的元素或者零元素在矩阵中的分布不具有一定规律

3.2.1 稀疏因子

假设在 m × n m \times n m×n的矩阵中,有 t t t个元素不为零。

δ = t m × n \delta = \frac{t}{m \times n} δ=m×nt,称 δ \delta δ为矩阵的稀疏因子

通常认为 δ ≤ 0.05 ( 5 % ) \delta \le 0.05(5\%) δ0.05(5%)时称为稀疏矩阵

3.2.2 三元组顺序表

3.2.3 行逻辑链接的顺序表

3.2.4 十字链表

当矩阵的非零元个数和位置在操作过程中变化较大时,就不宜采用顺序存储结构来表示三元组的线性表。

为此对这种类型的矩阵,采用链式存储结构表示三元组的线性表更为恰当。

4 广义表的定义

顾名思义,广义表是线性表的推广。

4.1 形式表示

广义表一般记作

L S = ( a 1 , a 2 , ⋯   , a n ) LS = (a_1, a_2, \cdots, a_n) LS=(a1,a2,,an)

其中 L S LS LS是广义表 ( a 1 , a 2 , ⋯   , a n ) (a_1, a_2, \cdots, a_n) (a1,a2,,an)的名称, n n n是它的长度

4.2 原子和子表

在线性表的定义中, a i ( 1 ≤ i ≤ n ) a_i(1 \le i \le n) ai(1in)只限于是单个元素。

而在广义表的定义中, a i a_i ai可以是单个元素,也可以是广义表,分别称为广义表 L S LS LS的原子和子表

习惯上,用大写字母表示广义表的名称,用小写字母表示原子。

4.3 表头与表尾

当广义表非空时,称第一个元素 a 1 a_1 a1 L S LS LS的表头(Head),称其余元素组成的表 ( a 2 , a 3 , ⋯   , a n ) (a_2, a_3, \cdots, a_n) (a2,a3,,an) L S LS LS的表尾(Tail)

4.4 递归定义

描述广义表时有用到了广义表的概念

4.5 广义表特点

  • 列表的元素可以是子表,而子表的元素还可以是子表

  • 列表可为其他列表所共享

  • 列表可以是一个递归的表,即列表也可以是其本身的一个子表

  • 任何一个非空列表其表头可能是原子,也可能是列表,而其表尾必定为列表

5 广义表的存储结构

由于广义表中的数据元素可以具有不同的结构,因此通常采用链式存储结构,每个数据元素可用一个结点表示。

5.1 表结点

由标志域、指示表头的指针域和指示表尾的指针域组成

5.2 原子结点

由标志域和值域构成

6 m元多项式的表示

7 广义表的递归算法

7.1 求广义表的深度

7.2 复制广义表

7.3 建立广义表的存储结构

你可能感兴趣的:(始料不及之数据结构)