本文适合考研408和初学数据结构的朋友,主要讲了字符串、数组和广义表的一些操作。对于KMP算法,可以提高字符串子串查询效率,对于数组矩阵的压缩,可以联想到压缩文件。
串的概念与结构
串的存储结构
顺序存储
链式存储
串的基本操作与实现
求子串
比较操作
定位操作
简单模式匹配算法(BF算法)
KMP算法
由D.E.Knuth,J.H.Morris和V.R.Pratt提出,因此称为KMP算法。
暴力搜索的耗时处
朴素模式匹配算法中,主串与子串在后面对比失败后,都进行了大量的回溯,主串回溯到下一个字符与子串从头进行对比。
优化思路(减少回溯)
KMP算法
求next数组(408只考手算)
注:本例的所有字符串都是从数组下标为1的位置开始。如有从0开始,可能稍有不同,可以参照分析一下。
void get_next(SString T,int next[]) {
int i=1,j=0;
next[1]=0;
while(i<T.length) {
if(j==0||T.ch[i]==T.ch[j]) {
++i;
++j;
next[i]=j;
} else {
j=next[j];
}
}
}
改进版nextval数组(408不考)
特殊矩阵的压缩与存储
数组的定义与存储结构
数组是由n(n≥1)个相同类型的数据元素构成的有限序列,每个数据元素称为一个数组元素,每个元素在n个线性关系中的序号称为该元素的下标,下标的取值范围称为数组的维界。
数组与线性表的关系:数组是线性表的推广。一维数组可视为一个线性表;二维数组可视为其元素也是定长线性表的线性表,以此类推。数组一旦被定义,其维数和维界就不再改变。因此,除结构的初始化和销毁外,数组只会有存取元素和修改元素的操作。
大多数计算机语言都提供了数组数据类型,逻辑意义上的数组可采用计算机语言中的数组数据类型进行存储,一个数组的所有元素在内存中占用一段连续的存储空间。
对于多维数组,有两种映射方法:按行优先和按列优先。
对称矩阵的压缩
如下是从数组0开始编址存储的。元素下标ij是从(1,1)开始的。对于从数组1开始的,分别代入i=i+1和j=j+1
三角矩阵的压缩
下三角矩阵的压缩
上三角矩阵的压缩
三对角矩阵的压缩
稀疏矩阵的压缩
广义表
广义表基本概念
广义表的存储结构
开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 9 天,点击查看活动详情