Sunday 算法介绍

1. Sunday 算法介绍

「Sunday 算法」 是一种在字符串中查找子串的算法,是 Daniel M.Sunday 于1990年提出的字符串模式匹配算法。

Sunday 算法思想:对于给定文本串 T 与模式串 p,先对模式串 p 进行预处理。然后在匹配的过程中,当发现文本串 T 的某个字符与模式串 p 不匹配的时候,根据启发策略,能够尽可能的跳过一些无法匹配的情况,将模式串多向后滑动几位。

Sunday 算法思想跟 Boyer Moore 算法思想类似。不同的是,Sunday 算法匹配顺序是从左向右,并且在模式串 p 匹配失败时关注的是文本串 T 中参加匹配的末尾字符的下一位字符。当文本串 T 中某个字符跟模式串 p 的某个字符不匹配时,可以将模式串 p 快速向右移动。

遇到不匹配字符时,可以根据以下两种情况向右快速进行移动:

  • 情况 1:文本串 T 中与模式串 p 尾部字符 p[m - 1] 对应的字符下一个位置的字符 T[i + m] 出现在模式串 p
    • 这种情况下,可将T[i + m] 与模式串中最后一次出现的该字符对齐,如下图所示。
    • 向右移动位数 = 文本串 T 中与模式串 p 尾部位置的下一个位置 - T[i + m] 在模式串中最后一次出现的位置
    • 注意:文本串 T 中与模式串 p 尾部位置的下一个位置其实就是「模式串长度」。

  • 情况 2:文本串 T 中与模式串 p 尾部字符 p[m - 1] 对应的字符下一个位置的字符 T[i + m] 没有出现在模式串 p
    • 这种情况下,可将模式串整个右移,如下图所示。
    • 向右移动位数 = 整个模式串长度 + 1

2. Sunday 算法步骤

整个 Horspool 算法步骤描述如下:

  • 计算出文本串 T 的长度为 n,模式串 p 的长度为 m
  • 先对模式串 p 进行预处理,生成后移位数表 bc_table
  • 将模式串 p 的头部与文本串 T 对齐,将 i 指向文本串开始位置,即 i = 0j 指向模式串开始,即 j = 0,然后从模式串开始位置开始比较。
    • 如果文本串对应位置的字符 T[i + j] 与模式串对应字符 p[j] 相同,则继续比较后一位字符。
      • 如果模式串全部匹配完毕,则返回模式串 p 在文本串中的开始位置 i
    • 如果文本串对应位置的字符 T[i + j] 与模式串对应字符 p[j] 不同,则:
      • 根据后移位数表 bc_table 和模式串末尾位置对应的文本串上的字符 T[i + m] ,计算出可移动距离 bc_table[T[i + m]],然后将模式串进行后移。
  • 如果移动到末尾也没有找到匹配情况,则返回 -1

3. Sunday 算法代码实现

3.1 后移位数表代码实现

生成后移位数表的代码实现比较简单,跟 Horspool 算法中生成后移位数表的代码差不多。具体步骤如下:

  • 使用一个哈希表 bc_tablebc_table[bad_char] 表示表示遇到坏字符可以向右移动的距离。
  • 遍历模式串,以当前字符 p[i] 为键,可以向右移动的距离(m - i)为值存入字典中。如果出现重复字符,则新的位置下标值会将之前存放的值覆盖掉。这样哈希表中存放的就是该字符在模式串中出现最右侧位置上的可向右移动的距离。

如果在 Sunday 算法的匹配过程中,如果 T[i + m] 不在 bc_table 中时,可令其为 m + 1,表示可以将模式串整个右移到上一次匹配末尾后边两个位置上。如果 T[i + m]bc_table 中时,可移动距离就是 bc_table[T[i + m]] 。这样就能计算出可以向右移动的位数了。

生成后移位数表的代码如下:

# 生成后移位数表
# bc_table[bad_char] 表示遇到坏字符可以向右移动的距离
def generateBadCharTable(p: str):m = len(p)bc_table = dict()for i in range(m):                      # 迭代到最后一个位置 m - 1bc_table[p[i]] = m - i              # 更新遇到坏字符可向右移动的距离return bc_table

3.2 Sunday 算法整体代码实现

# sunday 算法,T 为文本串,p 为模式串
def sunday(T: str, p: str) -> int:n, m = len(T), len(p)bc_table = generateBadCharTable(p)          # 生成后移位数表i = 0while i <= n - m:j = 0if T[i: i + m] == p:return i                            # 匹配完成,返回模式串 p 在文本串 T 的位置if i + m >= n:return -1i += bc_table.get(T[i + m], m + 1)      # 通过后移位数表,向右进行进行快速移动return -1                                   # 匹配失败# 生成后移位数表
# bc_table[bad_char] 表示遇到坏字符可以向右移动的距离
def generateBadCharTable(p: str):m = len(p)bc_table = dict()for i in range(m):                      # 迭代到最后一个位置 m - 1bc_table[p[i]] = m - i              # 更新遇到坏字符可向右移动的距离return bc_tableprint(sunday("abbcfdddbddcaddebc", "aaaaa"))
print(sunday("abbcfdddbddcaddebc", "bcf"))

4. Sunday 算法分析

  • Sunday 算法在平均情况下的时间复杂度为 O ( n ) O(n) O(n),但是在最坏情况下时间复杂度会退化为 O ( n ∗ m ) O(n * m) O(nm)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/748066.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

UE5.1 iClone8 正确导入角色骨骼与动作

使用iClone8插件Auto Setup 附录下载链接 里面有两个文件夹,使用Auto Setup C:\Program Files\Reallusion\Shared Plugins 在UE内新建Plugins,把插件复制进去 在工具栏出现这三个人物的图标就安装成功了 iClone选择角色,导入动作 选择导出FBX UE内直接导入 会出现是否启动插件…

docker的常用指令

docker的常用指令 从docker镜像仓库&#xff0c;搜索所有和mysql有关的镜像 docker search mysql 从docker仓库拉取mysql docker pull mysql这里的mysql是指使用search搜索出来的所有容器的NAME 如果和我一样遇到以下问题&#xff1a; 我可以登录阿里云的官网&#xff0c;找…

基于springboot+vue实现计算机等级考试报名系统项目【项目源码+论文说明】计算机毕业设计

基于springbootvue实现计算机等级考试报名演示 摘要 在进入二十一世纪之后&#xff0c;网络发展越来越迅速&#xff0c;人们的很多生活习惯与消费习惯都随之发生了改变&#xff0c;计算机技术为人们的生活带来了很多的便利。而计算机技术是我国各个教育阶段中的一门必修课程&a…

Golang中map数据结构字段解析

Golang里map底层数据结构具体如下图所示&#xff1a; map其实就是一个指向 hmap 的指针&#xff0c;占用了8个字节 hmap各自段存放的字段意义如下&#xff1a; 字段含义countmap中元素的个数&#xff0c;对应len (map)的值flags状态标志位&#xff0c;标记map的一些状态B桶数…

Spring中使用内置的tomcat容器启动后自动退出问题解决方法

在Spring中使用内置的tomcat 启动后自动退出 退出代码为0 且不报任务错误的解决方法. 日志如下: Connected to the target VM, address: 127.0.0.1:51129, transport: socket 三月 15, 2024 11:55:00 下午 org.apache.coyote.AbstractProtocol init 信息: Initializing Proto…

C/C++ Socket 获取或设置 TCP MSS 大小

通过 Socket 系统接口&#xff0c;链接到一个TCP服务器&#xff0c;那么在链接成功之后会被配置一个从本地端到目的端最佳的TCP_MSS大小。 我们通过这个特点&#xff0c;即可轻松的实现&#xff0c;链路MTU大小发现功能&#xff0c;在不依赖ROOT管理员权限的情况下&#xff0c;…

免费阅读篇 | 芒果YOLOv8改进111:注意力机制CBAM:轻量级卷积块注意力模块,无缝集成到任何CNN架构中,开销可以忽略不计

&#x1f4a1;&#x1f680;&#x1f680;&#x1f680;本博客 改进源代码改进 适用于 YOLOv8 按步骤操作运行改进后的代码即可 该专栏完整目录链接&#xff1a; 芒果YOLOv8深度改进教程 该篇博客为免费阅读内容&#xff0c;YOLOv8CBAM改进内容&#x1f680;&#x1f680;&am…

ansible 部署FATE集群单边场景

官方文档&#xff1a; https://github.com/FederatedAI/AnsibleFATE/blob/main/docs/ansible_deploy_FATE_manual.md https://github.com/FederatedAI/AnsibleFATE/blob/main/docs/ansible_deploy_two_sides.md gitee详细文档&#xff1a; docs/ansible_deploy_one_side.md…

确保云原生部署中的网络安全

数字环境正在以惊人的速度发展&#xff0c;组织正在迅速采用云原生部署和现代化使用微服务和容器构建的应用程序&#xff08;通常运行在 Kubernetes 等平台上&#xff09;&#xff0c;以推动增长。 无论我们谈论可扩展性、效率还是灵活性&#xff0c;对于努力提供无与伦比的用…

服务器遭遇挖矿病毒syst3md及其伪装者rcu-sched:原因、症状与解决方案

01 什么是挖矿病毒 挖矿病毒通常是恶意软件的一种&#xff0c;它会在受感染的系统上无授权地挖掘加密货币。关于"syst3md"&#xff0c;是一种特定的挖矿病毒&#xff0c;它通过在受感染的Linux系统中执行一系列复杂操作来达到其目的。这些操作包括使用curl从网络下载…

爬虫逆向实战(36)-某建设监管平台(RSA,魔改)

一、数据接口分析 主页地址&#xff1a;某建设监管平台 1、抓包 通过抓包可以发现网站首先是请求了一个/prod-api/mohurd-pub/vcode/genVcode的接口&#xff0c;用于获取滑块验证码的图片 滑块验证之后&#xff0c;请求了/prod-api/mohurd-pub/dataServ/findBaseEntDpPage这…

【C语言】—— 指针一 : 初识指针(上)

【C语言】—— 指针一 &#xff1a; 初识指针&#xff08;上&#xff09; 一、内存和地址1.1、如何理解内存和地址1.2、 如何理解编址 二、指针变量和地址2.1、取地址操作符 &2.2、 指针变量2.3、 解引用操作符 ∗ * ∗2.4、指针变量的大小 三、指针变量类型的意义3.1、 指…

【网络安全】 MSF提权

本文章仅用于信息安全学习&#xff0c;请遵守相关法律法规&#xff0c;严禁用于非法途径。若读者因此作出任何危害网络安全的行为&#xff0c;后果自负&#xff0c;与作者无关。 环境准备&#xff1a; 名称系统位数IP攻击机Kali Linux6410.3.0.231客户端Windows 76410.3.0.234…

计算机考研|408专业课复习教程+注意事项

408其实把真题琢磨透就已经可以了&#xff01;其实大部分考研党复习到最后真题都来不及刷完就要上考场 因为在考研后期时间分配真的很困难&#xff01;特别是数学和408 本人双非科班出身备考408成功上岸&#xff0c;在这里也想给想考408的学弟学妹们一些很中肯的&#xff0c;…

鸿蒙Harmony应用开发—ArkTS声明式开发(基础手势:Slider)

滑动条组件&#xff0c;通常用于快速调节设置值&#xff0c;如音量调节、亮度调节等应用场景。 说明&#xff1a; 该组件从API Version 7开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 子组件 无 接口 Slider(options?: SliderOption…

C++Qt学习——QPushButton、QRadioButton(单选按钮)、QCheckBox(复选按钮)

目录 1、QPushButton 1.1、创建一个新的项目&#xff0c;转到UI界面拖一个Push Button 1.2、Push Button的常用信号主要有四个&#xff0c;分别为 clicked(), pressed(), released(), toggled() 1.2.1、按住Push Button右键转到槽&#xff0c;选择信号函数 1.2.2、在Widget…

1.2 课程架构介绍:STM32H5 芯片生命周期管理与安全调试

1.2 课程架构介绍&#xff1a;STM32H5 芯片生命周期管理与安全调试 下面开始学习课程的第二节&#xff0c;简单介绍下STM32H5芯片的生命周期和安全调试&#xff0c;具体课程大家可以观看STM32官方录制的课程&#xff0c;链接&#xff1a;1.2. 课程架构介绍&#xff1a;STM32H5…

闪电网络协议设计思想剖析

1. 引言 闪电网络可能是比特币之上部署的最受期待的技术创新。闪电网络&#xff0c;为由 Joseph Poon 和 Tadge Dryja 于2015年首次提出的支付层&#xff0c;承诺支持&#xff1a; 用户之间几乎无限数量的链下交易&#xff0c;几乎免费&#xff0c;同时利用比特币提供的安全性…

IDEA编译安卓源码TVBox(2)

一、项目结构&#xff1a;主要app和player app结构 二、增加遥控器按键选台 修改LivePlayActivity.java 1、声明变量 public String channelId "";public Timer timer new Timer();public Toast mToast;2、定义方法 private void mToastShow(String s){mToast …

微信小程序-webview分享

项目背景 最近有个讨论区项目需要补充分享功能&#xff0c;希望可以支持在微信小程序进行分享&#xff0c;讨论区是基于react的h5项目&#xff0c;在小程序中是使用we-view进行承载的 可行性 目标是在打开web-view的页面进行分享&#xff0c;那就需要涉及h5和小程序的通讯问…