串、数组、广义表 知识点总结

目录

 

串的定义

相关概念

空串与空格串的区别

串的类型定义

串的存储结构

存储密度的计算

数组

 

数组特点

数组的基本操作

数组的抽象数据类型

数组基本操作:

二维数组

二维数组元素位置的计算

三维数组

 三维数组元素位置的计算

 n维数组元素位置的计算

特殊矩阵的压缩存取

压缩对象:一些特殊矩阵,如:对称矩阵,对角矩阵,三角矩阵,稀疏矩阵等。对称矩阵

 三角矩阵

对角矩阵

稀疏矩阵

广义表

与线性表的区别

广义表的性质

广义表的基本运算


串是内容受限(规定里面的数据元素只能是字符)的线性表。

串的定义

相关概念:

空串与空格串的区别

空格串里是空格

空串里什么都没有,连空格也没有

所有空串都是相等的

串的类型定义:

 其中最重要的就是——查找子串的位置(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):非广义表除去表头元素以外其它元素所构成的表,表尾一定是一个表。

例:

广义表不能用数组来存储,原因是数组中元素占连续的空间,每个元素都是同样大小的,而现在的广义表中的元素不是同样大小的,所以没有办法用数组来存储,所以广义表一般都用链式存储结构来存储。

发布了23 篇原创文章 · 获赞 30 · 访问量 8676

猜你喜欢

转载自blog.csdn.net/l218623/article/details/104220405