数组的概念
数组:按一定格式排列起来的,具有相同类型的数据元素的集合。
一维数组
一维数组:若线性表中的数据元素为非结构的简单元素,则称为一维数组。
一维数组的逻辑结构:线性结构。定长的线性表。
声明格式:数据类型 变量名称[长度];
a[0]~a[4]分别是0,1,2,3,4
二维数组
二维数组:若一维数组中的数据元素又是一维数组结构,则称为二维数组。
为什么可以看成是非线性结构,因为每个元素,例如a11在行表中有前驱和后继,在列表中也有前驱和后继,不满足一对一的关系。
声明格式:
数据类型变量名称[行数][列数];
例:int num[5][8];
总共5x8=40个元素空间
行的下标范围:0~4
列的下标范围:0~7
结论:线性表结构是数组结构的一个特例,而数组结构又是线性表结构的扩展。
数组特点:结构固定——定义后,维数和维界不再改变。
数组基本操作:除了结构的初始化和销毁之外,只有取元素和修改元素的操作。
n维数组的抽象数据类型
ADT Array{
}
例:二维数组的抽象数据类型的数据对象和数据关系的定义
n=2(维数为2,二维数组)
b1:第一维长度(行数)b2:第二维长度(列数)
数组的基本操作
数组的顺序存储结构
因为
(1)数组特点:结构固定——维数和维界不变。
(2)数组基本操作:初始化、销毁 、取元素、修改元素值。
一般不做插入和删除操作。
所以,一般都是采用顺序存储结构来表示数组。
注意:数组可以是多维的,但存储数据元素的内存单元地址是一维的,因此,在存储数组结构之前,需要解决将多维关系映射到一维关系的问题。
存储单元是一维结构,而数组是个多维结构,则用一组连续存储单元存放数组的数据元素就有个次序约定问题。
需要解决的问题是我们怎么用顺序存储的方式将第几行第几列的元素表示出来?
以行序为主序:
设数组开始存储位置LOC(0,0),存储每个元素需要L个存储单元,数组元素a[i][j]的存储位置是:LOC(i,j)=LOC(0,0)+(n*i*j)*L
三维:
n维数组:
特殊矩阵的压缩存储
矩阵:一个由m x n个元素排成的m行n列的表。
矩阵的常规存储:
将矩阵描述为一个二维数组。
矩阵的常规存储的特点:
可以对元素进行随机存取;
矩阵运算非常简单,存储的密度为1。
不适宜常规存储的矩阵:值相同的元素很多且呈某种规律分布;零元素多,这样比较浪费空间。
矩阵的压缩存储:为多个相同的非零元素只分配一个存储空间;对零元素不分配空间。
1、什么是矩阵的压缩存储呢?
若多个数据元素的值都相同,则只分配一个元素的存储空间,且零元素不占存储空间。
2、什么样的矩阵能够压缩?
一些特殊的矩阵,如:对角矩阵、对称矩阵、三角矩阵、稀疏矩阵(非零元素的个数较少)等。
(1)对称矩阵
【特点】在n x n的矩阵a中,满足如下性质:
aij = aji(1<=i,j<=n)
【存储方法】只存储下(或者上)三角(包括主对角线)的数据元素。共占用n(n+1)/2个元素空间。
对称矩阵的存储结构:
对称矩阵上下三角中的元素数均为:
n(n+1)/ 2(利用等差数列的计算公式)
可以以行序为主序将元素存放在一个一维数组sa[n(n+1)/2]中。
元素aij的存储位置为:前面有(i-1)行,所以是1+2+3+...+(i-1),然后是第j列,前面i行的元素(利用等差数列公式)总个数再加(j-1)个元素再加上初始位置就是aij元素的位置。
三角矩阵的压缩存储:
【特点】对角线以下(或者以上)的数据元素(不包括对角线)全部为常数c。
【存储方法】重复元素c共享一个元素存储空间,共占用n(n+1)/2+1个元素空间:sa[n(n+1)/2+1]
对角矩阵(带状)的压缩存储:
【特点】在n x n的方阵中,所有非零元素都集中在以主对角线为中心的带状区域中,区域外的值全为0,则称为对角矩阵。常见的有三对角矩阵、五对角矩阵、七对角矩阵等。
【存储方法】
- 以对角线的顺序存储
稀疏矩阵存储
稀疏矩阵:设在m x n的矩阵中有t个非零元素。
压缩存储原则:存各个非零元素的值、行列位置和矩阵的行列数。
三元组的不同表示方法可决定稀疏矩阵不同的压缩存储方法。
三元组顺序表又称有序的双下标法。
三元组顺序表的优点:非零元在表中按行序有序存储,因此便于进行依次顺序处理的矩阵运算。
三元组顺序表的缺点:不能随机存取。若按行号存取某一行中的非零元,则需从头开始进行查找。
稀疏矩阵的链式存储结构:十字链表
优点:它能够灵活地插入因运算而产生的新的非零元素,删除因运算而产生的新的零元素,实现矩阵的各种运算。
在十字链表中:在十字链表中,矩阵的每一个非零元素用一个结点表示该结点除了(row,col,value)以外,还要有两个域: