1.矩阵和串的定义
(1)矩阵的定义: 数组是由n个相同类型的数据元素构成的有限序列,每个数据元素称为一个数据元素。矩阵是二维数组,可视为其元素也是定长线性表的线性表。
(2)串的定义:串是由零个或多个字符组成的有限序列。一般记为S=‘a1 a2 a3 ...an’(n>=0)
2.特殊矩阵的压缩存储、稀疏矩阵的三元组表示法
(1)压缩存储:指为多个值相同的元素只分配一个存储空间,对零元素不分配存储空间。其目的是为了节省存储空间。
对称矩阵只存储对角线和上三角或下三角的元素。
三对角矩阵,横向记录在一维数组,下标 = 2i + j - 3
(2)三元组表示:(行标,列标,元素值)
3.串的模式匹配
(1)Brute-Force算法:
1 int Index(SString S, SString T){
2 int i=1, j=1;
3 while(i<=S.length && j<=T.length){
4 if(S.ch[i] == T.ch[j]){
5 ++i;
6 ++j;
7 }else{
8 i = i-j+2;
9 j = 1;
10 }
11 }
12 if(j>T.length){
13 return i-T.length;
14 }else{
15 return 0;
16 }
17 }
时间复杂度为:O(mn)
(2)KMP算法:
步骤: (1)求最长相等前后缀
(2)移动位数 = 已匹配的字符数 - 对应的部分匹配值
void get_next(String T, int next[]){
int i=1, j=0; //i代表T的指针,从头移到尾,不存在折返。j代表最大公共前缀的长度。
next[1] = j;
while(i<T.length){
// j如果等于 0那么就代表着已经回溯到了next[0],那就意味着,next[j+1]的最长公共前缀一定是0的;
// 如果是T->elem[i] == T->elem[j],那么及时满足这个条件Pk = Pj,那么有next[j+1] = j+1;
if(j==0 || T.ch[i] == T.ch[j]){
++i;++j;
next[i] = j; //若Pi = Pj, 则next[j+1] = next[j]+1
}else{
j = next[j];
}
}
}
int Index_KMP(SString S, SString T, int next[]){
int i=1, j=1;
while(i<=S.length && j<=T.length){
if(j==0 || S.ch[i]==T.ch[j]){
++i;
++j; //继续比较后继字符
}else{
j = next[j]; //模式串向右移动
}
}
if(j>T.length){
return i-T.length; //匹配成功
}else{
return 0;
}
}