文章目录
- KMP算法
- 数组
- 数组的抽象类型定义
- 数组的顺序存储
- 三维数组
KMP算法
KMP算法设计思想:
利用已经部分匹配的结果而加快模式串的滑行速度,且主串S的指针i不必回溯,可提速到O(n+m);
定义next[j]函数,表明当模式中第j个字符与主串中相应的字符“失配”是,在模式中需重新和主串中该字符进行比较的字符的位置。
//KMP算法
int IndexKMP(SString S, SString T, int pos) {
i = pos, j = 1;
while (i < S.length && j < T.length) {
if (j == 0 || S.ch[i] == T.ch[j]) {
i++;
j++;
}
else {
j = next[j];//i不变,j后退
}
if (j > T.length) {
return i - T.length;//匹配成功
}
else {
return 0;
}
}
}
数组
- 数组:按一定格式排列起来的,具有相同类型的数据元素的集合。
- 一维数组:若线性表中的数据元素为非结构的简单元素。则称为一维数组。
- 一维数组的逻辑结构:线性结构。定长的线性表。
- 声明格式
数据名 变量名称[长度]
; - 二维数组:若一维数组中的数据元素又是一维数组结构,则称为二维数组。
- 声明格式:
数据类型 数据名[行数][列数];
//定义二维数组
//typedef int array2[2][2];
//等价于
typedef int array1[2];//定义的一维数组
typedef array1 array2[2];//定义的一维数组类型的二维数组
体现了二维数组的每一个元素都是一维数组。
- 三维数组:若二维数组中的元素又是一个一维数组,则称为三维数组。
由此类推:若n-1维数组中的元素是一个又一个一维数组结构,则称作n维数组。
结论:线性表结构是数组表结构的一个特例,而数组结构又是线性表结构的拓展。
数组特点:结构固定----定义以后,维数和维界不再改变。
数组基本操作:除了结构的初始化和销毁之外,只有取元素和修改元素。
数组的抽象类型定义
n维数组的抽象类型定义
数据对象,数据关系,基本操作。
二维数组:若一维数组中的数据元素又是一维数组结构,则称为二维数组。
二维数组的逻辑结构:
①非线性结构:每一个数据元素既在一个行表中,又在一个列表中。
②线性结构定长的线性表:该线性表的数据元素也是一个定长的线性表。
数组的顺序存储
1.数组的特点:结构固定----维数和维界不变。
数组的基本操作:初始化,销毁,取元素,修改元素值,一般不做插入和删除操作。
所以,数组一般采用顺序存储结构表示。
注意:数组可以是多维的,但存储数据元素的内存单元地址是唯一的,因此,在存储数组结构之前,需要将多维关系转化为一维关系。
2.二维数组的两种存储方式:
①以行序为主
存储单元是一维结构,而数组是个多维结构,则用一组连续存储单元存放数组的数据元素就有次序问题。
一行一行的用链表连接起来。
②以列序为主
3.二维数组的行序优先表示
以行序为主序:
设数组开始存储的位置LOC(0,0),存储每一元素需要L个存储单位。数组元素a[i][j]的存储位置是:LOC(i,j)=LOC(0,0)+(n*i+j)*L;
三维数组
以页、行、列存放,页优先的顺序存储。
例:a[m1][m2][m3各维元素个数为m1,m2,m3.
下标为i1,i2,i3的数组元素的存储位置:
LOC(i1,i2,i3)=a+i1m2m3+i2*m3+i3;