大话数据结构 【六】串

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

 

s 是串的名称

用双引号 或 单引号 括起来的字符序列 是 串的值

字符数目n 是串的长度

空串:0个字符的串,长度为0——>  s = ""

空格串:——> s = " "

 

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

包含子串的串称为主串

 

串的比较

s1 = "abcd",s2 = "acbd"

第一个字母都是a,认为不存在大小差异

第二个字母中”b“在字母表中靠前于”c“,认为”b“ < "c",于是 s1 < s2

 

 

字符集:如ASCII 码,Unicode

 

 两个串相等——> 长度 + 各个位置的字符都相等

两个串不等时:

1.s1 = "hap"

s2 = "happy" ——> 则 s1 < s2

2.s1 = "abcd"

s2 = "acbd"——> 则 s1 < s2

 

串的抽象数据类型

串的逻辑结构和线性表类似,但,串针对的是字符集,也就是串中的元素都是字符

 

线性表       更关注的是单个元素的操作  【比如插入、删除】

串              更多的是查找子串位置、得到指定位置子串、替换子串

 

 

# 不同的高级语言,对串的基本操作有不同的定义方法

 

 

串的存储结构

1.顺序存储结构

用一组地址连续的存储单元存储串中的字符序列

按照预定义的大小,为每个定义的串变量 分配一个 固定长度的存储区 【定长数组】

 

既然定长,必然有 预定义的最大串长度

一般可以将实际的串长度值保存在数组的 0 下标位置

也可以在串值后面加一个不计入串长度的结束标记字符 如 “\0”        【此时 遍历计算即可得串的长度】

但,由于串的操作,可能会超出 MaxSize,于是,对于串的顺序存储,有了一些变化,串值的存储空间可在程序的执行中 动态分配

 

2.链式存储结构

 

 

一个结点存多少字符,直接影响串处理的效率 【根据实际情况选择】

 

 #除了 连接串与串操作方便外,灵活度和性能都比不上顺序存储

 

 

 

 

 

朴素的模式匹配算法

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

 

       

 

最好情况——> 一开始就匹配成功  时间复杂度O(1)

稍差一些——> 每次首字母直接不匹配,省去对子串的循环   时间复杂度为O(n【主串长】+m【要匹配的子串长】)

       由等概率原则,平均(n + m ) / 2次    时间复杂度O(n+m)

最坏情况——> 每次不成功的匹配发生在子串最后一个

到了第41个位置,全部匹配相等,不需要再继续下去

如果没有可匹配的子串【比如是0....002】,到了第41位不匹配,后面同样不需要继续比

期间进行了( 50 - 10 + 1) * 10 次判断

时间复杂度为    O((n-m+1)*m)

 

 太低效!!!!

 

KMP模式匹配算法 

 1.原理

P.163

2.next数组值推导

P.167

3.KMP模式匹配算法实现

 

 KMP模式匹配算法改进

170

nextval数组值推导

172

 

 

 

 

 

【标页码的部分,计划打印了细看,有总结的话,会更新这篇博客,需要pdf的可以私信~】

转载于:https://www.cnblogs.com/expedition/p/10724245.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值