几周前,我向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更有效吗?文字搜寻效率相关推荐

  1. java 转义 方法_JAVA 转义函数:跳过转义字符

    从某位仁兄那得到,试验一效果不错,解决了我当前遇到的问题. 整理一番,代码如下: package escape; //java版本的escape和unescape函数 class EscapeUnes ...

  2. java split空字符_java split函数结尾空字符串被丢弃的问题

    java中的split函数用于将字符串分割为字符数组是很方便的,但由于不是很熟悉,犯了错误 如下: String strtest = "1,2,"; String arry[] = ...

  3. java mian 方法_Java mian函数

    JAVA中的主函数是我们再熟悉不过的了,相信每个学习过JAVA语言的人都能够熟练地写出这个程序的入口函数,但对于主函数为什么这么写,其中的每个关键字分别是什么意思,可能就不是所有人都能轻松地答出来的了 ...

  4. java list 效率_Java中5种List的去重方法及它们的效率对比,你用对了吗?

    01.使用两个for循环实现List去重(有序) /**使用两个for循环实现List去重(有序) * * @param list * */ public static List removeDupl ...

  5. java split 问题_java split函数的几个问题

    首先来看问题,然后来看函数的定义,其实什么都在函数定义里面说明白了 1.正则表达式字符串问题 首先输入的regex是一个正则表达式,而不是一个普通的字符串,所以导致很多在正则表达式里面有特殊意义的比如 ...

  6. java drawimage 效果_java 缩放函数drawImage理解(个人总结)

    drawImage public abstract boolean drawImage(Image img, int dx1, int dy1, int dx2, int dy2, int sx1, ...

  7. java 类转换_java实体类转换有没有更优雅的方式?

    属性少的话,直接set即可. 如果属性多的话,可以考虑使用Apache中的Bean工具包,主要使用 BeanUtils.copyProperties(Object dest,Object orig) ...

  8. java 字符串函数_Java字符串函数– 25+必须知道方法

    java 字符串函数 Java字符串函数 (Java String Functions) Java String class has a lot of functions to manipulate ...

  9. js实现indexOf()、实现 strStr() 函数

    先说一下这个题,这个是力扣里简单的题 实现 strStr() 函数 给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串出现的第一个位置( ...

最新文章

  1. Centos7安装go-1.9.2
  2. 2021暑假每日一题 【week9 完结】
  3. JZOJ 5448. 【NOIP2017提高A组冲刺11.3】机房比教室好多了
  4. ubuntu查看版本及检查是否有系统更新的命令
  5. GitHub 发布重磅更新:你电脑上的 IDE 可以删了?!
  6. django学习第77天Django框架ORM
  7. 2017.4.1 kth_number 思考记录
  8. 计算机算法设计与分析 找零钱问题
  9. 生活中常用的汉字?有4600个。都有哪些呢?
  10. 短时傅里叶变换(Short Time Fourier Transform)
  11. html开发一个月多少钱,html5前端开发工资一般是多少
  12. 淘宝标品运营技巧,标品如何实现小单量爆搜索
  13. 【个人网站】个人网站搭建预备工作
  14. 【源码+教程】Java课设项目_12款最热最新Java游戏项目_Java游戏开发_Java小游戏_飞翔的小鸟_王者荣耀_超级玛丽_推箱子_黄金矿工_贪吃蛇
  15. 计算机无法搜索到打印机驱动,电脑连接打印机需要装什么驱动(电脑搜不到打印机设备)...
  16. 最简单的Document解析xml文件
  17. 深入理解latch: cache buffers chains
  18. 输入身份证号获取信息
  19. linux trace学习(二)——trace使用
  20. 李逵和李鬼,求求你,别在MySQL中使用UTF-8了!

热门文章

  1. 前端学习(3290):react hook state-hook传入对象
  2. react学习(54)--注意传递请求
  3. 前端学习(3050):vue+element今日头条管理-表格组件基本使用
  4. 工作408- Module build failed (from ./node_modules/sass-loader/dist/cjs.js)
  5. [html]请描述HTML元素的显示优先级
  6. [html] Ajax与Flash的优缺点分别是什么?
  7. [css] 手写一个满屏品字布局的方案
  8. 工作274:ele-图标使用
  9. 前端学习(2761):uni-app样式的学习
  10. git clone 时候出现Please make sure you have the correct access rights and the repository exists.