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函数快,而且慢了一个数量级。我不知道怎么了(如果有的话)。有人对此有想法吗?

谢谢,

艾略特

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/411062.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

双绞线制作方法和标准

双绞线的制作方法&#xff1a; 标准568B&#xff1a;橙白--1&#xff0c;橙--2&#xff0c;绿白--3&#xff0c;蓝--4&#xff0c;蓝白--5&#xff0c;绿--6&#xff0c;棕白--7&#xff0c;棕--8 (如图2&#xff09; 标准568A&#xff1a;绿白--1&#xff0c;绿--2&#xff0c…

深入理解Java枚举类型(enum)

理解枚举类型 枚举类型是Java 5中新增特性的一部分&#xff0c;它是一种特殊的数据类型&#xff0c;之所以特殊是因为它既是一种类(class)类型却又比类类型多了些特殊的约束&#xff0c;但是这些约束的存在也造就了枚举类型的简洁性、安全性以及便捷性。下面先来看看什么是枚举…

[html] html的属性值有规定要使用单引号还是双引号吗?

[html] html的属性值有规定要使用单引号还是双引号吗&#xff1f; 使用单引号和双引号是等效的个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通关前端面试题

java请求注释_求达人给java代码【注释】!!请求尽量详细,万分感谢!!

(1)定义一个接口Inf&#xff0c;含有常量π和一个实现计算功能的方法calculate()&#xff0c;再分别定义一个面积类area和一个周长类circumference&#xff0c;各自按计算圆面积和圆周长具体实现接口中的方法&#xff0c;并以...(1) 定义一个接口Inf&#xff0c;含有常量π和一…

新浪的股票接口 c#

需要注意的这个只是获取单只股票 代码的用处&#xff0c;通过这个代码有炒股的朋友就可以写出简单的自动止损和按一定价格入场的程序了。&#xff08;国内正规券商不支持这种功能&#xff0c;可能是为了防止一些东西。&#xff09; 我们先来看一下股票信息的类 namespace Qianf…

.data()与.detach()的区别

.data()和.detach()都可以获取Variable内部的Tensor&#xff0c;但.detach()更加安全 https://zhuanlan.zhihu.com/p/38475183 转载于:https://www.cnblogs.com/Manuel/p/11077202.html

[html] 直接使用b标签和使用css的font-weight有什么区别?

[html] 直接使用b标签和使用css的font-weight有什么区别&#xff1f; HTML 的标签负责将内容标记为 HTML 元素&#xff0c;浏览器的默认 CSS 样式表负责按照 W3C 的建议来指定 HTML 元素的默认样式。 可以这样理解&#xff0c;使用 b 标签标记的内容浏览器会使用相应的默认 CS…

Flash/Flex学习笔记(47):反向运动学(上)

先回顾上篇所说的"正向运动学"&#xff1a;以人行走的例子来说&#xff0c;基本上可以理解为大腿驱动小腿&#xff0c;小腿驱动脚&#xff0c;从而引发的一系列姿态调整和运动。再举一个例子&#xff0c;我们用着拿一根软鞭或链条的一端挥舞&#xff0c;被手挥舞的这…

java pojo 转 map_JSON和JAVA的POJO的相互转换

正在做一个进销存的项目&#xff0c;为了JSON和JAVA的POJO之间转换&#xff0c;很费劲啊&#xff0c;上传&#xff0c;以备以后有用&#xff01;importjava.util.Collection;importjava.util.HashMap;importjava.util.Map;importnet.sf.json.JSONArray;importnet.sf.json.JSONO…

[html] 说说你对abbr标签的理解,它有什么含义?

[html] 说说你对abbr标签的理解&#xff0c;它有什么含义&#xff1f; 缩略词个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通关前端面试题

静,动态数组总结

本文转自万一老师的博客 原文出处: http://www.cnblogs.com/del/category/114641.html静态数组的定义方法: //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<&l…

java tomcat jms_JavaWeb之使用Tomcat、JNDI与ActiveMQ实现JMS消息通信服务

前言之所以使用JNDI 是出于通用性考虑&#xff0c;该例子使用JMS规范提供的通用接口&#xff0c;没有使用具体JMS提供者的接口&#xff0c;这样可以保证我们编写的程序适用于任何一种JMS实现(ActiveMQ、HornetQ等)。什么是JNDI&#xff1a;JNDI(Java Naming and Directory Inte…

[html] HTML5的触屏事件有哪些?

[html] HTML5的触屏事件有哪些&#xff1f; touchstart 触摸开始 touchmove 接触点移动&#xff08;手指不离开屏幕&#xff09; touchend 触摸结束 touchcancel 触摸被取消个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很…

你是第几名:Excel 中 Large 和 Small 的用法

类似于 SQL 语言中的 TOP X, Large 和Small 有2个参数 Large(Array,k) Array 可以为一个单元格区域&#xff0c;k 为第k各最大值&#xff0c;Small 与之对应返回第k个最小值。 注意&#xff1a;单元格区域中的非数字会被忽略掉。 例子如下&#xff1a; 可以类比Rank的用法&…

mac系统下android studio创建手机模拟器

打开android studio&#xff0c;点击右上角的模拟器图标&#xff0c;打开“Android Virtual Device Manager” 窗口&#xff0c;如下图 点击“Create Virtual Device”&#xff0c;在打开的设备定义列表中&#xff0c;选择“Phone -> Nexus 5X”&#xff0c;右边列出了改机型…

java wait 参数_Java sleep()和wait()的区别

一、什么是sleep()?sleep()是Thread类的方法&#xff0c;导致线程暂停执行的时间&#xff0c;给其他线程执行机会&#xff0c;但是依然保持监控状态&#xff0c;过了指定时间会自动恢复执行&#xff0c;调用sleep()方法不会释放锁对象。当调用sleep()方法后&#xff0c;当前线…

[html]html实现页面跳转都有哪些方法?

[html]html实现页面跳转都有哪些方法&#xff1f; 创建A标签跳转location.hrefform submit<meta http-equiv"refresh" content"5;urlother.html">window.history个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c…

如何设置Hyper-V的虚拟机快捷方式

在Windows Server 2008中&#xff0c;提供的Hyper-V功能&#xff0c;可以很方便地在企业环境中部署多个虚拟机&#xff0c;以适应不同的开发需要。一般我们都是通过下面的方式 1. 打开服务器管理器 2.打开Hyper-V管理器&#xff0c;找到有关的虚拟机&#xff0c;然后右键点击“…

使用 keytool 生成安卓应用程序签名

下载 keytool jar包&#xff1b; 解压jar包到固定目录 如&#xff1a; cd /Library/Java/JavaVirtualMachines/ 进入到jar包目录: cd /Library/Java/JavaVirtualMachines/jdk-12.0.1.jdk/Contents/Home 输入keytool&#xff0c;可以查看各种命令。 执行&#xff1a; keytool -…

java 音频对比_java – 比较两个不同的音频文件不起作用

我想比较两个音频文件,例如mp3和wav.我使用musicg来比较指纹.Wave record1 new Wave(music1.toString());Wave record2 new Wave(music2.toString());FingerprintSimilarity Similarityrecord1.getFingerprintSimilarity(record2);System.out.println(Similarity.getSimilari…