二十三.串、数组和广义表
- -串的定义
- 零个或多个任意字符组成的有限序列
- 串的术语
- - 子串:一个串中任意连续字符组成的子序列(含空串)叫该串的子串
- - 主串:包含子串的串对应叫主串
- - 字符位置:字符在序列中序号是该字符串中的位置
- - 子串位置:子串第一个字符主串的位子
- - 空格串:由一个或多个空格组成的串;与空串不同
- - 串相等:只有当两个串的长度相等并且各个位置上字符也相同
- - 串的类型定义、存储结构及运算
- - 基本操作
- - StrAssign(&T,chars) //串赋值
- - StrCompare(S,T) //串比较
- - StrLength(S) 求串长
- - Concat(&T,S1,S2) 串连结
- - Substring(&Sub,S,pos,len) 求子串
- - StrCopy(&T,S) 串拷贝
- - StrEmpty(S) 串判空
- - ClearString(&S) 清空串
- - index(S,T,pos) 子串的位置
- - Replace(&S,T,V) 串替换
- - StrInsert(&S,pos,len) 子串删除
- - DestroyString(&S) 串删除
- - 基本操作
- - 顺序存储结构
#define MAXQSIZE 255 //最大队列长度
typedef struct
{char ch[MAXLEN+!]; //存储串的一维数组int length; //串的当前长度
}SString;
- 块链结构
#define CHUNKSIZE 80
typedef struct Chunk
{char ch[CHUNKSIZE];struct Chunk *next;
}Chunk;typedef struct
{Chunk *head,*tail //串的头指针和尾指针int curlen; //串的当前长度
}LString; //字符串的块链结构
- - 串的模式匹配算法
- - 算法目的
- - 确定主串中所含子串(模式串)第一次出现的位置(定位)
- - 算法应用
- - 搜狗引擎、拼写检查、语言翻译、数据压缩
- - 算法种类
- - BF算法
- - 简单匹配算法。采用穷举法
- - Index(S,T,pos)
- - 将主串的第pos个字符和模式串的第一个字符比较
- - 相等,继续逐个比较后续字符
- - 不等,从主串的下一字符起,重新与模式串的第一个字符比较
- - 直到主串的一个连续子串字符序列与模式串相等。返回值为S中与T匹配的子序列第一个字符的序号,则匹配陈宫
- - 否则,匹配是失败,返回值0
- - Index(S,T,pos)
- - 简单匹配算法。采用穷举法
- - BF算法
- - 算法目的
int Index_BF(SString S,SString T)
{int i=1,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; //返回匹配的第一个字符的下标elsereturn 0; //模式匹配不成功
}
- - KMP算法
- - 主串S的指针i不再回溯,提速到O(n+m)
- - 定义next[j]函数,表明当模式中第j个字节与主串中对应字符失配,在模式中需要重新和主串中该字符进行比较的字符位置
- - 数组的顺序存储
- - 数组特点
- - 结构固定——维数和维界不边
- - 数组基本操作
- - 初始化、销毁、取元素、修改元素值。
- - 一般采用顺序存储结构来表示数组
- - 注意:数组可以是多维的,存储数据元素的内存单元地址是一维的,在存储数组结构之前,需要解决将多维关系映射到一维关系
- - 初始化、销毁、取元素、修改元素值。
- - 数组特点
- - 特殊矩阵的压缩存储
- - 矩阵
- - 一个由mxn个元素排成m行n列的表
- - 矩阵的常规存储
- - 将矩阵描述为一个二维数组
- - 矩阵的常规存储特点
- - 可以对元素进行随机存储;矩阵运算非常简单,密度为1
- - 不适宜存矩阵
- - 值相同的元素很多而且呈某种规律分布;零元素多
- - 压缩矩阵
- - 多个数据元素的值相同,只分配一个元素值的存储空间,零元素不占空间
- - 特殊矩阵可以被压缩:对称矩阵、对角矩阵,三角矩阵,稀疏矩阵
- - 对称矩阵
- - 只存储上或下三角的数据元素,占用n(n+1)/2个元素空间
- - 三角矩阵
- - 对角线以下或以上的数据元素(不包括对角线)全部为常数c,重复元素c共享一个元素存储空间,占用n(n+1)/2+1元素空间
- - 对角矩阵
- - 在n x n的方阵中,所有非零元素都集中在以主对角线为中心的带状中,区域外全0.有三对角,五对角,七对角
- - 稀疏矩阵
- - 三元组顺序表(有序的双下标法)
- - 总行数-总列数-非零元素总个数0
- - 优点:非零元在表中按行序有存储,便于进行依行顺序处理的矩阵运算
- - 缺点:不能随机存储,若行号存取某一行中的非零元,则需要从头开始进行查找
- - 三元组顺序表(有序的双下标法)
- - 十字链表
- - 优点:能够灵活地插入因运算产生的新的非零元素,删除因运算而产生的新的零元素,实现矩阵的各种运算
- - 矩阵的每一个非零元素用一个节点表示,结点除了row,col,value以外,还要有两个域
- - ringth:用于链接同一行的下一个非零元素
- - down:用于连接同一行的下一个非零元素
- - 矩阵的每一个非零元素用一个节点表示,结点除了row,col,value以外,还要有两个域
- - 优点:能够灵活地插入因运算产生的新的非零元素,删除因运算而产生的新的零元素,实现矩阵的各种运算
- - 稀疏矩阵:矩阵中非零元素的个数较少(一般少于百分之五)
- - 矩阵
-
- - 广义表
- - 概念
- - 是n>=0个元素a~0,a~1,---,a~n-1的有限序列,其中每个a~i或是原子或一个广义表
- - 性质
- - 广义表中的数据元素有相对次序:一个直接前驱和一个直接后续
- - 广义表的长度取决于广义表最外层所包含的个数
- - 广义表的深度取决于该广义表展开后所包含的重数
- - 原子深度为0,空表深度为1
- - 广义表可以和其他广义表共享
- - 广义表可以使递归的表
- - 递归表深度是无穷的,长度是有限的
- - 广义表是多层次的,元素可以是单元素,可以是子表
- - 概念
- - 广义表
- - 基本运算
- - 求表头GetHead(L):非空广义表的第一个元素,可以是元素和子表
- - 求表尾GetTail(L):非空广义表出去表头元素以外其他元素构成的表,表尾一定是一个表