是否有一些快速算法来检查两个字符串集中的子字符串
Posted
技术标签:
【中文标题】是否有一些快速算法来检查两个字符串集中的子字符串【英文标题】:Is there some fast algorithm to check substrings in two string sets 【发布时间】:2020-08-20 14:17:50 【问题描述】:有两个字符串集(c++)
set<string> set1, set2;
我需要迭代 set1 来检查 set1 中的任何字符串是否是 set2 中字符串的子字符串。
下面的代码是我的解决方案,有什么快速算法吗?
for(auto& str1 : set1)
for(auto& str2: set2)
if (strstr(str2.data(), str1.data()))
// do something
有一些限制
-
该函数用于在线 RPC 服务器
set2 和 set1 的候选对象可能太大而无法完全加载到内存中,因此我无法构建一些索引,例如 trie 或缓存结果。
【问题讨论】:
strstr(str2.data(), str1.data())
真的吗?
字符串需要多长时间?很长还是几个字节?如果str2.data()
s 很长,str1.data()
很短,你可以boyer-moore。
您是否考虑过使用像Aho-Corasick 或Commentz-Walter 这样可以并行搜索多个模式的东西?
【参考方案1】:
后缀树会更快,O(n + m)
其中n
是set1 中所有字符串的总长度,m
是set2 中的总长度,在最坏的情况下,您的设置方法将是O(n*m*min(n,m))
,后缀数组也使用线性内存。
如果它不适合 RAM,您可以考虑将其拆分为适合的“块”,然后检查 set1 和 set2 中的所有“块”对并在它们上构建后缀树。
如果硬件有SSD,现在虚拟内存也很快
【讨论】:
【参考方案2】:既然您对是否有任何符合条件的元素感兴趣,那么您可以在找到第一个元素时打破循环。这是一项明显的性能优化。
【讨论】:
这应该是一条评论 @Slava 这个答案包含优化的想法,但感谢您的输入。 这没有提供问题的答案。要批评或要求作者澄清,请在他们的帖子下方留下评论。 - From Review @coelhudo 该问题询问了使算法更快的方法。如果找到匹配项,此答案将指导提问者打破内部循环。它很短,但绝对提供了一种方法来提高问题所指的 3D 循环的性能。以上是关于是否有一些快速算法来检查两个字符串集中的子字符串的主要内容,如果未能解决你的问题,请参考以下文章