串与数组,广义表

一.认识串

  1. 串的定义:零或多个任意字符组成的有限序列

  2. 子串:串中任意个连续字符组成的子序列(含空串)称为该串的子串。

  3. 真子串:不包含自身的所有子串。可以借鉴集合的所属关系。

  4. 主串:包含子串的串相应地成为主串。

  5. 字符位置:这是很显然的定义。

  6. 子串位置:子串第一个字符在主串中的位置。

  7. 空格串:由一个或多个空格组成的串。

  8. 串相等:当且仅当两个串的长度相等和各个对应位置上的字符都相等。


  9. image.png

二.串的模式匹配算法

算法目的:确定主串中所含子串的第一个字符出现的位置

有两种算法:

BF算法:最简单,最直观,最粗糙。

KMP算法:进阶版,解决了重复性问题。

BF算法不再赘述,这里只介绍KMP算法。https://zhuanlan.zhihu.com/p/83334559

三.特殊矩阵

特殊矩阵的压缩存储

  1. 若多个数据元素的值相同,则只分配一个元素值的存储空间,且零元素不占存储空间。

  2. 对称矩阵,对角矩阵,三角矩阵,稀疏矩阵(矩阵中非零元素的个数较少)等。

(1).对称矩阵,只存储上(下)三角的数据元素。

(2).三角矩阵只存储非零元素

(3).对角矩阵,将非零对角线上的元素按照二维数组的方式存储,坐标轴分别是第几条对角线和列数。

(4).稀疏矩阵,存各非零元的值,行列数及数组的总行列数。

对于稀疏矩阵:

  1. 三元组顺序表法:非零元按照行数 列数 值的三个来存储。

  2. 十字链表法:除了三元组的三个元素,还加上了right(存储同一行中的下一个非零元素的地址)和down(存储同一列中的下一个非零元素的地址)。

四.广义表

广义表是n个元素组成的有限序列,其中每一个ai或者是原子,或者是一个广义表,通常记作LS=(a1,a2,.......an)。

LS为表名。n为表长,习惯上,大写字母表示广义表,小写字母表示原子。

  1. 表头:若广义表非空,则第一个元素a1表示表头,记作head(LS)=a1

  2. 表尾:除表头之外的其他元素组成的表。记作tail(LS)=(a2,a3,.....,an).因此可见,表尾不是一个元素,而是一个子表

广义表的性质

  1. 广义表有相对次序

  2. 广义表的长度定义为最外层所包含元素的个数;如C=(a,(b,c))是长度为二的广义表

  3. 广义表的深度定义为该广义表展开后所含括号的重数

   4.广义表可以作为其他广义表的子表

5.广义表可以是一个递归的表,递归表的深度是无穷值,长度是有限值,如F=(a,F)

五.总结

综上,可以看出,串是线性表内容受到限制时的特例。而数组和广义表都是线性表的推广,数组的每一行每一列都是线性表,广义表的元素都是原子时就是线性表。



猜你喜欢

转载自blog.51cto.com/14961637/2675542