数据结构与算法_杂记_1

1、堆串:串的堆存储结构,与定长的顺序串的存储结构类似,都是用一组地址连续的存储单元存储串的字符序列,不同的是堆串的存储空间吗实在程序执行过程中动态分配的。

在系统中存在一个称为“堆”的自由存储区,每当建立一个新串时,可以通过动态分配函数从这个空间中分配一块实际串所需的存储空间,来存储新串的串值。只要存储呢空间能分配成功,则在操作的过程中就不会发生“截断”的情况。C语言采用malloc()、free()等函数完成动态存储管理。


2、块链串:由于串是一种特殊的线性表,所以存储字符串的串值除了可以采用顺序存储结构,也可以采用链式存储结构。在串的链式存储结构中,链表的每个结点既可以存放一个字符,也可以存放多个字符。每个结点称为块,整个链表称为块链结构。


3、串的模式匹配:

I、BF模式匹配算法

算法思想:Brute-Froce算法又称蛮力匹配算法,从主串S的第pos个字符开始,和模式串T的第一个字符进行比较,若相等,则继续逐个比较后续字符;否则回溯到主串第pos+1个字符开始再重新和模式串T进行比较。以此类推,直至模式串T中的每一个字符串依次和主串S中的一个连续的字符串序列全部相等,则称模式匹配成功,此时返回模式串T的第一个字符在主串S中的位置;否则主串中没有和模式串相等的字符序列,称模式匹配不成功。

算法描述:从主串S的第pos个字符开始的子串与模式串T比较的策略是从前往后依次进行比较。因此在主串中设置指示器i表示主串S中当前比较的字符;在模式串T中设置指示器j表示模式串T中当前比较的字符。

算法分析:BF算法思想比较简单,但当在最坏的情况下时,算法的时间复杂度为O(n*m),其中n和m分别是主串和模式串的长度。这个算法的主要时间消耗在失配后的比较位置有回溯,因而比较次数过多。


II、KMP模式匹配算法

算法思想:Knuth-Morris-Pratt算法,是由D.E.Knuth、J.H.Morris和V.R.Pratt共同提出的一个改进算法。KMP算法是模式匹配中经典的算法,和BF相比,KMP算法的不同点是消除BF算法中主串S指针回溯的情况,从而完成串的模式匹配,这样的结果使得算法的时间复杂度为O(n+m)。

算法描述:KMP算法每当一趟匹配过程中出现字符比较不等时,主串S中的i指针不需回溯,而是利用已经得到的“部分匹配”结果将模式向右“滑动”尽可能远的一段距离后,继续进行比较。

算法分析:KMP算法是在已知模式串的next或者nextval的基础上执行的,如果不知道它们二者之一,则没有办法使用KMP算法。虽然有next和nextval之分,但它们表示的意义和作用是完全一样,因此在已知next或者nextval进行匹配时,匹配算法不变。通常,模式串的长度m比主串的长度n要小的多,且计算next和nextval函数时间复杂度为O(m)。因此,对于整个匹配算法来水哦,所增加的计算next或nextval是值得的。


BF算法的时间复杂度为O(n*m),但是实际执行近似与O(n+m),因此至今仍被采用。KMP算法仅当模式串与主串之间存在许多“部分匹配”的情况下,才会比BF算法块。KMP算法的最大特点就是主串的指针不需要回溯,整个匹配过程中,主串仅需从头到尾扫描依次,对于处理从外设输入烦人庞大文件很有效,可以边读边匹配。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值