算法与数据结构 --- 串,数组和广义表 --- 串

第一部分 --- 串的定义

 

 

1.主串和子串的关系和集合跟子集之间的关系类似但不相同,主串的子串必须是由主串中连续的字符组成的!!!,真子串是不包含主串本身的所有子串

1.字符位置是:串从左往右,从1开始给字符编号 


第二部分 --- 串的抽象类型定义,存储结构及运算

 

 

1.串的逻辑结构是线性结构,而线性结构能够使用的存储结构有顺序存储结构和链式存储结构,于是我们可以得到串的两种形式:1.顺序串;2.链串

1.规定数组中要存储MAX个字符元素时,我们在创建数组的时候并不是直接创建一个具有MAX个元素的数组,而是创建一个能够存储MAX + 1 个字符的数组,此时数组中的下标范围是:

[0] ~ [MAX] ,其中下标为0的元素空着,我们从[ 1 ]开始存储元素

上面这样的创建方式能够方便一些算法的实现。

2.为串创建的数组的类型规定是字符类型(char)

1.为了提高存储密度,我们可以在一个结点中存储多个数据域,此时这样的一个结点被称为块

(存储密度 = 所有数组域占的内存空间之和 / 结构占的总的内存空间)

1.由块组成的链表称为块链(块:chunk)

2.对于串而言用的最多的存储结构是:顺序存储结构


第三部分 --- 串的模式匹配算法

 

 

 i - j + 2 这个公式的由来:

1. i - j 会回到比较起点的上一个元素,+1 回到比较原点,再+1去到下一次比较的起点

1. t.length 是模式串(子串)的长度,匹配成功后子串在主串中的起点是:

匹配结束点的下标 i - t.length

1.匹配成功后返回的是子串中第一个字符在主串中的序号(下标)

上面这个算法中的第二个if判断里不能够有等号,匹配成功的标志应该是 j > T.length,只有大于了才代表匹配成功了

 一般而言,子串的长度都远小于主串,所以我们可以认为这个算法的时间复杂度是 O(n*m)


第四部分 --- KMP算法

1.加快模式串滑动速度的意思是让模式串不用每一次比较都得将自己的指针指回起始元素,然后再开始比较,而是让它根据已经匹配好的结果指向更加合理的位置,然后从这个更加合理的位置开始进行比较,这样就不用每次都笨笨的回到起点然后重新一个个比了

next 数组中存放的是在子串中任意一个位置比较失败的时候时,子串中的指针应该回退到的位置

当我们在子串中比较到第 j 个元素时若比较失败的话,则我们回退到子串中的第 next [ j ] 个元素继续进行比较

 

这个其实就是在找子串中我们比较失败的第 j 个字符前面那部分的字符串有没有前缀和后缀相等,如果有的话其中最大的前缀的长度是多少(长度就是指前缀的字符个数,由于前缀和后缀相等,所有前后缀的字符个数一样),这个最大的字符个数 + 1后,就是我们想要的K了

 

 (上面的循环条件中小于应该改为小于等于)

1.有了这个next数组KMP算法就能够实现两个最重要的功能了:

一.主串中的比较不需要回退,可以直接从比较失败的位置继续比下去

二.子串中的回退不需要每次都回退到第一个元素,而是根据next数组回退到更合理的位置

nextval数组是对next数组的优化 --- 直接跳过了中间的连续回退过程,直接来到最终回退结果

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值