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

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

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

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,一经查实,立即删除!

相关文章

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

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

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

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

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

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

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

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

第四十九期:大牛总结的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;并且从任意一…

第五十二期:Java开发数据库设计的14个技巧,你知道几个?

可以是一对一、一对多、多对多的关系。在一般情况下&#xff0c;它们是一对一的关系&#xff1a;即一张原始单据对应且只对应一个实体。在特殊情况下&#xff0c;它们可能是一对多或多对一的关系&#xff0c;即一张原始单证对应多个实体&#xff0c;或多张原始单证对应一个实体…

《鸟哥的Linux私房菜--基础篇》学习

第四章 显示日期与时间的指令&#xff1a;date 输入&#xff1a; (base) liyihuadeMacBook-Pro:~ liyihua$ date 输出&#xff1a; Thu Jun 6 08:44:02 CST 2019显示日历指令&#xff1a;cal 输入&#xff1a; (base) liyihuadeMacBook-Pro:~ liyihua$ cal 输出&#xff1a; J…

第五十三期:公司如何选择数据库?DynamoDB、Hadoop和MongoDB 大比拼

随着公司数据存储方式的不断扩展&#xff0c;本文旨在比较公司使用的一些更现代的数据库系统——了解DynamoDB&#xff0c;Hadoop和MongoDB可以提供哪些功能将帮助用户针对业务模型做出更好的决策。 作者&#xff1a;久谦 用户如何选择最能满足当前业务需求的数据库&#xff…

[引用格式][中文论文][毕业论文]毕业论文引用格式 英文引用文献间隔过大

英文引用文献间隔过大&#xff0c;需要选中该条英文引用文献&#xff0c;在段落设置的中文版式设置西文换行&#xff0c;设置后再进行微调 设置前 设置后 设置方法

动态规划——0-1背包问题

文章出处&#xff1a;极客时间《数据结构和算法之美》-作者&#xff1a;王争。该系列文章是本人的学习笔记。 1 0-1背包问题 背包能够承受的总重量一定w&#xff0c;每个物品的总量不同int[] weight表示。怎么放才能让背包中物品的总重量最大。 每次决定一种物品&#xff0c…

第五十四期:MongoDB与MySQL:如何选择

MongoDB和MySQL分别是领先的开源NoSQL和关系数据库。哪个最适合您的应用程序? 作者&#xff1a;XEyes行走的CODE来源 MongoDB和MySQL分别是领先的开源NoSQL和关系数据库。哪个最适合您的应用程序? 在1990年代的互联网泡沫时期&#xff0c;用于Web应用程序的一种通用软件堆栈…