Java实现算法导论中Rabin-Karp字符串匹配算法
Rabin-Karp算法的思想:
- 假设子串的长度为M,目标字符串的长度为N
- 计算子串的hash值
- 计算目标字符串中每个长度为M的子串的hash值(共需要计算N-M+1次)
- 比较hash值
- 如果hash值不同,字符串必然不匹配,如果hash值相同,还需要使用朴素算法再次判断
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字符串匹配算法相关推荐
- Java实现算法导论中朴素字符串匹配算法
朴素字符串匹配算法沿着主串滑动子串来循环匹配,算法时间性能是O((n-m+1)m),n是主串长度,m是字串长度,结合算法导论中来理解,具体代码参考: package cn.ansj;public cl ...
- Java实现算法导论中Miller-Rabin随机性素数测试
Miller-Rabin测试: 费马小定理:对于素数p和任意整数a,有ap ≡ a(mod p)(同余).反过来,满足ap ≡ a(mod p),p也几乎一定是素数. 伪素数:如果n是一个正整数,如果 ...
- Java实现算法导论中图的广度优先搜索(BFS)和深度优先搜索(DFS)
对算法导论中图的广度优先搜索(BFS)和深度优先搜索(DFS)用Java实现其中的伪代码算法,案例也采用算法导论中的图. import java.util.ArrayList; import java ...
- Java实现算法导论中反复平方法模取幂
在众多的加密算法中都需要进行幂的取模运算,比如在RSA算法中需要计算d=ne mod N,我们称之为幂模算法,其中: N=p*q(p,q为大素数) n为加密数据,n<N e为公钥,d为私钥,满足 ...
- Java实现算法导论中求解模线性方程解(基于最大公约数欧几里得扩展算法)
基于最大公约数欧几里得扩展算法求解算法导论中模线性方程解.具体要结合算法导论中的有关数论算法章节理解,具体代码如下: package cn.ansj;/*假设方程ax=b(mod n)有解,且x0是方 ...
- Java实现算法导论中有限自动机字符串匹配算法
这里实现了基于有限自动机(Finite Automaton,FA)的模式匹配算法,算法的重点在于利用字符串的前后缀构造模式P的自动机,具体结合导论中的说明来理解,可参考http://www.geeks ...
- Java实现算法导论中快速傅里叶变换FFT递归算法
要结合算法导论理解,参考:http://blog.csdn.net/fjssharpsword/article/details/53281889 代码中算法思路:输入n位(2的幂)向量,分别求值FFT ...
- Java实现算法导论中Pollard的rho启发式方法
Pollard的rho启发式方法用于启发式求解大整数n分解因子,具体要结合导论中来理解,参考代码如下: package cn.ansj;import java.math.BigInteger; imp ...
- Java实现算法导论中快速傅里叶变换FFT迭代算法
要结合算法导论理解,参考:http://blog.csdn.NET/fjssharpsword/article/details/53281889 FFT的迭代实现,可以实现并行电路,和比较网络中的比较 ...
最新文章
- 【微服务架构】SpringCloud使用Ribbon实现负载均衡
- linux c 字符串查找函数 strstr strcasestr
- 安装nvidia-docker2
- Redis简单案例(三) 连续登陆活动的简单实现
- JavaScript Math.random()方法介绍
- Linux内核空间内存申请函数kmalloc、kzalloc、vmalloc的区别
- 前端必须学会的5个原生JavaScript对象方法
- 中国计算机游戏竞赛,信任与欺骗的游戏:全球计算机游戏程序竞赛,诠释了《老子通释》...
- fsck命令--Linux命令应用大词典729个命令解读
- Android11_图片处理
- 使用ResourceHacker以命令行方式更新应用程序图标
- 如何将放大图片不影响清晰度?
- java库存_java实现超市库存管理系统
- Ubuntu20安装RTL8811/RTL8812无线网卡驱动
- EndNote安装教程与使用教程 关联加载word
- 在线客服——各第三方的收费标准及服务提供
- c盘users在哪(c盘users在哪)
- [raspberry]树莓派无线鼠标延迟问题
- 【NISP一级】4.1 Windows终端安全
- qs2021计算机专业排名,2021年QS世界大学专业排名-计算机科学与信息系统