java indexof效率_Java indexOf函数比Rabin-Karp更有效吗?文字搜寻效率
几周前,我向Stackoverflow提出了一个问题,该问题涉及如何创建一种有效的算法来搜索大量文本中的模式。现在,我正在使用String函数indexOf进行搜索。一个建议是使用Rabin-
Karp作为替代方案。我编写了一些如下的测试程序,以测试Rabin-Karp的实现,如下所示。
public static void main(String[] args) {
String test = "Mary had a little lamb whose fleece was white as snow";
String p = "was";
long start = Calendar.getInstance().getTimeInMillis();
for (int x = 0; x < 200000; x++)
test.indexOf(p);
long end = Calendar.getInstance().getTimeInMillis();
end = end -start;
System.out.println("Standard Java Time->"+end);
RabinKarp searcher = new RabinKarp("was");
start = Calendar.getInstance().getTimeInMillis();
for (int x = 0; x < 200000; x++)
searcher.search(test);
end = Calendar.getInstance().getTimeInMillis();
end = end -start;
System.out.println("Rabin Karp time->"+end);
}
这是我正在使用的Rabin-Karp的实现:
import java.math.BigInteger;
import java.util.Random;
public class RabinKarp {
private String pat; // the pattern // needed only for Las Vegas
private long patHash; // pattern hash value
private int M; // pattern length
private long Q; // a large prime, small enough to avoid long overflow
private int R; // radix
private long RM; // R^(M-1) % Q
static private long dochash = -1L;
public RabinKarp(int R, char[] pattern) {
throw new RuntimeException("Operation not supported yet");
}
public RabinKarp(String pat) {
this.pat = pat; // save pattern (needed only for Las Vegas)
R = 256;
M = pat.length();
Q = longRandomPrime();
// precompute R^(M-1) % Q for use in removing leading digit
RM = 1;
for (int i = 1; i <= M - 1; i++)
RM = (R * RM) % Q;
patHash = hash(pat, M);
}
// Compute hash for key[0..M-1].
private long hash(String key, int M) {
long h = 0;
for (int j = 0; j < M; j++)
h = (R * h + key.charAt(j)) % Q;
return h;
}
// Las Vegas version: does pat[] match txt[i..i-M+1] ?
private boolean check(String txt, int i) {
for (int j = 0; j < M; j++)
if (pat.charAt(j) != txt.charAt(i + j))
return false;
return true;
}
// check for exact match
public int search(String txt) {
int N = txt.length();
if (N < M)
return -1;
long txtHash;
if (dochash == -1L) {
txtHash = hash(txt, M);
dochash = txtHash;
} else
txtHash = dochash;
// check for match at offset 0
if ((patHash == txtHash) && check(txt, 0))
return 0;
// check for hash match; if hash match, check for exact match
for (int i = M; i < N; i++) {
// Remove leading digit, add trailing digit, check for match.
txtHash = (txtHash + Q - RM * txt.charAt(i - M) % Q) % Q;
txtHash = (txtHash * R + txt.charAt(i)) % Q;
// match
int offset = i - M + 1;
if ((patHash == txtHash) && check(txt, offset))
return offset;
}
// no match
return -1; // was N
}
// a random 31-bit prime
private static long longRandomPrime() {
BigInteger prime = new BigInteger(31, new Random());
return prime.longValue();
}
// test client
}
Rabin-Karp的实现工作方式是返回我要查找的字符串的正确偏移量。但是,令我惊讶的是运行测试程序时发生的时序统计信息。他们来了:
Standard Java Time->39
Rabin Karp time->409
这真是令人惊讶。Rabin-Karp(至少在这里已实现)不仅不比标准java indexOf
String函数快,而且慢了一个数量级。我不知道怎么了(如果有的话)。有人对此有想法吗?
谢谢,
艾略特
java indexof效率_Java indexOf函数比Rabin-Karp更有效吗?文字搜寻效率相关推荐
- java 转义 方法_JAVA 转义函数:跳过转义字符
从某位仁兄那得到,试验一效果不错,解决了我当前遇到的问题. 整理一番,代码如下: package escape; //java版本的escape和unescape函数 class EscapeUnes ...
- java split空字符_java split函数结尾空字符串被丢弃的问题
java中的split函数用于将字符串分割为字符数组是很方便的,但由于不是很熟悉,犯了错误 如下: String strtest = "1,2,"; String arry[] = ...
- java mian 方法_Java mian函数
JAVA中的主函数是我们再熟悉不过的了,相信每个学习过JAVA语言的人都能够熟练地写出这个程序的入口函数,但对于主函数为什么这么写,其中的每个关键字分别是什么意思,可能就不是所有人都能轻松地答出来的了 ...
- java list 效率_Java中5种List的去重方法及它们的效率对比,你用对了吗?
01.使用两个for循环实现List去重(有序) /**使用两个for循环实现List去重(有序) * * @param list * */ public static List removeDupl ...
- java split 问题_java split函数的几个问题
首先来看问题,然后来看函数的定义,其实什么都在函数定义里面说明白了 1.正则表达式字符串问题 首先输入的regex是一个正则表达式,而不是一个普通的字符串,所以导致很多在正则表达式里面有特殊意义的比如 ...
- java drawimage 效果_java 缩放函数drawImage理解(个人总结)
drawImage public abstract boolean drawImage(Image img, int dx1, int dy1, int dx2, int dy2, int sx1, ...
- java 类转换_java实体类转换有没有更优雅的方式?
属性少的话,直接set即可. 如果属性多的话,可以考虑使用Apache中的Bean工具包,主要使用 BeanUtils.copyProperties(Object dest,Object orig) ...
- java 字符串函数_Java字符串函数– 25+必须知道方法
java 字符串函数 Java字符串函数 (Java String Functions) Java String class has a lot of functions to manipulate ...
- js实现indexOf()、实现 strStr() 函数
先说一下这个题,这个是力扣里简单的题 实现 strStr() 函数 给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串出现的第一个位置( ...
最新文章
- Centos7安装go-1.9.2
- 2021暑假每日一题 【week9 完结】
- JZOJ 5448. 【NOIP2017提高A组冲刺11.3】机房比教室好多了
- ubuntu查看版本及检查是否有系统更新的命令
- GitHub 发布重磅更新:你电脑上的 IDE 可以删了?!
- django学习第77天Django框架ORM
- 2017.4.1 kth_number 思考记录
- 计算机算法设计与分析 找零钱问题
- 生活中常用的汉字?有4600个。都有哪些呢?
- 短时傅里叶变换(Short Time Fourier Transform)
- html开发一个月多少钱,html5前端开发工资一般是多少
- 淘宝标品运营技巧,标品如何实现小单量爆搜索
- 【个人网站】个人网站搭建预备工作
- 【源码+教程】Java课设项目_12款最热最新Java游戏项目_Java游戏开发_Java小游戏_飞翔的小鸟_王者荣耀_超级玛丽_推箱子_黄金矿工_贪吃蛇
- 计算机无法搜索到打印机驱动,电脑连接打印机需要装什么驱动(电脑搜不到打印机设备)...
- 最简单的Document解析xml文件
- 深入理解latch: cache buffers chains
- 输入身份证号获取信息
- linux trace学习(二)——trace使用
- 李逵和李鬼,求求你,别在MySQL中使用UTF-8了!
热门文章
- 前端学习(3290):react hook state-hook传入对象
- react学习(54)--注意传递请求
- 前端学习(3050):vue+element今日头条管理-表格组件基本使用
- 工作408- Module build failed (from ./node_modules/sass-loader/dist/cjs.js)
- [html]请描述HTML元素的显示优先级
- [html] Ajax与Flash的优缺点分别是什么?
- [css] 手写一个满屏品字布局的方案
- 工作274:ele-图标使用
- 前端学习(2761):uni-app样式的学习
- git clone 时候出现Please make sure you have the correct access rights and the repository exists.