串(KMP)、数组、广义表

209 阅读1分钟

本文适合考研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 天,点击查看活动详情