字符串找子串java算法_java – 用于在字符串中搜索子字符串的快速算法

我想要一个有效的算法(或库),我可以使用在Java中搜索字符串中的子字符串。

我想做的是:

给定一个输入字符串 – INSTR:

“BCDEFGH”

和一组候选字符串 – CAND:

“AB”, “CDE”, “FG”, “H”, “IJ”

查找与INSTR中的子串匹配的任何CAND字符串

在这个例子中,我会匹配“CDE”,“FG”和“H”(但不是“AB”和“IJ”)

可能有许多候选字符串(在CAND),但更重要的是,我将这样搜索数百万次,所以我需要它是FAST。

我想使用char数组。此外,我不是嵌入在建筑解决方案,如分布搜索 – 只是最有效的功能/算法在本地。

另外,CAND和INSTR中的所有字符串都将相对较小(<50字符),即目标字符串INSTR相对于候选字符串不是长。 更新我应该提到,CAND字符串的集合在INSTR的所有值上是不变的。 更新我只需要知道有一个匹配 – 我不需要知道什么是匹配。 最后更新

我选择尝试AhoCorsick和Rabin-Karp,由于简单的实现。

因为我有可变长度模式我使用修改Rabin-Karp散列每个模式的前n个字符,其中n是最小模式的长度,N是我滚动子字符串搜索窗口的长度。

对于Aho Corsick我使用this

在我的测试中,我在两个文档中搜索了1000个模式的报纸文章,平均跨1000迭代等…

标准化完成时间为:

AhoCorsick:1

RabinKarp:1.8

Naive搜索(检查每个模式&使用string.contains):50

*一些资源描述在下面的答案中提到的algos:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值