大话数据结构(五)串(朴素的模式匹配算法、KMP模式匹配算法)

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

1 串的比较

给定两个串, s = ′ ′ a 1 a 2 . . . . . a n ′ ′ , t = ′ ′ b 1 b 2 . . . . b m ′ ′ s =''a_1a_2.....a_n'',t=''b_1b_2....b_m'' s=a1a2.....ant=b1b2....bm,当满足以下条件之一时, s < t s<t s<t

  • n < m n<m n<m,且 a i = b i ( i = 1 , 2 , . . . . . , n ) a_i = b_i(i=1,2,.....,n) ai=bii=1,2,.....,n。例如, s = ′ ′ h a p ′ ′ , t = ′ ′ h a p p y ′ ′ s=''hap'',t=''happy'' s=hapt=happy,就有 s < t s<t s<t
  • 存在某个 k < = m i n ( m , n ) k<=min(m,n) k<=min(m,n),使得 a i = b i ( i = 1 , 2 , . . . . . , k − 1 ) a_i = b_i(i=1,2,.....,k-1) ai=bii=1,2,.....,k1, a k < b k a_k < b_k ak<bk。例如, s = ′ ′ h a p p e n ′ ′ , t = ′ ′ h a p p y ′ ′ s=''happen'',t=''happy'' s=happent=happy,因为两串前4个字母均相同,而两串第5个字母( k k k值), e e e 的ASCII码是101,而 y y y 的ASCII码是121,显然 e < y e < y e<y,所以 s < t s<t s<t

2 串的抽象数据类型

串的逻辑结构与线性表相似,不同之处在于串针对的是字符集,每个元素都是字符。此外,串的基本操作与线性表有很大差别。线性表关注的是单个元素的操作,串中更多则是查找子串位置、得到指定位置子串、替换子串等操作。
在这里插入图片描述

3串的存储结构

3.1 串的顺序存储结构

用一组地址连续的存储单元来存储串中的字符序列。一般用定长数组为每个定义的串变量分配一个固定长度的存储区。这样的存储方式存在问题,因为定长,在字符串操作时候,比如连接、插入新串、替换等操作时,都可能使串序列的长度超过了数组的长度MaxSize。

3.2 串的链式存储结构

与线性表相似,但因为串中每个元素都是一个字符,如果用链表存储串值,一个结点对应一个字符,就会存在很大的空间浪费。因此,一个结点可以存放一个字符,可以考虑存放多个字符,最后一个结点若是未被占满,可用“#”或其他非串值字符补全,如图。
在这里插入图片描述
当然,一个结点存多少个字符才合适显得很重要,这会影响串处理的效率,要根据实际情况取舍。总的来说,串的链式存储结构除了在连接串与串操作时有一定方便之外,不如顺序存储灵活,性能也不如顺序存储结构好

4 朴素的模式匹配算法

5 KMP模式匹配算法

6 KMP改进

以下内容移步本博客其他文章

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值