《大话数据结构》学习笔记--chapter 5

来源:互联网 发布:组态软件学哪个 编辑:程序博客网 时间:2024/06/05 01:54

Chap 5 串

5.2 串的定义

l  串是由零个或多个字符组成的有限序列,又名叫字符串;

l  字符数目称为串的长度;

l  串中任意个数的连续字符组成的子序列称为该串的子串;

l  子串在主串中的位置就是子串的第一个字符在主串中的序号;

 

5.3 串的比较

l  判断C语言中两个串是否相等:必须长度和各个位置对应的字符都相等,才算是相等;

l  其他的例子:hap< happy;happen < happy;

5.4 串的抽象数据类型

ClearString(s);//清空

Concat(T, s1, s2);//用T返回s1和s2组成的新串;

5.5 串的存储结构

5.5.1 串的顺序存储结构

l  用一组地址连续的存储单元来存储串中的字符序列;为每个定义的串变量分配一个固定长度的存储区;一般是用定长数组来定义;

l  在下标为0或最后的位置保存串的长度值;

l  或者在串值后面加一个不计入串长度的结束标记字符,同个遍历获得长度;

l  这种存储结构有缺点;操作时可能超出数组的长度;

5.5.2 串的链式存储结构

与线性表相似;一个结点可以存放多个字符;

5.6 朴素的模式匹配算法

子串定位操作:串的匹配模式;

对主串S做大循环,对每个字符开头做子串T长度的小循环;直到匹配成功或全部遍历完成;

有很多重复比较操作,低效!

5.7 KMP模式匹配算法

5.7.1 KMP模式匹配算法推理

l  经过第一次比较,如果发现主串S和子串T的前N位是相等的,而子串的这前N位又互不相等,那么可以避免N-1次不必要的比较;

l  对于子串中有与首字符相等的字符,也是可以省略一部分不必要的判断步骤;

l  在朴素模式匹配算法中,主串的i值是不断地回溯来完成的,而在KMP模式匹配算法中是不需要回溯的;即i值不可以变小;所以变化的是j值;

l  J值的多少取决于当前字符之前的串的前后缀的相似度;

l  T串各个位置的j值变化定义为一个数组:next,next的长度就是T串的长度;

5.7.2 next数组值推导

l  Next[j]取值:

n  J=1时,next[j] = 0;

n  J由j到j-1串前后缀无相等字符,next[j] = 1;

n  前后缀1个字符相等,next[j]= 2;两个字符相等,next[j]=3;以此类推。。。

²  Next数组的作用是:当出现失配情况S[i] != T[j]时,next[j]就指示使用T中以next[j]为下标的字符与S[i]进行比较;

5.7.3 KMP模式匹配算法实现

 

5.7.4 KMP模式匹配算法改进

对next函数进行改良:nextval

5.7.5 nextval数组值推导

For instance:  T = “ababaaaba”;

先推算出next数组的值;011234223;

J = 1时,nextval[1] = 0;

J = 2 时,next[2]=1;对应T串的第1位的值是a, b!=a,所以nextval[2]= next[2]=1;

J = 4 时,next[4]=2;对应T串的第2位的值是b, b=b, 所以nextval[4]=nextval[2]=1;

J = 7 时,next[7]=2;对应T串的第2位的值是b,a!=b, 所以nextval[7]=next[7]=2;

²  如果a位字符与他next值指向的b位字符相等,则该a位的nextval指向b位的nextval值;如果不等,则该a位的nextval值就是他自己a位的next的值;

原创粉丝点击