我正在使用大量数据进行字符串匹配。
编辑:我正在匹配一个大列表中的单词与一些本体文本文件。我从本体中获取每个文件,并搜索每个文件行的第三个字符串与列表中的任何单词之间的匹配。
我在监督这样一个事实上犯了一个错误:我需要做的不是纯匹配(结果很差),但是我需要一些更宽松的匹配函数,当字符串包含在另一个字符串中时,它也会返回结果。
我用Radix Trie做到了这一点;它非常快,效果很好,但现在我猜我的工作没用,因为trie只返回完全匹配。 :/
执行此操作的算法类型是字符串搜索算法?
有人可以建议一些他有经验的Java实现吗?
算法应该很快,但不是最重要的,会与速度和复杂性相提并论。
我非常感谢所有建议/示例/解释/链接!
谢谢!
什么是"执行此操作的算法类型是字符串搜索算法?"问?
您可能会发现后缀树很有用(它们在概念上类似于Tries)。
每个字符串,前缀为^并以$结尾,并创建所有附加字符串的后缀树。空间使用将是O(n),并且可能比你对trie的更糟糕。
如果你现在需要搜索字符串s,你可以很容易地在O(| s |)时间内完成,就像一个trie,你得到的匹配将是一个子字符串匹配(基本上,你将匹配某些字符串的一些后缀) )。
抱歉,我没有对Java实现的引用。 strike>
找到了一个有用的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
@Moron:我认为这可能正是我需要的,如果我理解的话,我可以用同一棵树做"匹配"和"包含"????
@Julia:是的。如果您想要完全匹配,请在搜索字符串前加上^并附加$并进行匹配。如果要包含,请按原样使用搜索字符串。
@Moron:似乎这将是完美的。一定有一些java lib !!
@Julia:查看我在这个答案中添加的链接。
@Moron:非常感谢!
您可以使用BM算法在单个模式的文本文件中进行搜索,并对列表中的所有模式重复此算法。
另一个最佳解决方案是使用多模式搜索算法,如:Aho-Corasick字符串匹配算法
johannburkard.de/software/stringsearch?你说在文本文件中搜索,但我不需要在文本文件中的任何地方进行匹配,但是每行的每三个字符串都可以指定吗? (对不起详细信息,我很害怕像我用radix trie那样匆匆忙忙)
BM算法匹配任何字符串而不关心字符串的来源(来自文件中的文本,来自db中的单元格等)。
正则表达式绝对是您最好的选择。它们写起来可能有点混乱,但它们是你可以在没有难以理解的if / else或switch语句系列的情况下进行更松散匹配的唯一方法。
另外,它们比替代品快得多。
我修改了我的解释,我没有解释清楚抱歉!
-1:为什么正则表达式"最好"?为什么替换if / else切换语句?在声称替代品之前,您还考虑了哪些其他替代方案?我会说正则表达式的表现会非常糟糕!你必须编译它们,然后在匹配期间可能回溯......
好吧,这个问题最初的措辞(编辑前),这就是我读它的方式 - 显然,它不再适用!
为什么不在java中使用indexOf方法。根据内存的可用性,阅读内容。做一个indexOf并获得你需要的所有行。加载下一组内容。
如果从文件中读取使用nio流。
可能是想法不好,但我相信java。它将使用最好的算法。
如果你使用正则表达式会更好。
我不完全确定我是否正确理解了这个问题,但这听起来像正则表达式会起作用
http://java.sun.com/developer/technicalArticles/releases/1.4regex/
我修改了我的解释,我没有解释清楚抱歉!