文章目录
串(内容受限的线性表),数组和广义表(线性结构的推广
串(0或任意个字符组成的有限序列)
串的定义
- 子串(连续),真字串(不包含自己)
- 主串(包含子串的串)
- 字符位置(字符在序列中的序号)
- 子串位置(子串第一个字符)
- 空格串(由一个或多个空格组成)
- 串相等(空串相等)
案例引入
病毒
串的类型定义,储存结构,运算
顺序存储结构(用得更多,插入删除很少)
# define maxlen 255
typedef struct
{
char ch[maxlen+1];//0一般不存储,一般直接从1开始
int length;/* data */
}SString;
链式存储结构
# define CHUNKSIZE 80 //define by user
typedef struct Chunk
{
char ch[CHUNKSIZE];
struct Chunk *next;/* data */
}Chunk;
typedef struct
{
Chunk *head,*tail;
int curlen;/* data */
}Chunk;
串的模式匹配
- 目的:确认主串中所含子串(模式串)第一次出现的位置
- 种类:BF(Brute-Force),KMP(速度快)
BF算法(简单匹配算法,穷举法)
int index_BF(SString S,SString T){
int i,j=1;
while(i<=S.length&&j<=T.length){
if(S.ch[i]==T.ch[j]){
i++;
j++;
}
else {
i=i-j+2;
j=1;
}
}
if(j>-T.length) return i-T.length;
else return 0;
}
int index_BF(SString S,SString T,int pos){
int i=pos;
int j=1;
while(i<=S.length&&j<=T.length){
if(S.ch[i]==T.ch[j]){
i++;
j++;
}
else {
i=i-j+2;
j=1;
}
}
if(j>-T.length) return i-T.length;
else return 0;
}
算法复杂度O(n*m)
KMP(i不回溯,提速到o(m+n))
- 第一个相当于找最大相同
https://www.bilibili.com/video/BV16X4y137qw/?spm_id_from=333.337.search-card.all.click&vd_source=61b7fa5fc2de0c146c573c35ee4095bb
int index_KMP(SString S,SString T,int pos){
int i=pos;
int j=1;
int next[T.length];
get_next(T,next);
while(i<=S.length&&j<=T.length){
if(S.ch[i]==T.ch[j]||j==0){
i++;
j++;
}
else {
j=next[j];
}
}
if(j>-T.length) return i-T.length;
else return 0;
}
void get_next(SString T, int (&next)[]){
int i=0;
next[1]=0;
int j=0;
while(i<T.length){
if(j==0||T.ch[i]==T.ch[j]){
++i;++j;
next[i]=j;
}
else
j=next[j];
}
}
改进
void get_nextval(SString T, int (&nextval)[]){
int i=0;
nextval[1]=0;
int j=0;
while(i<T.length){
if(j==0||T.ch[i]==T.ch[j]){
++i;++j;
if(T.ch[i]!=T.ch[j]) nextval[i]=j;
else nextval[i]=nextval[j];
}
else
j=nextval[j];
}
}
数组
-按照一定格式排列,具有相同类型的数据元素的集合
抽象数据类型
数组的顺序存储
- 数组结构固定,操作不做插入删除----一般用顺序储存
- 数组多维,所以要解决映射问题
- 一维
- 二维(次序约定)
- 三维(页优先)
特殊矩阵的压缩储存
对称矩阵
- 行序(等差)
三角矩阵
对角矩阵
稀疏矩阵
- 三元组(有序的双下表标法)
- 链式储存(十字链表)
广义表(List),线性表推广
- F为递归表
运算
- 求表头,求表尾
- 链式存储
案例分析与实现
病毒感染检测(查找子串)
- BF
- KMP