2010-07-16 83 views
2

我正在做大量数据的字符串匹配。Java中的字符串搜索算法

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

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

我这样做了一个Radix Trie;它速度非常快,并且工作得很好,但是现在我想我的工作是无用的,因为一个trie只返回完全匹配。 :/

  • 这样做的算法的类型是字符串搜索算法?
  • 有人可以推荐一些他有经验的Java实现吗?

该算法应该是快速的,但不是最高优先级,会与速度复杂化。

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

谢谢!

+0

什么是“执行此操作的算法类型是字符串搜索算法?”问? – Svante 2010-07-16 22:10:04

回答

3

您可能会发现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

+0

@Moron:我想这可能正是我所需要的,如果我理解得很好,我可以用同一棵树做“匹配”和“包含”? – Julia 2010-07-16 21:58:34

+0

@Julia:是的。如果您想要完全匹配,请在^之前加上搜索字符串并附加$并进行匹配。如果您想包含,请按原样使用搜索字符串。 – 2010-07-16 21:59:51

+0

@Moron:似乎这将是完美的。必须有一些Java库! – Julia 2010-07-16 23:21:06

1

正则表达式是绝对是你最好的选择。编写它们可能会有点混乱,但它们是唯一可以松散匹配的方式,而不会产生难以理解的一系列if/else或switch语句。

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

+0

我修改了我的解释,我没有解释清楚对不起! – Julia 2010-07-16 21:45:17

+0

-1:为什么正则表达式是'最好的'?为什么选择if/else switch语句?在声称替代品较慢之前,您考虑过哪些其他替代方案?我会说正则表达式的表现会很糟糕!你必须编译它们,然后在匹配等过程中可能回溯... – 2010-07-16 21:56:54

+0

好吧,问题原来措辞的方式(预编辑),这是我阅读它的方式 - 显然,它不再适用! – chimeracoder 2010-07-19 14:08:54

1

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

其他最好的解决方案是使用多模式搜索算法,如:你为什么不Java中使用indexOf方法Aho–Corasick string matching algorithm

+0

http://johannburkard.de/software/stringsearch/? 你说在文本文件中搜索,但我不需要匹配文本文件中的任何地方,但每行的每一个字符串,可以指定? (抱歉的细节,我很害怕冲入像我用基数特里这样的事情) – Julia 2010-07-16 23:19:36

+0

BM算法匹配任何字符串而不关心字符串的来源(从文本中的文本,从单元格中的数据库等)。 – 2010-07-17 09:48:06

0

。根据内存的可用性,阅读内容。做一个indexOf并获得你需要的所有行。加载下一组内容。

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

可能是想法不好,但我相信在java。它将使用最好的算法。

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