数组
数组:按-定格式排列起来的具有相同类型的数据元素的集合。
一维数组
- 一维数组:若线性表中的数据元素为非结构的简单元素,则称为一维数组。
- 逻辑结构:线性结构。定长的线性表。
- 声明格式:数据类型 变量名称[长度];eg:int a[10];
二维数组
- 二维数组:若一维数组中的数据元素又是一维数组结构,则称为二维数组。
- 逻辑结构: 非线性结构:每一个数据元素既在一个行表中,又在一个列表中。
- 线性结构:该线性表的每个数据元素也是一定长的线性表个定长的线性表。
- 声明格式:数据类型 变量名称[行数][列数];eg:int num[5][8];
在C语言中,一个二维数组类型也可以定义为一维数组类型(其分量类型为一维数组类型),即:
typedef elemtype array2[m][n];
等价于:
typedef elemtype array1[n];
typedef array1 array2[m];
n维数组
- 三维数组:若二维数组中的元素又是一个一维数组,则称作三维数组。
- n维数组:若n-1维数组中的元素又是一 个一维数组结构,则称作n维数组。
- 数组特点:结构固定定义后, 维数和维界不再改变。
- 数组基本操作:除了结构的初始化和销毁之外,只有取元素和修改元素值的操作。
结论:
线性表结构是数组结构的一个特例,
而数组结构又是线性表结构的扩展。
数组的抽象数据类型定义
数组的顺序存储
因为:
数组特点:结构固定,维数和维界不变。
数组基本操作:初始化、销毁、取元素、修改元素值。一般不做插入和删除操作。
所以:
一般都是采用顺序存储结构来表示数组。
注意:
数组可以是多维的,但存储数据元素的内存单元地址是一维的,因此,在存储数组结构之前,需要解决将多维关系映射到一维关系的问题。
一维数组
例:
有数组定义: int a[5];
每个元素占用4字节,假设a[0]存储在2000单元,a[3]地址是多少?
LOC(0)=a=2000
L=4
LOC(3)=2012
LOC(i)=a+i*L
二维数组
存储单元是一维结构,而数组是个多维结构,则用一组连续存储单元存放数组的数据元素就有个次序约定问题。
两种顺序存储方式:
① 以行序为主序(低下标优先) C、JAVA、BASIC、COBOL和PASCAL
② 以列序为主序(高下标优先) FORTRAN
例:
① 以行序为主序:
设数组开始存储位置LOC(0,0),存储每个元素需要L个存储单元数组元素a[i[j]的存储位置是:
LOC(i, j)= LOC(0,0)+(n*i+j)L
其中,(ni+j)表示在a[i][j]前面所有元素个数
② 以列序为主序:
设数组开始存储位置LOC( 0, 0 ) ,存储每个元素需要L个存储单元数组元素a[i[j]的存储位置是:
LOC(i, j)= LOC(0,0)+(n*j+i)L
其中,(nj+i)表示在a[i][j]前面所有元素个数
多维数组
三维数组
按页/行/列存放,页优先的顺序存储
n维数组
矩阵的压缩存储
- 矩阵:一个由mxn个元素排成的m行n列的表。
- 矩阵的常规存储:将矩阵描述为一个二维数组。
- 矩阵的常规存储的特点: ① 可以对其元素进行随机存取; ② 矩阵运算非常简单; ③ 存储的密度为1。
- 矩阵的压缩存储:为多个相同的非零元素只分配一个存储空间;对零元素不分配空间。
1、什么是压缩存储?
若多个数据元素的值都相同,则只分配一个元素值的存储空间,且零元素不占存储空间。
2、什么样的矩阵能够压缩?
一些特殊矩阵,如:对称矩阵,对角矩阵,三角矩阵,稀疏矩阵等。
3、什么叫稀疏矩阵?
矩阵中非零元素的个数较少(一般小于5%)
对称矩阵
对称矩阵
特点:在nxn的矩阵a中,满足如下性质:aij=aji (1≤i,j≤n)
存储方法:只存储下(或者上)三角(包括主对角线)的数据元素。共占用n(n+1)/2个元素空间。
1+2+3+···+n=n(n+1)/2
三角矩阵
三角矩阵
特点:对角线以下(或者以上)的数据元素(不包括对角线)全部为常数c。
存储方法:重复元素c共享一个元素存储空间,共占用n(n+ 1)/2+1个元素(+1是因为常数c需要占用一个空间)。
空间:sa[1… n(n+ 1)/2+1]
一维数组元素下标k:
对角矩阵
特点:在nxn的方阵中,所有非零元素都集中在以主对角线为中心的带状区域中,区域外的值全为0,则称为对角矩阵。常见的有三对角矩阵、五对角矩阵、七对角矩阵等。
存储方式:
稀疏矩阵
定义:设在mx n的矩阵中有t个非零元素。令δ= t/(mxn),当δ<0.05时称为稀疏矩阵。
压缩存储原则:存各非零元的值、行列位置和矩阵的行列数。
三元组顺序表
顺序存储结构——三元组顺序表又称“有序的双下标法”
- 三元组顺序表的优点:非零元在表中按行序有序存储,因此便于进行依行顺序处理的矩阵运算。
- 三元组顺序表的缺点:不能随机存取。若按行号存取某一行中的非零元,则需从头开始进行查找。
三元组的不同表示方法可决定稀疏矩阵不同的压缩存储方法
三元组(i,j,aij)惟一确定矩阵的一个非零元。
十字链表
链式存储结构——十字链表
- 优点:它能够灵活地插入因运算而产生的新的非零元素,删除因运算而产生的新的零元素,实现矩阵的各种运算。
- 在十字链表中,矩阵的每一 个非零元素用一个结点表示,该结点除了(row, col, value) 以外,还要有两个域:
right:用于链接同一行中的下一个非零元素;
down:用以链接同一列中的下一个非零元素。 - 十字链表中结点的结构示意图:
例: