版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
字符串这一章的大体框架为:
1、模式匹配算法(BF,KMP)
2、多维数组的寻址,存储表示法
3、矩阵的压缩存储
一、模式匹配算法
1、所谓的BF算法,就是逐个比较的暴力方法,时间复杂度为O(n*m),比较低效。
当待匹配串与模式串不匹配时,从头开始待匹配串向后移一位,再比较。
2、KMP
利用最长公共前后缀的特点,每次匹配失败后不需要从头开始。需要预先处理出前缀表,根据前缀表来判断匹配失败后应该从待匹配串的哪个位置开始匹配,时间复杂度O(N+M)
#include<bits/stdc++.h>
using namespace std;
int Next[1000];
int Kmp_Search(char* s, char* p)
{
int i = 0;
int j = 0;
int sLen = strlen(s);
int pLen = strlen(p);
while (i < sLen && j < pLen)
{
if (j == -1 || s[i] == p[j])
{
i++;
j++;
}
else
{
j = Next[j];
}
}
if (j == pLen)
return i - j;
else
return -1;
}
void Get_Next(char* p,int* next)
{
int pLen = strlen(p);
next[0] = -1;
int k = -1;
int j = 0;// ABCDABD
while (j < pLen - 1){
if (k == -1 || p[j] == p[k]){
++k;
++j;
next[j]=k;
}
else k = next[k];
}
}
int main()
{
}
二、多维数组
数组无法改变自身的结构,数组是一个统一的整体,但是线性表可以。
数组是由一组类型相同的数据元素构成的有序集合,每个元素受n(n≥1)个线性关系的约束,并称该数组为 n 维数组。
数组没有插入和删除操作,所以,不用预留空间,适合采用顺序存储。
一维数组:Loc(ai)=Loc(al)+(i-l)×c
二维数组:
行优先:整行数×每行元素个数+本行中aij前面的元素个数=(i -l1)×(h2 -l2+1)+(j -l2)
列优先: LOC ( i, j ) = a + ( j *n +i ) * l
常用的映射方法有两种:
按行优先:先行后列,先存储行号较小的元素,行号相同者先存储列号较小的元素。
按列优先:先列后行,先存储列号较小的元素,列号相同者先存储行号较小的元素。
三、矩阵的压缩存储
1、对称矩阵:、
aij在一维数组中的序号
= i×(i+1)/2+ j+1
∵一维数组下标从0开始
∴aij在一维数组中的下标
k= i×(i+1)/2+ j
2、三角矩阵:
(i-1)×(n+n-i+2)/2+j-i
i<=j
n×(n+1) /2
i>j
3、对角矩阵(带状)
k=(3*(i-1)-1)+(j-i+1)
k=2i+j-3