对ZZL字符串匹配算法的改进

——ZZL最短匹配定理
张亮

ZZL算法是一种可做特殊用途的字符串匹配算法,本文将改进ZZL算法,在ZZL算法的基础上,提出了ZZL最短匹配定理,根据模式串的自身特征以进一步减少不必要的匹配次数。

字符串匹配

字符串匹配的含义就是:在主串S中,从位置start开始查找是否存在模式串(也称作模式串)T,如在主串S中查找到一个与模式串T相同的模式串,则模式串与主串匹配;如在主串S中未查找到一个与模式串T相同的模式串,则不匹配。字符串匹配用途广泛,人们很早就对字符串匹配算法进行了研究,在BF(Brute Force)算法的基础上,提出了一些优秀的串匹配算法,比如经典的KMP匹配算法,BM算法等。
     首先全文都有如下假设:
匹配的主串为S:S[1…N],长度为N;模式串为T:T[1…M],长度为M;N≥M;

ZZL匹配算法

匹配思想

现有的字符串匹配算法不论是按照模式串从左至右还是从右至左的顺序匹配,都是直接进行比较,而ZZL算法 的核心思想是:首先在主串S中查找模式串T的首字母,每找到一个则将它的位置存储,然后依次提取这些位置,从这些位置开始继续匹配模式串T。对于频繁使用 的要匹配的主串和模式串来说,由于预先保存了模式串在主串中的所有存储位置,所以匹配速度会非常快。

处理过程

ZZL算法也分为预处理和匹配两个阶段,预处理主要完成查找模式串首字符在主串中的所有出现位置,并将其保存在一个数组中;在预处理的基础上,字符串匹配算法就可以从查找到的模式串在主串中的位置开始,采用BF匹配模式串首字母之后的其余部分。
时间按复杂度
     ZZL算法的特点是简单容易实现,如果不考虑算法的预处理过程,若模式串首字母在主串中出现k次,则ZZL算法最坏情况下比较次数为k*(M-1)<k*M。如果考虑算法的预处理过程,则总的比较次数需再加上N次,即为k*M+N。
ZZL最短匹配定理
ZZL缺点分析
     观察ZZL算法,如果模式串首字母在主串中出现次数很多,那么ZZL算法记录的匹配点将会增加,时间复杂度也随之增加。让我们先来考察下面的匹配场景:
S = tom orrow, m any and m any m anufactories will close.
T = manufactories
     那么ZZL算法在预处理S时会找到4个开始匹配点,在上面的S串中用红色 标明,然后从每个匹配点开始采用BF算法尝试匹配。然而事实上,只有在最后一个匹配点上T和S才匹配成功。前面的3个匹配点都不能使T和S匹配,如果能在预处理时就尽量排除这样的点岂不是效率更高吗?

ZZL最短匹配定理

ZZL算法并没有利用模式串T的特征,然而模式串T的特征能够帮助我们有效的减少匹配点。
     考察模式串T,我们发现T的首字符m仅出现了一次,而在S串中第二个m和第一个m的间隔小于T的长度,因此第一个m绝对不可能是正确的匹配点,可以直接排除。事实上,这是下面定理的一个特殊情况。
     首先定义模式串T的一个性质。
模式串T的最短ZZL匹配间距:
对任意模式串T,设T的首字符为c,c在T中出现的第二次位置为pos,如果c在T中仅出现一次,那么令pos=M;
位置pos就是T的最短ZZL匹配间距,使用T.W来表示,易得T.W <= M;
ZZL最短匹配定理:

对任意主串S和模式串T,设T的首字符c在S中的连续出现位置为u和v,v >u。如果v – u < T.W,那么在u位置S和T必定不匹配。
证明:
假设v – u < T.W,假设在u位置S和T匹配,那么有
S[u] = T[0] = c;
S[u+1] = T[1];

S[u+M-1] = T[M-1];

由假设v – u < T.W
因此v必定位于区间(u, u+T.W)之中,并且T.W <= M,于是可得到
S[v] = T[i],0< i < T.W <= M ------ (1)
而v是T的首字符c在S中的出现位置,于是有
S[v] = c = T[0] ------ (2)
根据上面(1)和(2)两式有T[i] = T[0], 0< i < T.W,这将违反T.W的定义。因此当v – u < T.W时,在u位置S和T必定不匹配。
证毕。

改进的ZZL算法

把ZZL最短匹配定理应用于ZZL算法就得到了改进后的ZZ算法,改进点是在ZZL的预处理阶段,对匹配阶段无影响。
     预处理阶段分为两部分,第一部分是求出T的ZZL最短匹配间距,第二阶段是求出T在S中的匹配点。
     求T的ZZL最短匹配间距的伪代码如下所示:

c = T[0]
T.W = M
for i = 1 to M
begin
if T[i] == c then
    T.W = i
break;
        end if
    end
求T在S中的匹配点的伪代码如下所示:
j = 0;
for i = 0 to N - M
begin
      if S[i] == T[0] then // a potential match position
            if j == 0 || i – next[j-1] >= T.W then
                 next[j] = i;
                 j = j + 1;
            else
                 next[j-1] = i; // discard the previous one
            end if
      end if
end

如果不考虑算法的预处理过程,若模式串T首字母在主串S中出现k次,且满足ZZL最短匹配间距,则ZZL算法最坏情况下比较次数为k*(M-1)。如果考虑算法的预处理过程,则总的比较次数为k*(M-1) + M + (N-M) = k*M + N。
因此对比ZZL算法,改进后的ZZL算法将能剔除那些T的首字母在S中不能满足ZZL最短匹配间距的出现,从而减少比较次数和提高匹配速度。

结论

改进的ZZL算法利用模式串T本身的特征,通过ZZL最小匹配定理,能够有效的减少ZZL的比较次数,提高匹配速度。
参考文献
1.    朱战立编著. 数据结构——使用C语言(第3版)[M]. 西安:西安交通大学出版社,2004
2.    纪福全 朱战立. 一种可做特殊用途的字符串匹配算法 计算机与信息技术[J] 200608

对ZZL字符串匹配算法的改 ——ZZL最短匹配定理相关推荐

  1. ZZL字符串匹配算法

    分类: 算法艺术2009-12-31 13:25 2579人阅读 评论(4) 收藏 举报 算法standards存储数据结构搜索引擎语言 转载一篇关于字符串匹配算法ZZL的论文, 图片有点问题,将就着 ...

  2. 数据结构与算法之美笔记——基础篇(下):图、字符串匹配算法(BF 算法和 RK 算法、BM 算法和 KMP 算法 、Trie 树和 AC 自动机)

    图 如何存储微博.微信等社交网络中的好友关系?图.实际上,涉及图的算法有很多,也非常复杂,比如图的搜索.最短路径.最小生成树.二分图等等.我们今天聚焦在图存储这一方面,后面会分好几节来依次讲解图相关的 ...

  3. 字符串匹配算法之Sunday算法

    字符串匹配查找算法中,最着名的两个是KMP算法(Knuth-Morris-Pratt)和BM算法(Boyer-Moore).两个算法在最坏情况下均具有线性的查找时间.但是在实用上,KMP算法并不比最简 ...

  4. 数据结构与算法分析(十六)--- 如何设计更高效的字符串匹配算法?(BF + RK + KMP + BMH)

    文章目录 一.Brute Force 匹配算法 二.Rabin–Karp 匹配算法 三.Knuth–Morris–Pratt 匹配算法 四.Boyer-Moore-Horspool 匹配算法 五.字符 ...

  5. 这可能是全网最好的字符串匹配算法讲解

    点击上方 好好学java ,选择 星标 公众号重磅资讯,干货,第一时间送达 今日推荐:14 个 github 项目!个人原创100W +访问量博客:点击前往,查看更多 为保证代码严谨性,文中所有代码均 ...

  6. 字符串匹配算法 -- BM(Boyer-Moore) 和 KMP(Knuth-Morris-Pratt)详细设计及实现

    文章目录 1. 算法背景 2. BM(Boyer-Moore)算法 2.1 坏字符规则(bad character rule) 2.2 好后缀规则(good suffix shift) 2.3 复杂度 ...

  7. Go 语言实现字符串匹配算法 -- BF(Brute Force) 和 RK(Rabin Karp)

    今天介绍两种基础的字符串匹配算法,当然核心还是熟悉一下Go的语法,巩固一下基础知识 BF(Brute Force) RK(Rabin Karp) 源字符串:src, 目标字符串:dest: 确认des ...

  8. Boyer-Moore 字符串匹配算法

    字符串匹配问题的形式定义: 文本(Text)是一个长度为 n 的数组 T[1..n]: 模式(Pattern)是一个长度为 m 且 m≤n 的数组 P[1..m]: T 和 P 中的元素都属于有限的字 ...

  9. Java实现算法导论中朴素字符串匹配算法

    朴素字符串匹配算法沿着主串滑动子串来循环匹配,算法时间性能是O((n-m+1)m),n是主串长度,m是字串长度,结合算法导论中来理解,具体代码参考: package cn.ansj;public cl ...

最新文章

  1. 区块链是互联网未来十年中举足轻重的技术
  2. system.objectdisposedexception: 已释放该集合_“开盘10分钟”才是黄金时间——集合竞价“9:15-9:25”预知涨跌,万本股票书籍不及此精华!...
  3. [译] MDC-101 Flutter:Material Components(MDC)基础(Flutter)
  4. repne scasb 内联实现 strlen
  5. 更新yum源并重建缓存
  6. Newbe.ObjectVisitor 0.2.10 发布,更花里胡哨
  7. transporter上传卡正在交付_【iOS】Xcode11使用Transporter将APP上传到App Store,卡在正在验证APP...
  8. 股票交易软件接口编程语言
  9. OROCOS之KDL(1)—— Linux环境搭建篇
  10. ai如何置入_ai中更新置入图片链接的具体步骤介绍
  11. iview的DatePicker 怎么选择时分秒
  12. 前端工程师的三种级别,技术决定你能拿5K,还是15K,还是25K
  13. 达梦体系结构(DM8)_yxy
  14. 火遍全世界的网红美女李子柒一年能赚多少钱,数据量化给你看,连中央媒体都为她打call...
  15. React页面空白问题
  16. c语言反三角函数值域,反三角函数的定义域和值域
  17. 进度猫甘特图:项目管理中如何制定工作安排表
  18. 【IoT】NFC CPU 卡 AID 应用标识符规范
  19. dbconfig设置mysql_dbconfig配置 | 学步园
  20. 《数字货币交易所架构初探》— PPIO Code Talks 第二期续

热门文章

  1. ubuntu22.04 在笔记本上切换核显驱动出现的字体模糊或屏幕模糊现象的解决方法
  2. 惠普服务器蓝屏怎么修复,惠普电脑蓝屏出现WDF_VIOLATION错误代码解决办法
  3. Docker的 Overlay/Overlay2 文件系统
  4. 网络远程访问的方式使用树莓派
  5. ps怎么设计html界面,UI设计师的工作界面怎么用PS设置
  6. AEJoy —— 彻底搞懂 AE 各种 loop* 表达式【二】
  7. Rancher 中应用、服务、容器的概念
  8. flash 在firebox/IE中 提示安装 浏览器是否有flash插件
  9. mysql桌面型数据库下载_桌面数据库下载v2019.12.001 安装版-西西软件下载
  10. WHERE EXISTS