数据结构之数组|特殊矩阵压缩

数组

数组:按一定格式排列起来的,具有相同类型的数据结构的集合。

一维数组
一维数组:若线性表中的数据元素为非结构的简单元素,则称为一位数字。
一维数组的逻辑结构:线性结构。定长的线性表。
声明格式:数据类型 变量名称[长度];
例:int num[5] = {0,1, 2, 3, 4};

二维数组
二维数组:
若一维数组中的数据元素中的又是一维数组结构,则称为二维数组。
二维数组的逻辑结构:
1.非线性结构:每一个数据元素既在一个行表中,又在一个列表中。
2.线性结构(定长的线性表):该线性表的每个数据元素也是一个定长的线性表。
声明格式:数据类型 变量名称[行数][列数];
例:int num[5][7];

数组的类型定义

在C语言中,一个二维数组类型也可以定义为一维数组类型(其分量类型为一维数组类型),即:
typedef elemtype array2[m][n];
等价于:
typedef elemtype array1[n];
typedef array1 array2[m];
三位数组:若二维数组中的元素又是一个一维数组,则称作三维数组。
同理可得,n维数组,若n-1维数组中的元素又是一个一维数组结构,则称为n维数组。
在这里插入图片描述

结论: 线性表结构是数组结构的一个特例,而数组结构又是线性表结构的扩展。

数组特点: 结构固定,定义后维数和维界不再改变。
数组基本结构:除了结构的初始化和销毁之外,只有取元素和修改元素值的操作。

n维数组的抽象数据类型:
在这里插入图片描述

数组的顺序存储

数组特点: 结构固定,定义后维数和维界不再改变。
数组基本操作:初始化、销毁、取元素和修改元素值。一般不做插入和删除操作。

由于数组的特点和基本操作,我们一半都是采用顺序存储结构来表示数组。

注意:数组可以是多维的,但存储数据元素的内存单元地址是一维的,因此,在存储数据结构之前,需要解决将多维关系映射到一维关系的问题。

二维数组:
在这里插入图片描述

在这里插入图片描述
以行为主序的存储结构为例
假设每个数据元素占L个存储单元,则二维数组A[0…m-1,0…n-1](即下标从0开始,共有m行n列)中任一元素aij的存储位置可有下式确定:
LOC(i , j) = LOC(0 , 0) + (n * i + j) L
式中,LOC(i,j)是aij的存储位置;LOC(0,0)是a00的存储位置,即二维数组A的起始存储位置、也称为基地址或基址。

由上式可以推广得出:n维数组的某一元素的存储位置公式:
在这里插入图片描述
式中称为n维数组的映像函数,数组元素的存储位置是其下标的线性函数,一旦确定了数组各维的长度,ci就是常数。由于计算各个元素存储位置的时间相等,所以存取数组中任一元素的时间也相等,即数组是一种随机存取结构。

举例:
在这里插入图片描述

特殊矩阵的压缩存储

矩阵:一个由m*n个元素排列成的m行n列的表。
在这里插入图片描述
矩阵的常规存储:将矩阵描述为一个二维数组。
矩阵的常规存储的特点:可以对其元素进行随机存取;
矩阵运算非常简单,存储的密度为1。
不适宜常规存储的矩阵:值相同的元素很多且呈某种规律分布;零元素多
矩阵的压缩存储:为多个相同的非零元素只分配一个存储空间;对零元素不分配空间。
在这里插入图片描述

1.对称矩阵

特点:在n*n的矩阵a中,满足如下性质:
aij = aji (i<= i, j <= n)
存储方法:只存储下(或者上)三角(包括主对角线)的数据元素。共占用n(n+1)/2个元素空间。
在这里插入图片描述
对称矩阵的存储结构:
对称矩阵上下三角中的元素均为:n(n+1) / 2
可以以行序为主序将元素存放在一个一维数组sa[n(n+1) / 2]中。

2.三角矩阵

在这里插入图片描述

3.对角矩阵(带状矩阵)

在这里插入图片描述
在这里插入图片描述
以主对角线为0,进行存储。右上递减,左下递增。

稀疏矩阵存储

稀疏矩阵:设在m*n的矩阵中有y个非零元素。
在这里插入图片描述
压缩存储原则:存各非零元的值、行列位置和矩阵的行列数。
三元组的不同表示方法可决定稀疏矩阵不同的压缩存储方法。
1.三元组顺序表
在这里插入图片描述
三元组顺序表又称有序的双下标法。
三元组顺序表的优点:非零元素在表中按
行序
有序存储,因此便于进行依行顺序处理的矩阵运算。
缺点:不能随机存取。若按行号存取某一行中的非零元,则需从头开始进行查找。
2.稀疏矩阵的链式存储结构:十字链表

  • 优点:它能够灵活地插入因运算而产生地新的非零元素,删除因运算而产生的新的零元素,实现矩阵的各种运算。
  • 在十字链表中,矩阵的每一个非零元素用一个结点表示,该结点除了(row,col,value)以外,还要有两个域:
    • right:用于链接同一行中的下一个非零元素。
    • down:用以链接同一列中的下一个非零元素。
  • 十字链表中结点的结构示意图:
    在这里插入图片描述
    举例:
    在这里插入图片描述
    M为头指针;
    在这里插入图片描述
原创文章 50 获赞 139 访问量 2万+

猜你喜欢

转载自blog.csdn.net/diviner_s/article/details/105361305