Rabin-Karp算法的思想:

  1. 假设子串的长度为M,目标字符串的长度为N
  2. 计算子串的hash值
  3. 计算目标字符串中每个长度为M的子串的hash值(共需要计算N-M+1次)
  4. 比较hash值
  5. 如果hash值不同,字符串必然不匹配,如果hash值相同,还需要使用朴素算法再次判断
在算法导论中,hash是通过基数来实现,将每个字符串映射成d进制的数字,再利用模来实现,具体可结合导论中来理解,参考代码如下:
package cn.ansj;public class RabinKarp {public static void RabinKarpAlogrithm(char[] T,char[] P, int d,int q){int n=T.length;int m=P.length;if( n < m) return ;int h = 1;for(int i=1; i<=m-1; i++)   // 计算高度 h h = h*d%q;//m-1个d相乘然后模q//预处理,计算p, t0 int p=0, t=0;for(int i=0; i<m; i++) {p = (( d*p + P[i]) % q); t = (( d*t + T[i]) % q);}//开始匹配for(int s=0; s <n-m+1; s++) {  if( p == t ){int i=0;for(i=0; i<m; i++)// 进一步验证if(P[i]!=T[s+i])break;if(i==m) System.out.println("Pattern ocurs with shift:"+s);}if( s < n-m )t= (d* (t - T[s]*h%q) + T[s+m])  % q;  // 计算ts+1}System.out.println("string matching ends");}public static void main(String[] args){String strT="2359023141526739921";String strP="31415";char[] T=strT.toCharArray();char[] P=strP.toCharArray();int d=10;int q=13;RabinKarp.RabinKarpAlogrithm(T,P,d,q);   }
}

执行结果:

Pattern ocurs with shift:6
string matching ends

Java实现算法导论中Rabin-Karp字符串匹配算法相关推荐

  1. Java实现算法导论中朴素字符串匹配算法

    朴素字符串匹配算法沿着主串滑动子串来循环匹配,算法时间性能是O((n-m+1)m),n是主串长度,m是字串长度,结合算法导论中来理解,具体代码参考: package cn.ansj;public cl ...

  2. Java实现算法导论中Miller-Rabin随机性素数测试

    Miller-Rabin测试: 费马小定理:对于素数p和任意整数a,有ap ≡ a(mod p)(同余).反过来,满足ap ≡ a(mod p),p也几乎一定是素数. 伪素数:如果n是一个正整数,如果 ...

  3. Java实现算法导论中图的广度优先搜索(BFS)和深度优先搜索(DFS)

    对算法导论中图的广度优先搜索(BFS)和深度优先搜索(DFS)用Java实现其中的伪代码算法,案例也采用算法导论中的图. import java.util.ArrayList; import java ...

  4. Java实现算法导论中反复平方法模取幂

    在众多的加密算法中都需要进行幂的取模运算,比如在RSA算法中需要计算d=ne mod N,我们称之为幂模算法,其中: N=p*q(p,q为大素数) n为加密数据,n<N e为公钥,d为私钥,满足 ...

  5. Java实现算法导论中求解模线性方程解(基于最大公约数欧几里得扩展算法)

    基于最大公约数欧几里得扩展算法求解算法导论中模线性方程解.具体要结合算法导论中的有关数论算法章节理解,具体代码如下: package cn.ansj;/*假设方程ax=b(mod n)有解,且x0是方 ...

  6. Java实现算法导论中有限自动机字符串匹配算法

    这里实现了基于有限自动机(Finite Automaton,FA)的模式匹配算法,算法的重点在于利用字符串的前后缀构造模式P的自动机,具体结合导论中的说明来理解,可参考http://www.geeks ...

  7. Java实现算法导论中快速傅里叶变换FFT递归算法

    要结合算法导论理解,参考:http://blog.csdn.net/fjssharpsword/article/details/53281889 代码中算法思路:输入n位(2的幂)向量,分别求值FFT ...

  8. Java实现算法导论中Pollard的rho启发式方法

    Pollard的rho启发式方法用于启发式求解大整数n分解因子,具体要结合导论中来理解,参考代码如下: package cn.ansj;import java.math.BigInteger; imp ...

  9. Java实现算法导论中快速傅里叶变换FFT迭代算法

    要结合算法导论理解,参考:http://blog.csdn.NET/fjssharpsword/article/details/53281889 FFT的迭代实现,可以实现并行电路,和比较网络中的比较 ...

最新文章

  1. 【微服务架构】SpringCloud使用Ribbon实现负载均衡
  2. linux c 字符串查找函数 strstr strcasestr
  3. 安装nvidia-docker2
  4. Redis简单案例(三) 连续登陆活动的简单实现
  5. JavaScript Math.random()方法介绍
  6. Linux内核空间内存申请函数kmalloc、kzalloc、vmalloc的区别
  7. 前端必须学会的5个原生JavaScript对象方法
  8. 中国计算机游戏竞赛,信任与欺骗的游戏:全球计算机游戏程序竞赛,诠释了《老子通释》...
  9. fsck命令--Linux命令应用大词典729个命令解读
  10. Android11_图片处理
  11. 使用ResourceHacker以命令行方式更新应用程序图标
  12. 如何将放大图片不影响清晰度?
  13. java库存_java实现超市库存管理系统
  14. Ubuntu20安装RTL8811/RTL8812无线网卡驱动
  15. EndNote安装教程与使用教程 关联加载word
  16. 在线客服——各第三方的收费标准及服务提供
  17. c盘users在哪(c盘users在哪)
  18. [raspberry]树莓派无线鼠标延迟问题
  19. 【NISP一级】4.1 Windows终端安全
  20. qs2021计算机专业排名,2021年QS世界大学专业排名-计算机科学与信息系统

热门文章

  1. linux 蓝牙编程,实战Linux Bluetooth编程(三) HCI层编程
  2. linux查看占用内存最多的程序
  3. Linux cat 命令
  4. VBA编程常用词汇英汉对照表
  5. 关于Unity中Mecanim动画的动画状态代码控制与代码生成动画控制器
  6. C#后台线程和UI的交互
  7. android中SELINUX规则分析和语法简介
  8. WINCE下实现基于USB的camera
  9. Nandflash K9F1208U0B学习
  10. mysql 连接器配置_配置连接器 - 金融分布式架构 SOFAStack - 阿里云