算法五——字符串匹配(上)

文章内容、图片均来自极客时间。

如何借助哈希算法实现高效字符串匹配

1 概念和用途

字符串匹配:查找一个字符串A在字符串B中是否出现,这个过程就是字符串匹配。A称为模式串,B称为主串。主串的长度记为n,模式串长度记为m。n>mn>mn>m
在java中有String的indexOf用就是字符串匹配。
字符串匹配有基础的BF算法、高效的KMP算法。

2 BF算法

BF=Brute Force 暴力搜索
  算法思想:在主串中,分别从起始位置0,1,2…n-m且长度为m的n-m+1个子串是否和模式串相同。

  从算法过程分析,最坏时间复杂度是O(nm)。例如主串是“aaaa…aaa”(省略符号表示有若干个a)。模式串是"aaaab"。因为有n-m+1个子串,每次比较m次。比较总次数是(n−m+1)∗m=n∗m−m2+m(n-m+1)*m=n*m-m^2+m(nm+1)m=nmm2+m,记为O(nm)。
  BF尽管时间复杂度比较高,但在实际应用中经常使用。原因有二。
  第一,在实际应用中字符串都比较短,每次两个字符串比较的时候遇到不相同的字符,就可以提前返回。所以实际比n*m要少。
  第二,算法思想简单,实现简单,不容易出错。这也符合KISS(Keep it simple and stupid)原则。在工程中,满足性能的前提下,简单是原则。

3 RK算法

RK=Rabin-Karp,是该算法的两位提出者。
  在BF算法中,两次字符串比较,因为要比较m次,复杂度较高。如果为每个字符串计算一个哈希值,每次比较哈希值,复杂度就可能会降低。
  算法思想:对模式串求哈希值。对n-m+1个主串中的子串分别求哈希值,然后逐个和模式串的哈希值比较。因为哈希值是一个数字比较非常快。但是因为求哈希所以整体算法效率没有提高。
  改进:可以通过改进求子串哈希值,降低时间复杂度。假如字符串中只包含a-z这26个字母,每个字母分别对应数字0~25。哈希值采用26进制表示。
  例如:"dbc"=d∗26∗26+b∗26+c=3∗26∗26+1∗26+2=2056"dbc" = d*26*26+b*26+c=3*26*26+1*26+2=2056"dbc"=d2626+b26+c=32626+126+2=2056
  这种哈希方法相邻子串哈希值是有特点的。可以使用前一个子串的哈希值计算下一个子串的哈希值。
  
  记h1=hash(dbc)=32626+126+2,h2=hash(bce)=12626+226+4.
  A=126+2
  B=1
2626+226
  那么B=26*A
  令h[i-1]表示(i-1,i+m-2)子串的哈希值,h[i]表示(i,i+m-1)子串的哈希值。那么
  h[i]=(h[i−1]−26m−1(s[i]−′a′))∗26+(s[i+m−1]−′a′)h[i]=(h[i-1]-26^{m-1}(s[i]-'a'))*26+(s[i+m-1]-'a')h[i]=(h[i1]26m1(s[i]a))26+(s[i+m1]a)
  这里还可以提高的地方时,可以提前把26026^0260,26126^1261,…26m−126^{m-1}26m1存入数组中。次方就是数组下标,便于查询。

时间复杂度分析
  计算哈希值主要扫描一遍主串即可,时间复杂度O(n)。计算子串与模式串哈希值比较是否相同,时间复杂度O(1),共需要n-m+1次比较, 时间复杂度O(n)。总体时间复杂度时间复杂度O(n)。

字符串很长,哈希值超出能表示的范围怎么办?
  上面的设计完全没有哈希冲突,当允许有哈希冲突,会不会解决呢?上面的算法是进位相乘,如果改为加法,数值就小很多了。例如"dbc"=3+1+2=6"dbc"=3+1+2=6"dbc"=3+1+2=6。这样的话取值范围小多了,但哈希冲突概率会很高。如果每个字母不对应整数,而是对应从小到大不同的素数,这样哈希冲突的概率就会降低了。

如果有哈希冲突了,怎么办?
  当两个字符串哈希值相同的时候,就挨个字符串比较,确保字符串真的相同。只是如果这样,当冲突概率很高的时候,RF比BF的效率还低。因为还要计算哈希。

4 思考题

上面讲的是一维字符串的比较,如果是主串和模式串都是一个二维矩阵,怎么匹配呢?
   
  解决思路:可以将二维矩阵转为一个数组,变成一维的,再比较。

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

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

相关文章

[hackinglab][CTF][综合关][2020] hackinglab 综合关 writeup

[hackinglab][CTF][解密关][2020] hackinglab 上传关 writeup 综合关 1 渗透测试第一期 概要:在于绑定admin用户,进行修改密码!(手机号码仔细!!!) 知识点:在进行绑定的…

selenium3+python-多窗口、句柄(handle)

一、获取当前窗口句柄 1.元素有属性,浏览器的窗口其实也有属性的,只是你看不到,浏览器窗口的属性用句柄(handle)来识别。 2.人为操作的话,可以通过眼睛看,识别不同的窗口点击切换。但是脚本没长…

算法五——字符串匹配(中)

文章出处:极客时间《数据结构和算法之美》-作者:王争。该系列文章是本人的学习笔记。 1文本编辑器中的查找功能怎么实现 在word中有一个功能:查找某个字符串,将其替换为另一个字符串,就会用到这个功能。 需要新算法的…

第四十七期:漫画:什么是公有云、私有云和混合云?

为了方便大家理解,我们尽量用通俗的语言和举例子的方式讲解,并且文中还配备了漫画供大家参考学习。 作者:漫话编程 为了方便大家理解,我们尽量用通俗的语言和举例子的方式讲解,并且文中还配备了漫画供大家参考学习。 …

[攻防世界][CTF][2020][MISC] 攻防世界 MISC writeup

咕咕咕 新手练习区精选write up https://blog.csdn.net/weixin_43550772/article/details/106028357 https://www.cnblogs.com/sesefadou/p/11788090.html https://blog.csdn.net/qq_42906381/article/details/105335021

第四十八期:你太菜了,竟然不知道Code Review?

我一直认为Code Review(代码审查)是软件开发中的优秀实践之一,可以有效提高整体代码质量,及时发现代码中可能存在的问题。 作者:宝玉 我一直认为Code Review(代码审查)是软件开发中的优秀实践之一,可以有效提高整体代码质量&…

算法五——字符串匹配(下)KMP

文章出处:极客时间《数据结构和算法之美》-作者:王争。该系列文章是本人的学习笔记。 KMP,是三个作者(D.E.Knuth,J.H.Morris和V.R.Pratt)的简称。   KMP算法和BM一样,也是一个字符串匹配算法。…

点击回车事件(登录)

//增加点击回车事件$(document).keypress(function(e) {var eCode e.keyCode ? e.keyCode : e.which ? e.which : e.charCode;//eCode等于13代表回车事件if (eCode 13){//ajax提交表单,若成功跳转页面,不成功提示输入的账号密码错误!$.ajax({type : …

修电脑

无法启动 无法找到驱动 需要进BISO BIOS SECURE BOOT disabled 后即可进入 重装系统 1.启动盘制作 https://rufus.ie/ 2. F10(各品牌不同 ) 选择U盘重装即可

第四十九期:大牛总结的MySQL锁优化,写得太好了!

随着 IT 技术的飞速发展,各种技术层出不穷,让人眼花缭乱。尽管技术在不断更新换代,但是有些技术依旧被一代代 IT 人使用至今。 作者:崔皓 随着 IT 技术的飞速发展,各种技术层出不穷,让人眼花缭乱。尽管技…

数据结构八-Trie树

文章出处:极客时间《数据结构和算法之美》-作者:王争。该系列文章是本人的学习笔记。 1 Trie树的使用场景 搜索引擎中的搜索词建议。当你在搜索引擎中输入词,搜索引擎提示给你一个词的列表,帮助你快速输入想搜索的词。 这个功能…

[安全模型][Cambria Math][A][]敌手A-> 怎么打出来?

字母A 设置字体 “Cambria Math” -> 𝒜

第五十期:详解语音识别技术的发展

在我们的生活中交流起着重要的作用。人类从符号开始,然后发展到用语言交流,再后来出现了计算和通信技术。在某些情况下,机器不仅与人类交流,也与机器之间交流。计算机和通信技术创造了互联网世界,正如我们所知的物联网…

打造移动测试云平台

转载来源:https://blog.csdn.net/toafu/article/details/80598977 背景 移动技术发展到现阶段,原生、混合式技术发展的足够成熟,可以无缝融合。而随着移动技术的发展和革新,移动领域的测试技术和实践也有了一定发展:工…

AC自动机:多模式串匹配实现敏感词过滤

文章出处:极客时间《数据结构和算法之美》-作者:王争。该系列文章是本人的学习笔记。 1 敏感词过滤场景 在很多支持用户发表内容的网站,都有敏感词过滤替换的功能。例如将一些淫秽、反动内容过滤掉,或者替换为****。在一些社交类…

[毕业论文][格式修改][摘要修改]毕业论文格式内容修改小技巧

背景 毕业季临近,盲审前对毕业论文进行最后一次逐行逐字修改,遇到的一些问题和解决办法 1.自动生成的目录行距可能不一。需要选中后单独再段落种设置行距 2.符号问题 配合查找发现问题 双引号 英文 “English” 中文“” 逗号 英文 English, 中文 &am…

第五十一期:AIOps落地关键点指南

随着越来越多企业愿意在运营中采用AIOps的模式,他们所要面对的问题是:如何以与业务需求相适应的方式来接受它。我们为您准备的一些有关AIOps落地关键点指南。 作者:陈峻 【51CTO.com快译】随着系统效率和复杂程度的日益提高,我们…

算法六——贪心

文章出处:极客时间《数据结构和算法之美》-作者:王争。该系列文章是本人的学习笔记。 1 背豆子的例子 假设我们有一个可以容纳 100kg 物品的背包,可以装各种物品。我们有以下 5 种豆子,每种豆子的总量和总价值都各不相同。为了让…

BZOJ 1827: [Usaco2010 Mar]gather 奶牛大集会 树形DP + 带权重心

Description Bessie正在计划一年一度的奶牛大集会&#xff0c;来自全国各地的奶牛将来参加这一次集会。当然&#xff0c;她会选择最方便的地点来举办这次集会。每个奶牛居住在 N(1<N<100,000) 个农场中的一个&#xff0c;这些农场由N-1条道路连接&#xff0c;并且从任意一…

[运动][组合]睡前运动

保持核心肌群力量 入门级组合运动 全身从上到下 俯卧撑 手部肩部 卷腹 腹部 仰卧抬腿 臀部 深蹲 下肢力量 扶墙踮脚 小腿