目录
压缩对象:一些特殊矩阵,如:对称矩阵,对角矩阵,三角矩阵,稀疏矩阵等。对称矩阵
串
串是内容受限(规定里面的数据元素只能是字符)的线性表。
串的定义:
相关概念:
空串与空格串的区别:
空格串里是空格
空串里什么都没有,连空格也没有
所有空串都是相等的
串的类型定义:
其中最重要的就是——查找子串的位置(Index(S,T,pos),用 BF算法 或者是 KMP算法。
串的存储结构:
MAXLEN+1是代表最多能存储256个数据元素,下标为0到255,其中为了处理方便,下标为0的位置不存元素,从下标为1的位置开始存
存储密度的计算:
像上图第一种(一个节点只存一个字符):其存储密度=1/(1+4)=0.2(其中1代表一个字符占一个字节的空间,4表示其存储的地址为int型,占4个字节的空间,所以总共占(1+4)个字节空间,所以就除以5)
像上图第二种(一个节点存四个字符):其存储密度为=4/(4+4)=0.5(其中4个字符占4个字节的空间,地址为int型也占4个字节的空间,总共占8字节空间
可以看到存储密度增大了,那如果一个节点存储更多字符的话(比如存储50个)它的存储密度将大大提高。
实际情况中,顺序存储结构用的更多,因为实际中需要对字符串进行插入和删除的操作的是非常少的。
数组:
数组特点:
结构固定——定以后,维数(如二维数组)和维界(数组长度,有上界和下界)不再改变。
数组的基本操作:
除了结构的初始化和销毁之外,只有取元素和修改元素值的操作。
维数和维界是固定不变的,所以它的元素个数固定不变,一般不会进行插入和删除的操作
数组的抽象数据类型:
数组基本操作::
初始化、销毁、取元素、 修改元素值。一般不做插入和删除操作。所以:-般都是采用顺序存储结构来表示数组。
注意:数组可以是多维的,但存储数据元素的内存单元地址是一维的,因此,在存储数组结构之前,需要解决将多维关系映射到一维关系的问题。
例如:
二维数组:
二维数组元素位置的计算:
如:
以上图中的a[2][1]为例:
存储位置为:其上面有2行,每一行有n个元素,所以共有2*n个元素,然后加上其前面有1个元素,所以其前面总共有2*n+1个元素,再去乘以每个元素所占的空间L,再加上第一个元素(a[0][0])的地址(位置),就得到了该元素a[2][1]的地址(位置)。
三维数组:
三维数组元素位置的计算:
示意图:
计算:
n维数组元素位置的计算:
特殊矩阵的压缩存取:
概念:
压缩对象:一些特殊矩阵,如:对称矩阵,对角矩阵,三角矩阵,稀疏矩阵等。
对称矩阵:
定义:关于主对角线对称(主对角线两边的元素值相等)。
将黄色区域的元素(包括对角线上的)都取出来存到一个一维数组当中,那么某个元素在一维数组中存的位置怎么计算呢?
元素在一维数组中存储位置的计算:
例如:
以上图中的a[n][2]为例:
存储位置:其上面有n-1行,其中第1行有1个元素,第2行有2个...第n-1行有n-1个元素,所以上面的n-1行有(1+2+3+...+n-1)= n*(n-1)/2 个元素,而其前面有1个元素,所以其前面总共有 n*(n-1)/2+1 个元素,由于下标是从0开始的,所以该元素在一维数组中存在下标为 n*(n-1)/2 的位置。
三角矩阵:
它的元素(重复的常数c只存一个)也都存储在一个一维数组当中,元素存储位置的计算与上面的对称矩阵的计算方法类似。
对角矩阵:
可以看到,它其中的元素(0只存一个)如果存储在一维数组当中的话,元素在一维数组中的存储位置是不容易计算的,所以为了方便,我们将这些元素都存到一个二维数组中去,像下面这样:
有5条对角线,所以称为五对角矩阵。以最中间那条对角线为中心,依次向二位数组的上下对称着存每一条对角线。
稀疏矩阵:
概念:矩阵中非零元素的个数较少(-般小于5%)。
存储方法:
三元组存储:
还原三元组所表示的稀疏矩阵:
三元组顺序表又称有序的双下标法。
三元组顺序表的优点:非零元在表中按行序有序存储,因此便于进行依行顺序处理的矩阵运算。
三元组顺序表的缺点:不能随机存取,若按行号存取某一行中的非零元,则需从头开始进行查找。
稀疏矩阵的链式存储表示——十字链表:
row表示该元素在第row行,col表示该元素在第col列,value代表该元素的值。
例子:
1.
2.
其中M.chead表示列指针(存储列上不为0的元素),M.rhead表示行指针(存储行上不为0的元素)。
广义表:
与线性表的区别:
广义表里面的元素不一定是同一类型的,而线性表里面的元素都是同一种类型的(如int型)。
广义表的性质:
(1)广义表中的数据元素有相对次序:一个直接前驱和一个直接后继。
广义表的基本运算:
(1)求表头GetHead(L):非广义表的第一个元素,可以是一个原子,也可以是一个子表。
(2)求表尾GETTail(L):非广义表除去表头元素以外其它元素所构成的表,表尾一定是一个表。
例:
广义表不能用数组来存储,原因是数组中元素占连续的空间,每个元素都是同样大小的,而现在的广义表中的元素不是同样大小的,所以没有办法用数组来存储,所以广义表一般都用链式存储结构来存储。