Java中的字符串搜索算法

时间:2010-07-16 21:29:53

标签: java algorithm matching string-matching string-search

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

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

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

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

  • 执行此操作的算法类型是字符串搜索算法?
  • 有人可以建议一些他有经验的Java实现吗?

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

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

谢谢!

5 个答案:

答案 0 :(得分:3)

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

每个字符串,前缀为^并以$结尾,并创建所有附加字符串的后缀树。空间使用量为O(n),可能比你对trie的要求更差。

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

抱歉,我没有方便的Java实现参考。

找到一个有用的stackoverflow答案: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

答案 1 :(得分:1)

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

另外,它们会比替代品快得多。

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

我不完全确定我是否正确理解了这个问题,但这听起来像正则表达式会起作用

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

答案 4 :(得分:0)

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

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

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

如果使用正则表达式,那就更好了。