名称来由

RK 算法的全称叫 Rabin-Karp 算法. 它是由两位发明者 Rabin 和 Karp 的名字来命名的算法.

实现思路

BF算法的实现思路是对主串n中的每一个连续子串n1,都与模式串m 进行比较,该算法的复杂度为O(m*n)
RK算法是在BF算法的基础上做了一些改进:通过字符串hash值比较代替字符串的遍历比较。这样能提交字符串的比较效率,但是并没有提高算法的时间复杂度,因为计算每一个连续子串n1的hash值,也是有时间消耗的,跟遍历比较的时间复杂度一样都是O(m),所有子串的hash值的计算时间复杂度为O(mn),那么这样整体的RK算法的时间复杂度还是O(mn),进一步的优化点可以放在hash值的计算上

hash值计算优化思路

如果子串n1的hash值的计算,是通过子串中每个字符计算出的val值做的累加,例如主串abcd,那么子串有abcbcd,假设abc串的hash值为hash(abc),那么bcd串的hash值的计算方式就是hash(bcd) = hash(abc) - val(a) + val(d),这样就可以减少没必要的hash值的重复计算,所有子串的hash值的计算时间复杂度为O(m + (n-m)) = O(n)

还有一个问题就是hash冲突,遇到hash冲突(不同的子串得到相同的hash值)怎么办?

遇到hash冲突,则返回到字符串的遍历比较,来最终确定n1与m是否相同

时间复杂度

O(m+n)

伪代码实现

// ln : 主串的长度,lm:模式串的长度
// hn1 : 子串的hash值,hm:模式串的hash值
// val() : 字符hash值的计算方法
for (i = 0 ; i < lm ; i++) {hn1 += val(n[i]);hm += val(m[i]);
}
for (i = 0 ; i <= ln - lm ; i++) {// 如果hash值相同,则返回去比较字符串if (hn1 == hm) {if (两个子串相同) {return i;}}// 计算下一个子串的hash值hn1 += val(n[i + lm +1]);hn1 -= val(n[i]);
}

golang实现

func strStr(haystack string, needle string) int {needleLen := len(needle)if needleLen == 0 {return 0}hlen := len(haystack)if hlen < needleLen {return -1}// 计算第一个子串和模式串的hash值subHaystackHash, needleHash, step, stepMax := 0, 0, 26, 1for i := 0; i < needleLen; i++ {subHaystackHash = (step*subHaystackHash + int(haystack[i]-'a'))needleHash = (step*needleHash + int(needle[i]-'a'))if i > 0 {stepMax *= step}}idx := -1for i, _ := range haystack {if i+needleLen > hlen {break}// 如何hash值相同而且子串与模式串相同if subHaystackHash == needleHash && isMatch(haystack, needle, i) {idx = ibreak} else {// 计算下一个子串hash值subHaystackHash = (subHaystackHash-int(haystack[i]-'a')*stepMax)*step + int(haystack[i+needleLen]-'a')continue}}return idx
}// 字符串匹配
func isMatch(haystack string, needle string, idx int) bool {for i2, _ := range needle {if idx+i2 >= len(haystack) || haystack[idx+i2] != needle[i2] {return false}}return true
}

总结

作为一个字符串匹配的算法,通过hash值预先匹配,从而加快匹配的效率,这确实是一个不错的解决思路,但是该算法的弊端也很明显,那就是需要设计一个可以匹配各类字符串的算法,这个并不容易实现,如果hash算法实现不好,算法的时间复杂度就会进行退化

字符串匹配 - RK算法相关推荐

  1. 字符串匹配 RK 算法总结

    背景 RK算法是通过比较字符串的哈希值来实现字符串匹配,其核心思想是把字符串转换为 N 进制的数字. 本文主要是学习和记录下其实现思想,在日常项目中字符串查找使用 string 的 find 函数即可 ...

  2. 字符串匹配rk算法c语言,字符串匹配问题(BFRK算法)

    1. 题目 有一个主串S={a,b,c,a,c,a,b,d,c},模式串T={a,b,d},请找出模式串在主串中第一次出现的位置 提示:不需要考虑字符串大小写问题,字符均为小写字母 2. BF算法 B ...

  3. kmp算法详解php,php中字符串匹配KMP算法实现例子

    KMP算法是一个比较高级的算法了,加了改进了,下面我们来在php中实现KMP算法,希望例子对各位同学会带来帮助哦. kmp算法是一种改进的字符串匹配算法,由D.E.Knuth与V.R.Pratt和J. ...

  4. 字符串匹配——BMH算法

    字符串匹配--BMH算法 给定主串T和模式串P,返回P在T中首次出现的位置,如果P不存在于T中,返回-1. 这样的问题就是字符串匹配问题,这里给出BMH算法的思想. 设主串T的长度为n,模式串P的长度 ...

  5. 字符串匹配——RabinKarp算法

    字符串匹配--RabinKarp算法 给定主串T和模式串P,返回P在T中首次出现的位置,如果P不存在于T中,返回-1. 这样的问题就是字符串匹配问题,这里给出RabinKarp算法的思想. 设主串T的 ...

  6. 【超详细图解】字符串匹配Boyer-Moore算法:文本编辑器中的查找功能是如何实现的?

    关于字符串匹配算法有很多,之前我有讲过一篇 KMP 匹配算法:图解字符串匹配 KMP 算法,不懂 kmp 的建议看下,写的还不错,这个算法虽然很牛逼,但在实际中用的并不是特别多.至于选择哪一种字符串匹 ...

  7. 两个字符串匹配度算法

    在工作过程中,需要用到两个字符串匹配度算法,网上参考一些资料,写了一个匹配度算法类,项目中用到了而且效果很不错,今天给大家分享. 可以直接复制到你的项目中,就一个调用函数,非常简单. public c ...

  8. C++实现字符串匹配KMP算法

    文章目录 1. 概述 2. 代码实现 3. 代码测试 1. 概述 Kmp算法的介绍及思想参阅下面两篇文章: 字符串匹配KMP算法 算法)通俗易懂的字符串匹配KMP算法及求next值算法 2. 代码实现 ...

  9. 字符串匹配 KMP算法

    问题描述:字符串匹配即查找待匹配字符串(模式串)p在主串s中的位置.一般处理这种问题往往采用简单粗暴的方法--暴力匹配法.所谓暴力匹配法,就是对主串s的每一个字符与要匹配的字符串p的每个字符进行逐一匹 ...

最新文章

  1. import keras 报错 ImportError: cannot import name ‘urlopen‘
  2. python urllib.request 爬虫 数据处理-Python网络爬虫(基于urllib库的get请求页面)
  3. mysql long raw_读取Oracle数据库中LONG RAW字段会抛出异常
  4. mysql 输出参数 sql语句_MySQL: 详细的sql语句
  5. 腾讯视频下载电脑_腾讯视频如何设置允许腾讯视频驻留功能
  6. SpringBoot与Redis缓存
  7. Petal Search is currently only available
  8. JAVA常见算法题(二十五)
  9. 反转 鼠标_灵动轻巧也有好体验,电竞鼠标不能仅看“块头”
  10. C语言读者管理系统——软件项目开发实践
  11. linux汇编预处理,Linux程序在预处理、编译、汇编、链接、运行步骤的作用
  12. python怎么修改界面颜色_python中颜色设置
  13. 利用EQSecure E盾预防流氓软体
  14. 实习日记5:过滤器+批量删除+角色管理
  15. 数据链路层(帧)(二)
  16. html 图片摆动效果,CSS摆动/摇动效果
  17. 碰到spoolsv.exe-应用程序错误怎么办?
  18. 五大常用算法一(回溯,随机化,动态规划)
  19. 2-2学生成绩统计(加强版)
  20. 如何理解java的回调函数?

热门文章

  1. 考研二战日记-第40天——计算机网络:无线网络和移动网络
  2. 自己免费申请的公网IP搭网盘太爽了
  3. python:turtle绘制纸飞机
  4. [AHK]Excel 怎么使用鼠标滚轮控制表格左右移动
  5. 鬼火(irrlicht)的复燃
  6. uml事务、关系和图
  7. [爱情智慧]女人千万别觉得嫁了没钱的男人,他们就会因为感激对你好
  8. 工业智能摄像机的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  9. P42-前端基础-浮动塌陷最终解决方案
  10. 经济管理 第1章 经济与管理概述