Java中的字符串搜索算法

Posted

技术标签:

【中文标题】Java中的字符串搜索算法【英文标题】:String searching algorithms in Java 【发布时间】:2011-03-17 04:30:47 【问题描述】:

我正在对大量数据进行字符串匹配。

编辑:我正在将一个大列表中包含的单词与一些本体文本文件进行匹配。我从本体中获取每个文件,并在每个文件行的第三个字符串与列表中的任何单词之间搜索匹配项。

我在监督我需要做的不是纯匹配(结果很差)这一事实时犯了一个错误,但我需要一些更松散的匹配函数,当字符串包含在另一个字符串中时它也会返回结果。

我用Radix Trie 做到了这一点;它非常快并且效果很好,但现在我想我的工作没用,因为 trie 只返回完全匹配。 :/

执行此操作的算法类型是字符串搜索算法吗? 有人能推荐一些他有经验的 Java 实现吗?

算法应该很快,但不是最重要的,会兼顾速度和复杂性。

我非常感谢所有建议/示例/解释/链接!

谢谢!

【问题讨论】:

什么是“执行此操作的算法类型是字符串搜索算法?”问? 【参考方案1】:

您可能会发现Suffix Trees 很有用(它们在概念上与 Tries 相似)。

每个字符串,您在前面加上 ^ 并以 $ 结尾,并创建一个包含所有附加字符串的后缀树。空间使用量将是 O(n),并且可能比您的 trie 使用量更差。

如果您现在需要搜索字符串 s,您可以在 O(|s|) 时间内轻松完成,就像 trie 一样,您得到的匹配将是子字符串匹配(基本上,您将匹配一些后缀一些字符串)。

抱歉,我手头没有对 Java 实现的引用。

找到一个有用的 *** 答案:Generalized Suffix Tree Java Implementation

其中有: http://illya-keeplearning.blogspot.com/2009/04/suffix-trees-java-ukkonens-algorithm.html

依次有:源代码:http://illya.yolasite.com/resources/suffix-tree.zip

【讨论】:

@Moron:我想这可能正是我需要的,如果我理解得很好,我可以用同一棵树“匹配”和“包含”???? @Julia:没错。如果您想要完全匹配,请在搜索字符串前加上 ^ 并附加 $ 并进行匹配。如果要包含,请按原样使用搜索字符串。 @Moron: 看来这将是完美的。一定有一些java lib!! @Julia:查看我添加到此答案的链接。【参考方案2】:

您可以使用BM algorithm 在文本文件中搜索单个模式,然后对列表中的所有模式重复此算法。

另一个最佳解决方案是使用多模式搜索算法,例如:Aho–Corasick string matching algorithm

【讨论】:

johannburkard.de/software/stringsearch ?你说在文本文件中搜索,但我不需要匹配文本文件中的任何地方,而是每行中的每三个字符串,可以指定吗? (对不起,我害怕像我对 radix trie 所做的那样匆忙做一些事情) BM 算法匹配任何字符串而不关心字符串的来源(来自文件中的文本,来自数据库中的单元格......等等)。【参考方案3】:

正则表达式绝对是你最好的选择。它们写起来可能有点乱,但它们是唯一能让你进行更松散匹配的方法,而无需一系列难以理解的 if/else 或 switch 语句。

另外,它们会比替代方案快很多。

【讨论】:

-1:为什么正则表达式是“最好的”?为什么选择 if/else switch 语句?在声称替代方案更慢之前,您还考虑了哪些其他替代方案?我会说正则表达式的性能会很差!您必须编译它们,然后在匹配等过程中可能回溯...... 嗯,问题的最初表述方式(预编辑),这就是我阅读它的方式 - 显然,它不再适用!【参考方案4】:

我不完全确定我是否正确理解了这个问题,但听起来正则表达式可以完成这项工作

http://java.sun.com/developer/technicalArticles/releases/1.4regex/

【讨论】:

【参考方案5】:

为什么不使用 java 中的 indexOf 方法。根据内存的可用性,阅读内容。执行 indexOf 并获取您需要的所有行。加载下一组内容。

如果从文件中读取使用 nio 流。

可能这个想法很糟糕,但我相信java。它将使用最好的算法。

如果你使用正则表达式会更好。

【讨论】:

以上是关于Java中的字符串搜索算法的主要内容,如果未能解决你的问题,请参考以下文章

Java搜索算法[关闭]

java JAVA 8中的二进制搜索算法(仅限整数)实现

字符串搜索算法Boyer-Moore的Java实现

十根搜索算法

深度优先搜索原理与实践(java)

java二分搜索算法怎样实现?