串的存储结构
顺序存储
定长顺序存储
串长也为结构体的一部分
1 |
|
堆式顺序存储结构
1 | typedef struct{ |
链式存储
链式存储结构
特点:
- 存储密度小
- 方便插入删除
1
2
3
4
5
6
7
8
9
typedef struct Chunk{
char ch[CHUNKSIZE];
struct Chunk *next;
}Chunk;
typedef struct{
Chunk *head,*tail;//出头指针外,可附设一个尾指针,指示链表的最后一个节点,并给出链表长度。如此定义的串存储结构称为块链结构
int length;
}
串的模式匹配算法
BF算法
1 | int Index_BF(SString S,SString T,int pos){ |
分析:设子串m,主串n
- 最好情况下,每趟不匹配的字符都发生在第一个
- 前i-1趟中对子串:i-1 + m 次
- 对主串:由1到n-m+1
平均此次数为:(m+n)/2;
- 最坏情况下,每趟不匹配的字符都发生在最后一个
- 前i-1趟:(i-1)*m次,第i趟:m次
- 对主串:由1到n-m+1
平均次数为:m*(n-m+2)/2;
- 由于每次不匹配时都要回溯,造成算法时间复杂度较高*
KMP算法
1
2
3
4
5
6
7
8
9
10
11
12int Index_KMP(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];//模式串向右移动
}
}
if(j>T.length ) return i-T.Length;
else return 0;
}
计算next函数值
next函数的值取决于模式串本身,而和相匹配的主串无关
1 | void get_next(SString T,int next[]){ |
计算next函数修正值
你不上面next的某些缺陷具体看图
1 | void get_nextval(SString T,int nextval[]){ |
你真厉害,摩拜