【KMP算法,数组】

文章目录

  • KMP算法
  • 数组
    • 数组的抽象类型定义
    • 数组的顺序存储
    • 三维数组

KMP算法

KMP算法设计思想:
利用已经部分匹配的结果而加快模式串的滑行速度,且主串S的指针i不必回溯,可提速到O(n+m);
定义next[j]函数,表明当模式中第j个字符与主串中相应的字符“失配”是,在模式中需重新和主串中该字符进行比较的字符的位置。
【KMP算法,数组】_第1张图片

//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;
		}
	}
}

数组

  • 数组:按一定格式排列起来的,具有相同类型的数据元素的集合。
  • 一维数组:若线性表中的数据元素为非结构的简单元素。则称为一维数组。
  • 一维数组的逻辑结构:线性结构。定长的线性表。
  • 声明格式数据名 变量名称[长度];
  • 二维数组:若一维数组中的数据元素又是一维数组结构,则称为二维数组。
    【KMP算法,数组】_第2张图片
  • 声明格式:数据类型 数据名[行数][列数];
//定义二维数组
//typedef int array2[2][2];
//等价于
typedef int array1[2];//定义的一维数组
typedef array1 array2[2];//定义的一维数组类型的二维数组

体现了二维数组的每一个元素都是一维数组。

  • 三维数组:若二维数组中的元素又是一个一维数组,则称为三维数组。
    由此类推:若n-1维数组中的元素是一个又一个一维数组结构,则称作n维数组。
    结论:线性表结构是数组表结构的一个特例,而数组结构又是线性表结构的拓展。
    数组特点:结构固定----定义以后,维数和维界不再改变。
    数组基本操作:除了结构的初始化和销毁之外,只有取元素和修改元素。

数组的抽象类型定义

n维数组的抽象类型定义
数据对象,数据关系,基本操作。
二维数组:若一维数组中的数据元素又是一维数组结构,则称为二维数组。
二维数组的逻辑结构:
①非线性结构:每一个数据元素既在一个行表中,又在一个列表中。
②线性结构定长的线性表:该线性表的数据元素也是一个定长的线性表。

数组的顺序存储

1.数组的特点:结构固定----维数和维界不变。
数组的基本操作:初始化,销毁,取元素,修改元素值,一般不做插入和删除操作。
所以,数组一般采用顺序存储结构表示。
注意:数组可以是多维的,但存储数据元素的内存单元地址是唯一的,因此,在存储数组结构之前,需要将多维关系转化为一维关系。
2.二维数组的两种存储方式:
①以行序为主
存储单元是一维结构,而数组是个多维结构,则用一组连续存储单元存放数组的数据元素就有次序问题。
【KMP算法,数组】_第3张图片
一行一行的用链表连接起来。

②以列序为主
【KMP算法,数组】_第4张图片
3.二维数组的行序优先表示
以行序为主序:
设数组开始存储的位置LOC(0,0),存储每一元素需要L个存储单位。数组元素a[i][j]的存储位置是:LOC(i,j)=LOC(0,0)+(n*i+j)*L;

三维数组

以页、行、列存放,页优先的顺序存储。
【KMP算法,数组】_第5张图片
例:a[m1][m2][m3各维元素个数为m1,m2,m3.
下标为i1,i2,i3的数组元素的存储位置:
LOC(i1,i2,i3)=a+i1m2m3+i2*m3+i3;

你可能感兴趣的:(算法)