当前位置: 首页 > news >正文

算法导论【字符串匹配】—朴素算法、Rabin-Karp、有限自动机、KMP

算法导论【字符串匹配】—朴素算法、Rabin Karp、有限自动机、KMP

  • 朴素字符串匹配算法
  • Rabin-Karp算法
  • 有限自动机
  • KMP算法

文本

在这里插入图片描述

朴素字符串匹配算法

  • 预处理时间0
  • 匹配时间O((n-m+1)m)
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

Rabin-Karp算法

  • 预处理时间Θ(m),需要预先算出匹配串的哈希值
  • 匹配时间O((n−m+1)m),匹配过程与朴素算法类似,但是不需要逐个比对,先比对哈希值,这样可以减少字符匹配次数,计算待匹配的m个字符的哈希值,采用特定方法可以只要常数时间
  • Rabin-Karp算法的预处理时间为Θ(m)\Theta(m)Θ(m),在最坏情况下,运行时间为Θ((n−m+1)m)\Theta((n-m+1)m)Θ((nm+1)m)
  • Rabin-Karp算法比较字符串的哈希值,而不是字符串本身。为了提高效率,可以从当前位置的哈希值轻松计算文本中下一个位置的哈希
  • 简单说就是:每次计算m个字符的字符串的哈希值,然后与匹配串的哈希值对比,如果不相等那这两个字符串肯定不一样,如果哈希值相等,那么再逐个匹配字符,这样可以减少不必要的匹配
  • 如果哈希值不相等,算法将计算下一个M字符序列的哈希值。如果哈希值相等,算法将比较模式和M字符序列。这样,每个文本子序列只有一个比较,只有当哈希值匹配时才需要字符匹配
  • Rabin Karp算法的预处理阶段包括计算哈希Hash(P)Hash(P)Hash(P)。它可以在恒定的空间和O(m)O(m)O(m)时间内完成。
  • 在搜索阶段,将哈希Hash(P)Hash(P)Hash(P)与哈希Hash(T[j..j+m−1])Hash(T[j..j+m−1])Hash(T[j..j+m1])比较就足够了。如果找到了一个等式,仍然需要逐个字符检查等式P=T[j..j+m−1]P=T[j..j+m−1]P=T[j..j+m1]
  • Rabin Karp算法的时间复杂度为Θ((n−m+1)m)=Θ(mn)Θ((n−m+1)m)=Θ(mn)Θ((nm+1)m)=Θ(mn)(例如,当在n中搜索m时)。当有效点很小时,例如O(1)O(1)O(1),其预期的文本字符比较数为O(n+m)=O(n)O(n+m)=O(n)O(n+m)=O(n)
  • 在这里插入图片描述
  • 在这里插入图片描述
  • 在这里插入图片描述
  • 在这里插入图片描述在这里插入图片描述
  • 在这里插入图片描述

有限自动机

  • 预处理时间O(|mΣ|),|Σ|为待匹配串的字母表大小
  • 匹配时间Θ(n),预处理完后只需要扫描一遍字符串即可找到匹配串
    在这里插入图片描述
    在这里插入图片描述

KMP算法

  • 预处理时间Θ(m)

  • 匹配时间Θ(n)

  • 关键在于计算出前缀π\piπ数组,π\piπ就是文本串中在该位置能够得到最长的前后缀长度,举个例子:在这里插入图片描述
    在这里插入图片描述

  • 预处理过程:在这里插入图片描述- 匹配过程:在这里插入图片描述

http://www.lryc.cn/news/11853.html

相关文章:

  • 如何在 Python 中验证用户输入
  • JVM详解——类的加载
  • Ubuntu最新版本(Ubuntu22.04LTS)安装nfs服务器及使用教程
  • Python-第九天 Python异常、模块与包
  • 博彩公司 BetMGM 发生数据泄露,“赌徒”面临网络风险
  • 初探Mysql反向读取文件
  • 地图坐标系大全:常用地图坐标系详解与转换指南
  • 使用 URLSearchParams 解析和管理URL query参数
  • 一台电脑安装26个操作系统(windows,macos,linux,chromeOS,Android,静待HarmonyOS)
  • Python配置文件管理之ini和yaml文件读取
  • 实战一(下):如何利用基于充血模型的DDD开发一个虚拟钱包系统?
  • webpack当中的代码分割详解
  • 【SSM】Spring对IoC的实现方式DI详讲
  • 【QT 5 相关实验-示波器-学习笔记-示波器组件练习与使用总结】
  • 二维数组中的查找(两种解法,各有千秋)
  • quartz使用及原理解析
  • Datawhale组队学习:大数据 D2——分布式文件系统(HDFS)
  • CCIE重认证-300-401-拖图题全
  • 如何动态的创建类?type的其他用法?什么是元类,如何自定义元类?
  • XCP实战系列介绍15-XCP故障排查指导
  • 吉林大学软件需求分析与规范(Software Requirements Analysis Specification)
  • PyTorch - Conv2d 和 MaxPool2d
  • leetcode Day2(昨天实习有点bug,心态要崩了)
  • 另一种思考:为什么不选JPA、MyBatis,而选择JDBCTemplate
  • LeetCode 338. 比特位计数
  • 排序评估指标——NDCG和MAP
  • [Android Studio] Android Studio Virtual Device(AVD)虚拟机的功能试用
  • kafka-3-kafka应用的核心要点和内外网访问
  • VS2017+OpenCV4.5.5 决策树-评估是否发放贷款
  • Prometheus 记录规则和警报规则