• 字符串匹配之Sunday算法


    简介

    Sunday算法是一种字符串匹配算法,相比于KMP算法,它比较简单易学。

    在有些时候,比如字符串很长的时候,它是比KMP要高效的。

    核心思想

    1. 从前往后匹配,匹配失败时关注主串中参与匹配的最末位字符的下一位。

    2. 若该字符没有在模式串中出现,则直接跳过,且模式串移动位数 = 模式串长度 + 1。

    3. 否则,移动位数 = 模式串长度 - 该字符在模式串最右出现出现的位置。


    这三步说明了具体的执行,感觉很抽象。但综合起来就是:

    • 匹配时从前向后匹配。
    • 匹配失败时,重新对齐模式串与主串。

    所以现在的问题是,这个重新对齐是怎么对齐呢?

    举个栗子

    • 设主串为 eurusdoveyesido
    • 设模式串为 esid

    1. 正常匹配,在第2位发现不匹配,于是看主串中参与匹配的最末位字符的下一位,也就是ss也在模式串出现过,那么对齐


    1. 对齐后,继续正常匹配,发现第1位就不同,匹配失败。同样,看v,发现v没在模式串出现过,那么模式串就与v后面的e对齐


    1. 同样,匹配失败。对齐i


    1. 终于,匹配成功!

    代码实现

    _next数组

    是的,Sunday算法也有next数组需要预处理。

    next数组存储的是:模式串不同字符最右边的下标。

    所以,对于上面例子的模式串 esid

    • next[d]=3
    • next[i]=2
    • next[s]=1
    • next[e]=0

    而对于英文字符,它们都在ASCII里,总计256个,所以我们开一个256大小的数组

    c

    这样的预处理,正是以空间换取时间

    匹配过程

    匹配的代码按思想写就好,值得一提的是:

    因为模式串中没有出现的字符的next值为-1,所以正好,当要对齐的时候,模式串多向后移动了一位(减 负 1 -> 加 1)。

    c

    __EOF__

  • 本文作者: 江水为竭
  • 本文链接: https://www.cnblogs.com/Az1r/p/16751593.html
  • 关于博主: 评论和私信会在第一时间回复。或者直接私信我。
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
  • 声援博主: 如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。
  • 相关阅读:
    【软考】计算机指令系统寻址的几种方式及其速度的比较
    深度剖析图像处理—边缘检测
    【SpringSecurity】九、Base64与JWT
    SpringBoot实现IP地址归属地查询
    力扣(LeetCode)308. 二维区域和检索 - 可变(2022.11.05)
    PHP JSON的解析和创建
    【Python学习】Day-032 Day-033 xpath;xml数据格式、多线程、线程池、常用命令
    深入理解计算机系统——第九章 Virtual Memory
    叉乘分配律的几何证明
    【EMC专题】案例:电源适配器传导超标,但接产品整机测试却正常?
  • 原文地址:https://www.cnblogs.com/Az1r/p/16751593.html