改进KMP算法(求解nextval数组)
求解nextval数组:
- 当j等于1时,nextval[j]赋值为0,作为特殊标记;
- 当j大于1时:
- 若 P¡ 不等于Pnext[j],则nextval[j] 等于 next[j];
- 若 Pj 等于 Pnext[j],则nextval[j] 等于 nextval[next[j]]。(递归)
void getNext(Str substr, int next[],int nextval[], int next[])
{
int j=1,t=0;
next[1] = 0;
while(j<substr.length)
{
if(t==0 || substr.ch[j] == substr.ch[t])
{
next[j+1] = t+1
if(substr.ch[j+1]!=substr.ch [next[j+1]])
nextval[j+1] = next[j+1];
else
nextval[j+1] = nextval[next[j+1]];
++j;
++t;
}
else
t = nextval[t];
}
}
十一、数组和广义表
(一)、数组的基本概念
数组除了初始化和销毁以外,在数组中通常只有下面两种操作。
- 读操作:给定一组下标,读取相应的数组元素。
- 写操作:给定一组下标,存储或者修改相应的数组元素。
几乎所有的计算机高级语言都实现了数组数据结构,并称之为数组类型。这里以 C/C++语言为例,其中数组数据类型具有以下性质:
- 数组中的数据元素数目固定,一旦定义了一个数组,其数据元素数目不再有增减的变化。
- 数组中的数据元素具有相同的数据类型。
- 数组中的每个数据元素都和一组唯一的下标对应。
- 数组是一种随机存储结构,可随机存取数组中的任意数据元素。
因此,用户可以在C/C++程序中直接使用数组来存放数据,并使用数组的运算符来完成相应的功能。
(二)、数组的存储类型
数组特别适合采用顺序存储结构:将数组所有元素存储在一块地址连续的内存单元中。
- 一维数组
dataType a[n];
//其中dataType为数据类型,如int型
- 二维数组
dataType a[m][n];
//其中dataType为数据类型,如int型
(三)、矩阵
一般用二维数组 int A[m][n]; 相同的元素或者零元素在矩阵中的分布存在一定规律的矩阵称之为特殊矩阵,反之称之为稀疏矩阵。
1. 特殊矩阵
- 对称矩阵
矩阵中的元素满足ai,j= aj,i 的矩阵称之为对称矩阵(矩阵必须是方阵)。 用一维数组存储对称矩阵可只存上三角或下三角部分
- 三角矩阵
所谓上三角矩阵(upper triangular matrix),是指矩阵的下三角部分中的元素均为常数c的n阶方阵。同样,下三角矩阵(lower triangular matrix)是指矩阵的上三角部分中的元素均为常数c的n阶方阵。
三角矩阵用一维数组存储
- 对角矩阵
若一个n阶方阵A满足其所有非零元素都集中在以主对角线为中心的带状区域中,则称其为n阶对角矩阵(diagonal matrix)。其主对角线上、下方各有b条非零元素构成的次对角线,称b为矩阵半带宽,(2b+1)为矩阵的带宽。对于半带宽为b(0≤b≤(n-1)/2)的对角矩阵,其|i-j|≤b 的元素ai,j不为零,其余元素为零。 对于一个按照行优先存储的三对角矩阵,求出第i行带状区域内第一个元素X在一维数组中的下标,假设c存在数组最后一位。
- 当i等于1时,带状区域内第一个元素为矩阵中第一个元素,其在一维数组中下标为0;
- 当i大于1时,第i行之前的元素个数为2+(i-2)x3,则带状区域内第一个元素X在一维数组中的下标为2+(i-2)x3.
2. 稀疏矩阵
当一个阶数较大的矩阵中的非零元素个数s相对于矩阵元素的总个数 t非常小时,即s<<t时,称该矩阵为稀疏矩阵(sparse matrix)。