大话数据结构笔记二(队列、串、KMP)

本文深入探讨了数据结构中的队列,包括循环队列和链式存储的实现,以及队列的入队、出队操作。此外,文章还详细介绍了字符串的概念及比较方式,并重点讲解了KMP模式匹配算法,包括next数组的构建及其在匹配过程中的应用。
摘要由CSDN通过智能技术生成

(二)队列:

1.队列:允许一端插入(队尾),另一端删除(队头);

先进先出FIFO;

2.ADT:

3.顺序存储——循环队列:

(1)引入两个指针front指向队头元素,rear指向队尾元素的后一个元素;则当f等于r时,是空队列;

(2)循环队列:头尾相接;

(3)满队列:空满判定一致,则规定队列满:数组中还有一个空闲;即(rear+1)%queuesize==front时,队列满;

(4)队列长度计算:(rear-front+queuesize)%queuesize;

(5)循环队列顺序存储:

(6)循环队列初始化:

(7)循环队列求长度:

(8)循环队列入队:队列不满;赋值给队尾;队尾指针rear后移;

(9)循环队列出队:队列不空;头元素赋值取出;front指针后移;

4.队列链式存储:

(1)链队列:只能尾进头出的单链表;

(2)头指针front:指向链队列头结点(队头元素的前一个元素);尾指针rear:指向终端结点(队尾元素);

(3)空队列:front,rear都指向头结点;

(4)链队列结构:结点链表;指向链表的指针front,rear;

(5)链队列入队:

新建结点(队列不会满,只用判断分配内存成功与否);新结点赋值,指向NULL;原队尾元素指向新结点;队尾指针指向新结点;

(6)链队列出队:

队列不空;将欲删除的结点用p暂存;数据返回;让头结点指针(front)指向删除结点的后结点;判断,若此时尾指针也指向p,则队头队尾重合,则删除后将rear指向头结点;

5.在可以确定队列最大长度的情况下,建议循环队列;

五、串:

1.串/字符串:零个/多个字符组成的有限序列;

2.s=”a1a2a3…an”;n为字符长度(0个字符的串称为空串,“”);

空格串:只包含空格的串;

子串与主串:任意个数连续字符组成子序列为子串;

3.串的比较:通过组成字符之间的编码(字符在对应字符集的序号)进行;

(1)相等:长度和对应字符都相等;

(2)不等:逐个字符比较;

4.ADT:

5.串的存储模式:

(1)顺序存储:地址连续存储单元(一般用定长数组);

a.可将长度存在0下标位中;

b.可在末位加/0,遍历得知串长;

(2)链式存储:可以一个结点存多个字符;

6.朴素模式匹配算法:串的定位操作(模式匹配)

(1)对主串每一个字符作为子串开头与要匹配字符串匹配;对主串做大循环,每个开头作要匹配串长度的小循环,直到匹配成功或遍历完毕;

(2)Index:S中存在和T相等的子串,则返回第一个元素的位置;

a.串S,T,长度存储在首位;i定位主串,j定位子串;

b.i小于S的长度且j小于T长度时循环比较;当元素Si和Tj相等时,后移比较;

c.当后移到不能匹配了,跳出小循环,让S串回到刚刚比较位置的下一位(i-j+1),让T串回到首位(1);

d.当j大于T串长度时,跳出大循环;说明匹配成功,子串在S中位置为(i-T0);

e.否则匹配失败,返回0;

7.KMP模式匹配:

(1)构建next数组表示T串;字符个数由前后的相似度决定;

(2)next数组:

a.next[j] = 0 当j=1时

b.next[j] = 1 当j之前的字符串首尾没有匹配的字符时

c.next[j] =首尾的匹配数 +1 当j之前的字符串有首尾匹配的时候

d.举例:ababaaaba

    011(a之前的ab不匹配)

    0112(b之前的aba有1个元素匹配,则1+1=2)

    01123(a之前的abab有2个匹配,1+2=3)

    011234(a之前的ababa有3个匹配,1+3=4)

    011234223

(3)KMP模式匹配算法实现:

a.返回next数组:j标记前缀,i标记后缀;

当前缀为0时,i、j同时自增,将前缀值1赋给后缀所在next2;

b.相当于此时有T和next,它们一一对应;若某个元素b的next为a则说明前后缀的a-1个元素已经匹配上了,此时如果要求下一个元素c的next,不需要从头比较,只需要比较b和下标为a的元素(前缀之前匹配了a-1,现在匹配a)即可;

如果相等则等于上一个next+1;

不相等则前移,比较b的前一个元素和a-1位置的是否相等;

c.在程序中用j指向了前面的元素,用i指向了后面的元素;作自增比较;

相等时,得到i位置的next值为++j;

当不相等时,就回到上一个能前缀匹配的位置(即j=next[j]);

(以上为返回next数组)

a.程序不回溯i了;先依次对应匹配,当匹配不上时,把T数组移动到上一个匹配点(即前面的都能匹配上,只有这个元素不一样);直到前面的也能匹配上,这个元素也可以匹配上为止;

b.继续依次匹配,遍历完T后都一致则完成匹配;T在S中位置即为i现在的位置减去T的长度;

(4)KMP模式匹配改良:合并相同的字符:如果a位字符与它next值指向的b位字符相等,该a位的nextval就指向b位的nextval值,否则就是它自己的next;

(j=j[next]即前移到上一个匹配处,即后缀移动到前缀处,用于求next中适配;j[next]=j即前缀移动到后缀处,用于和主串比较时,通过回溯j减少比较;因为j[next]就是上一个能匹配的地方,即前缀处)

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值