这一节介绍一下由Rabin和Karp提出的RK算法。

1,RK算法的基本思想

HASH!

如果两个字符串hash后的值不相同,则它们肯定不相同;如果它们hash后的值相同,它们不一定相同。

RK算法的基本思想就是:将模式串P的hash值跟主串S中的每一个长度为|P|的子串的hash值比较。如果不同,则它们肯定不相等;如果相同,则再诸位比较之。

2,RK算法的求解过程

将我们用来比较的字符串的全集设为∑={a,b,…,z},设∑的长度为d=|∑|,则主串和模式串都可以看作是d进制数。例如只由数字组成的字符串,它的全集∑={0,1,2,3,4,5,6,7,8,9},d=10。

设模式串为P,其长度为m,主串为S,其长度为n。则模式串P可以看作是一个m位的d进制数A,主串S可以看作是一个n位的d进制数。我们的模式匹配过程就是将A与主串中的每个长度为m的d进制数S[t…t+m-1] (t=0,1,2,…,n-m+1)的值做比较,所以整个模式匹配过程就变成了两个d进制数之间的比较过程。例如模式串为123,主串为65127451234,就是将十进制数123跟十进制数651, 512, 127, 274, 745, 451, 512, 123的逐个比较过程。

明确了匹配过程,下面就是求解A和求解S[t…t+m-1] (t=0,1,2,…,n-m+1)的过程:

1)求解A。根据多项式计算方法,A = P[m-1] + d * (P[m-2] + d * (P[m-3] + …+ d * (P[1] + d*P[0])…))

2)求解S[t…t+m-1]。为了方便表示,我们设S[t…t+m-1] = St,则S[t+1…t+m] = St+1

假设已求得St,现在要求St+1,需要注意的是St+1是St去掉高位数据,其余的m-1位乘以d后再在最低位加一位得到。于是

St+1 = d * (St – dm-1*S[t]) + S[t+m]

公式比较晦涩,举个例子看看吧。比如上面例子中主串是65127451234。S2=127,那么S3=10×(127-102×1)+ 4 = 274

现在的问题是,如果A的值太大,比较的过程会比较耗时,这个时候我们可以将这个大数mod q(q是一个大素数),同理,st也mod q,将两个取模之后的数相比较。

3,RK算法的实现    

 1 #define q 144451
 2 #define d 26
 3
 4 int isMatch(char *S, int i, char *P, int m)
 5 {
 6     int is, ip;
 7     for(is=i, ip=0; is != m && ip != m; is++, ip++)
 8         if(S[is] != P[ip])
 9             return 0;
10     return 1;
11 }
12
13 /*
14  * 字符串匹配的RK算法
15  * Author:Rabin & Karp
16  * 实现:CobbLiu
17  * 若成功匹配返回主串中的偏移,否则返回-1
18  */
19 int RK(char *S, char *P)
20 {
21     int m  = strlen(P);
22     int n  = strlen(S);
23     unsigned int h   = 1
24     unsigned int A   = 0;
25     unsigned int St  = 0;
26     int i;
27
28     //初始化,算出最d进制下的最高位
29     for(i = 0;i < m - 1;i++)
30         h = (h*d) % q;
31
32     for(i = 0; i != m; i++){
33         A = (d*A + (P[i] - 'a')) % q;
34         St = (d*St + (S[i] - 'a')) % q;
35     }
36
37     for(i = 0; i != n-m; i++){
38         if(A == St)
39             if(isMatch(S,i,P,m))
40                 return i;
41         St = (d*(St - h*(S[i]-'a'))+(S[i+m]-'a')) % q;
42     }
43
44     return -1;
45 }

4,算法的复杂度分析

  如果选择的素数q>=m, 则RK算法的期望运行时间为O(n+m), 如果m<<n,则算法的期望运行时间为O(n)。具体推理过程请参看《算法导论》第32章P562页。

串的模式匹配算法---RK相关推荐

  1. 第四章:2.串 -- 串的模式匹配算法(KMP)

    前言: 目录: 1.串类型的定义 2.串的表示和实现 3.串的模式匹配算法 4.串操作应用举例 正文: 串的模式匹配即,在给定主串S 中,搜索子串T 的位置,如果存在T 则返回其所在位置,否则返回 0 ...

  2. 数据结构笔记(十四)-- 串的模式匹配算法

    串的模式匹配算法 一.普通模式匹配算法 1.算法解析 普通模式匹配算法,其实现过程没有任何技巧,就是简单粗暴地拿一个串同另一个串中的字符一一比对,得到最终结果. 例如,使用普通模式匹配算法判断串 T( ...

  3. 4.3串的模式匹配算法(BF算法)

    4.3.1 求子串位置的定位函数Index(S,T,pos) 子串的定位操作通常称做串的模式匹配(其中T称为模式串),采用定长顺序存储结构,可以写出不依赖于其他串操作的匹配算法. 算法4.5: 下面是 ...

  4. (王道408考研数据结构)第四章串-第二节:串的模式匹配算法(朴素和KMP)

    串的匹配是一个非常重要的话题,我们在Word中经常使用的搜索功能所反映的就是串的匹配问题,相应的算法也是层出不穷,各有优缺点,本节主要涉及两种算法:朴素算法和KMP算法 在讲解之前,有几个术语需要掌握 ...

  5. 数据结构:KMP算法 串的模式匹配算法(全网最详细)

    目录 KMP模式匹配算法 简述 KMP模式匹配算法原理 如果人眼来优化的话,怎样处理         接下来我们自己来发现j的移动规律: 这一段公式证明了我们为什么可以直接将j移动到k而无须再比较前面 ...

  6. 串的模式匹配算法(超详细)

    串的模式匹配 1 简单的模式匹配算法 2 KMP算法 3 KMP算法改进 4 时间复杂度比较 1 简单的模式匹配算法 思想: 将主串中所有长度为m的子串依次与模式串对比,直到找到一个完全匹配的子串或所 ...

  7. 【考研】串的模式匹配算法——KMP算法(含真题)

    前言 本文内容源于对<数据结构(C语言版)>(第2版).王道讲解学习所得心得.笔记整理和总结,以便复习. 可搭配以下链接一起学习: [考研]<数据结构>知识点总结.pdf_考研 ...

  8. 《数据结构》—— 串的模式匹配算法

    串的模式匹配 一.简单的模式匹配算法(BF算法) 二.KMP算法 一.简单的模式匹配算法(BF算法) 在实际应用中我们常常能用到类似串的模式匹配,也称子串的定位操作.例如单词查找,百度搜索都是串的模式 ...

  9. 串的模式匹配算法1-BF算法

    目录 1.BF算法 1.1匹配过程: 1.2直接使用string方法编写BF算法: 1.3编写SString来编写BF算法 子串的定位运算通常称为串的模式匹配或是串匹配.著名的算法有BF算法和KMP算 ...

最新文章

  1. 【自然框架】——思路、结构、特点的介绍(初稿,欢迎大家多提意见)
  2. 通俗易懂地解释遗传算法?有什么例子?
  3. SSDT表与ShadowSSDT表
  4. Kali-linux安装设置
  5. 双十一,没有买卖就没有伤害!
  6. win7 蓝屏信息获取和处理
  7. docker go get问题_创建优化的Go镜像文件以及踩过的坑
  8. 牛皮啊!竟然可以为Dubbo接口生成文档了!
  9. R语言领跑 大数据岗位霸占IT薪酬榜单
  10. micropython文件上传软件_MicroPython
  11. 天猫精灵开发网关php开发,天猫精灵对接
  12. 深度强化学习(二)强化学习算法的分类
  13. python 手机摄像头文字识别软件_手机上有哪些好用的文字识别工具?
  14. 深度学习论文: Learning to Resize Images for Computer Vision Tasks及其PyTorch实现
  15. Python+Django+MySQL资产管理系统
  16. VBA---打开excel
  17. 绿色版软件怎么添加鼠标右键菜单里
  18. 【中级计量经济学】Lecture 5 自相关
  19. 用手机模拟加密门禁卡【不用电脑】
  20. Python 数据分析之双色球高频数据统计

热门文章

  1. MySQL在没有可视化界面下查看数据库内容
  2. GPS从入门到放弃(十九)、精密星历(sp3格式)
  3. win7平台下QT软件的打包与发布(部署与安装) 打包成安装包样式
  4. 电机专用SVPWM算法实现
  5. SylixOS应用层中访问串口设备
  6. 终极算法——第三章:符号学派:休谟的归纳问题
  7. 计算机视觉之迁移学习中的微调(fine tuning)
  8. 【计算机视觉基础】MATLAB程序实现图像中两个像素点的8-邻域、欧几里得距离与出租车距离、互换两像素点的罗森菲尔德8-邻域像素值
  9. e戴尔服务器型号,【05NF18 6W2PW F750E-S0 R720 R520 DELL服务器电源模块】价格_厂家 - 中国供应商...
  10. 国产LINUX服务器操作系统openEuler下的轻量开源虚拟化工具stratovirt