串偏向于算法,数组和广义表偏向于理解
第四章 串、数组和广义表
4.1 串的定义
串(String)– 零个或多个任意字符组成的有限序列
- 字串:一个串中任意个连续的字符组成的子序列(含空串)称为该串的子串.
- 相当于子集
- 真子串:是指不包含自身的所有子串
- 真子集
- 主串: 包含子串的串相应地称为珠串
- 字符位置 字符在序列中的序号为该字符在串中的位置
- 空格串: 由一个或多个空格组成的串 与子串不同
- 串相等: 当且仅当两个串的长度相等,并且各个对应位置上的字符都相同的时候,这两个串才是相等的.
- 所有空串是相等的
4.2 案例引入
串的运用非常广泛,计算机上的非数值处理的对象大部分是字符串数据,例如:文字编辑,符号处理,各种信息处理系统等.
案例1: 病毒感染检测
- 研究者将人的DNA和病毒的DNA都表示成由一些字母组成的字符串序列
- 然后检测某种病毒DNA序列是否出现在患者的DNA序列里面,如果出现过,则此人感染了这个病毒
- 例如:假设病毒的DNA序列为baa,患者1的DNA序列为aaabbba,则感染,患者2的DNA序列为babbba,则未感染(注意 人的DNA序列是线性的,但是病毒的DNA是环状的)
可以看出,字符串查找很重要,为我们的生活带来了很大的便捷
4.3 串的类型定义,存储结构及运算
4.3.1 串的类型定义
串中的元素逻辑关系与线性表相同,可以采用与线性表相同的存储结构
4.3.2 串的存储结构
物理上的元素的逻辑关系与逻辑上的元素关系一致(不需要额外的指针来表示出串的顺序)
串的顺序存储结构
#define MAXLEN 255
typedef struct{
char ch[MAXLEN + 1];//储存串的一维数组,0号位置闲置不用,这里一定要是字符型
int length;//串的当前长度
}SString
如果我们只用用于存储而不频繁的插入和删除,那么我们就使用这个存储结构的串
串的链式存储结构
优点: 操作方便 缺点: 存储密度低(1/(1+4)=0.2)
还有一种方法,可以大大提高存储密度(4/(4+4) = 0.5)
这里的结点中的数据域可以叫做存储块
因此我们常用下面这种链式存储结构----块链结构
#define CHUNKSIZE 80;//块的大小可由用户定义
typedef struct Chunk{
char ch[CHUNKSIZE];
struct Chunk *next;
}Chunk;//结点
typedef struct{
Chunk *head,*tail;
int curlenl;
}LString //字符串的块链结构
4.3.3 串的模式匹配算法
算法目的:
确定主串中所含的字串第一次出现的位置(定位)
算法应用:
- 搜索引擎,拼写检查,语言翻译,数据压缩
算法种类
- BE算法(Brute-Force,又称古典的,经典的,朴素的,穷举的)
- KMP算法(特点:速度快)
BF算法
简称简单匹配算法。采用穷举法的思想