13.数组

目录

一. 基本术语

二. 数组的抽象数据类型定义

三. 数组的顺序存储

四. 矩阵

(1)对称矩阵的存储

(2)三角矩阵的存储

(3)对角矩阵的存储

(4)稀疏矩阵的存储

顺序存储

链式存储


一. 基本术语

数组:按一定格式排列起来的具有相同类型的数据元素的集合。
一维数组:若线性表中的数据元素为非结构的简单元素,则称为一维数组。
一维数组的逻辑结构:线性结构。定长的线性表。

声明格式:数据类型  变量名称[长度];
例: int num[5] ={0, 1,2,3,4};

二维数组:若一维数组中的数据元素又是一维数组结构,则称为二维数组。
二维数组的逻辑结构:特殊的线性结构

  • 非线性结构:每一个数据元素既在一个行表中,又在一个列表中。
  • 线性结构:该线性表的每个数据元素也是一定长的线性表个定长的线性表。

13.数组_第1张图片

声明格式:数据类型  变量名称[行数][列数];

在C语言中,一个二维数组类型也可以定义为一维数组类型(其数组元素类型为一维数组类型),即:typedef elemtype array2[m][n]等价于以下两句:
typedef elemtype array1[n];typedef array1 array2[m];

类似的可以定义三维数组乃至更高维的数组:三维数组:若二维数组中的元素又是一个一维数组,则称作三维数组;n维数组:若n-1维数组中的元素又是一个一维数组结构,则称作n维数组。
线性表结构是数组结构的一个特例,而数组结构又是线性表结构的扩展。
数组特点:结构固定,定义后,维数和维界不再改变。
数组基本操作:除了结构的初始化和销毁之外,只有取元素和修改元素值的操作。

二. 数组的抽象数据类型定义

这里:n为数组的维数,bi为数组第i维的长度,ji为数组元素第i维的下标。显然ji应该在[0,bi-1]之间,因为下标从0开始。

13.数组_第2张图片

13.数组_第3张图片

例如,二维数组可看成有两个前驱,两个后继:

13.数组_第4张图片

三. 数组的顺序存储

数组特点:结构固定——维数和维界不变。数组基本操作:初始化、销毁、取元素、修改元素值。
一般不做插入和删除操作。所以:一般都是采用顺序存储结构来表示数组。
注意:数组可以是多维的,但存储数据元素的内存单元地址是一维的。因此,在存储数组结构之前,需要解决将多维关系映射到一维关系的问题。

一维数组:LOC(i)=\left\{\begin{matrix} LOC(0)=a\\LOC(i)=LOC(i-1)+L=a+i*L \end{matrix}\right.

这里:i是下标,L是每个元素所占字节数,a是数组首地址。

13.数组_第5张图片

二维数组:两种顺序存储方式:

  • 以行序为主序(低下标优先):BASIC,COBOL,PASCAL
  • 以列序为主序(高下标优先):FORTRAN

13.数组_第6张图片

13.数组_第7张图片 以行序为主序

 

13.数组_第8张图片 以列序为主序

以行序为主序:设数组开始存储位置LOC(0,0),存储每个元素需要L个存储单元,则数组元素a[i][j]的存储位置是:LOC(i,j)=\left\{\begin{matrix} LOC(0,0)=a\\LOC(i,j)=a+(n*i+j)L \end{matrix}\right.

把这个公式推广到n维数组:

13.数组_第9张图片

四. 矩阵

矩阵:一个由mxn个元素排成的m行n列的表。矩阵的常规存储方式是将矩阵描述为一个二维数组。矩阵的常规存储的优点是可以对其元素进行随机存取。矩阵运算非常简单;存储的密度为1。

不适宜常规存储的矩阵:值相同的元素很多且呈某种规律分布;零元素多(稀疏矩阵)。

矩阵的压缩存储:为多个相同的非零元素只分配一个存储空间;对零元素不分配空间。

(1)对称矩阵的存储

特点:关于主对角线对称,A^T=A

存储方法:只存储下(或者上)三角(包括主对角线)的数据元素,共占用n(n+1)/2个元素空间。把它们放在一个一维数组sa[n(n+1)/2]中。下图存放了下三角元素,且采用行优先原则:

矩阵元素a_{ij}存放到一维数组下标为k的地方(k从0开始),给出关系式如下:

k=\sum_{a=1}^{i-1}a+j-1=\frac{i(i-1)}{2}+j-1

(2)三角矩阵的存储

特点:对角线以下(或者以上)的数据元素(不包括对角线)全部为c;

13.数组_第10张图片

存储方法:重复元素c共享一个元素存储空间,共占用n(n+1)/2+1个元素空间:sa[n(n+1)/2+1];我们写出矩阵下标i,j和一维数组下标k的关系。

上三角矩阵:k=\left\{\begin{matrix} \frac{(i-1)*(2n-i+2)}{2}+j-i,i\leqslant j\\\frac{n(n+1)}{2},i>j \end{matrix}\right.

下三角矩阵:k=\left\{\begin{matrix} \frac{(i-1)*i}{2}+j-1,i\geq j\\\frac{n(n+1)}{2},i<j \end{matrix}\right.

(3)对角矩阵的存储

特点:在n*n的方阵中,所有非零元素都集中在以主对角线为中心的带状区域中,区域外的值全为0,则称为对角矩阵。常见的有三对角矩阵、五对角矩阵、七对角矩阵等。

存储方法:以对角线位置存储,采用二维数组。

13.数组_第11张图片

(4)稀疏矩阵的存储

稀疏矩阵:矩阵中所有元素,非零元素所占的比例一般不超过5%。

顺序存储

采用(i,j,value)三元组的存储方法,三元组唯一确定矩阵的一个非零元素。为更可靠描述,通常再加一个“总体”信息:即总行数、总列数、非零元素总个数。

13.数组_第12张图片

链式存储

优点:它能够灵活地插入因运算而产生的新的非零元素,删除因运算而产生的新的零元素,实现矩阵的各种运算。在十字链表中,矩阵的每一个非零元素用一个结点表示。
该结点除了(row,col,value)以外,还要有两个域:

  • right:用于链接同一行中的下一个非零元素;
  • down:用以链接同一列中的下一个非零元素。

13.数组_第13张图片

此外我们增设行指针和列指针,这样定量描述一个数组:

13.数组_第14张图片

13.数组_第15张图片

你可能感兴趣的:(数据结构,算法)