算法以找到多个字符串匹配项。

15 浏览
0 Comments

算法以找到多个字符串匹配项。

我正在寻找一种在大量文本中查找所有匹配项的高效算法的建议。要搜索的术语将被包含在一个列表中,并且可能有1000个以上的可能性。搜索术语可以是一个或多个单词。

显然,我可以通过多次遍历文本并与每个搜索术语进行比较来实现。但这样效率不高。

我考虑过对搜索术语进行排序并组合共同的子段。这样我可以快速消除大量术语。语言是C++,我可以使用boost库。

搜索术语的一个示例可以是一份财富500强公司名称的列表。

有什么想法吗?

0
0 Comments

文章标题:多字符串匹配的算法及解决方法

在处理大量静态英文文本并需要匹配整个单词的情况下,可以尝试以下方法(在问题中应该明确定义什么是“匹配”,你正在查找的文本类型等)。

首先,对整个文档进行预处理,将其转换为Trie树或DAWG(有向无环字图)。

Trie树/DAWG具有以下特点:

给定一个Trie树/DAWG和长度为K的搜索词,你可以在O(K)的时间内查找与该单词相关联的数据(或者判断是否匹配)。

使用DAWG相对于Trie树来说可以节省更多的空间。Trie树利用了许多单词具有共同前缀的事实,而DAWG利用了共同前缀和共同后缀的特性。

在Trie树中,还需要精确地维护单词的位置列表。例如,如果文本是:

"That is that and so it is."

那么单词"that"中最后一个t的节点将有列表{1,3},单词"is"中的s的节点将有列表{2,7}。

现在,当你得到一个单词搜索词时,可以很容易地遍历Trie树并得到该单词的匹配列表。

如果你得到一个多个单词的搜索词,可以按照以下步骤操作:

1. 使用搜索词中的第一个单词遍历Trie树。得到匹配列表,并插入到哈希表H1中。

2. 使用搜索词中的第二个单词遍历Trie树。得到匹配列表。对于每个匹配位置x,在哈希表H1中检查是否存在x-1。如果存在,则将x添加到新的哈希表H2中。

3. 使用搜索词中的第三个单词遍历Trie树。得到匹配列表。对于每个匹配位置y,在哈希表H2中检查是否存在y-1。如果存在,则将y添加到新的哈希表H3中。

4. 以此类推。

最后,你会得到一个包含搜索短语匹配位置的列表,这些位置对应于短语的最后一个单词。

你可以通过维护一个已排序的位置列表并进行二分搜索来优化短语匹配步骤:例如,对于H2中的每个键k,在搜索词3的排序列表中进行二分搜索查找k+1,如果找到,则将k+1添加到H3中,以此类推。

0
0 Comments

多字符串匹配算法(Algorithm to find multiple string matches)是一个被广泛研究的问题。有趣的是,对于搜索单个模式/字符串的最佳算法并不容易推广到多字符串匹配。

“grep”家族实现了非常高效的多字符串搜索。如果可以使用它们作为外部程序,那么请这样做。

如果您真的需要实现该算法,我认为最快的方法是复制agrep的工作原理(agrep在多字符串匹配方面非常出色!)。在这里可以找到源代码和可执行文件。这里还有一篇描述所使用算法、理论背景以及关于字符串匹配的大量信息和指针的论文。

请注意:多字符串匹配已经得到了Knuth、Boyer、Moore、Baeza-Yates等人的深入研究。如果您需要一个真正快速的算法,不要犹豫,站在他们的肩膀上。不要重复造轮子。

谢谢您的回复。我提出这个问题是为了避免重新发明我觉得可能已经得到充分研究的东西。我会查看agrep的源代码。

如果“大段文本”是静态的,我建议创建一个trie/dawg,我认为这应该能够击败agrep的算法,因为它更适用于搜索项固定但要搜索的文本不同的情况。无论如何,既然您接受了这个答案,我想您的大段文本实际上并不是静态的。我建议您修改问题以添加这些信息。

OP说:“要搜索的项目将包含在一个列表中,可能有1000多个可能性。”所以我假设文本不是静态的,因为如果是的话,如果您有1500个要搜索的术语,您可以预先构建一棵树并进行二分搜索。

只是为了让未来的读者更清楚一些 🙂 根据Dwight在对Georg关于这个问题的评论中的回应,似乎文本(“文档”)是静态的,所以可能会有一些混淆的空间。

也许我误解了条件。我认为现在我能做的最好的就是同意这个答案只对“动态”文档有意义。

不是你的错:问题表述不够清晰。由于OP接受了这个答案,我认为您正确地解释了问题。我只是希望OP编辑问题以澄清这一点。如果有人遇到了静态文档的情况,我们在这里的评论和问题的编辑(如果有的话)希望会有所帮助...

要搜索的文本将不是静态的。如果需要,匹配列表可以预处理。

0
0 Comments

多模式匹配是指在给定一组模式串的情况下,在一个文本串中同时查找所有模式串的出现位置。与单模式匹配类似,多模式匹配也有多种算法可供选择,需要根据实际需求选择最适合的算法。

《快速多模式搜索算法》一文对多种多模式匹配算法进行了综述,其中包括Aho-Corasick算法(是Knuth-Morris-Pratt算法的多模式匹配版本,具有线性复杂度)和Commentz-Walter算法(结合了Boyer-Moore和Aho-Corasick算法的特点),并提出了一种新的算法,该算法利用了Boyer-Moore算法的思想来实现多模式匹配。

另外,该文中没有提到的一种基于哈希的算法是Rabin-Karp算法,该算法的最坏情况复杂度比其他算法高,但通过哈希技术可以降低线性因子。最终选择哪种算法取决于具体的使用场景。如果想选择最快的算法,可能需要实现并比较多种算法来在应用程序中进行测试。

原始链接已失效,感谢您的提醒。我已更换为存档版本。

0