c++ - 是否有一些快速算法来检查两个字符串集中的子字符串
问题描述
有两个字符串集(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 或缓存结果之类的索引。
解决方案
后缀树会更快,O(n + m)
其中n
set1 和 set2 中所有字符串的总长度在哪里m
,您的 set 方法O(n*m*min(n,m))
在最坏的情况下,后缀数组也使用线性内存。
如果它不适合 RAM,您可以考虑将其拆分为适合的“块”,然后检查来自 set1 和 set2 的所有“块”对并在它们上构建后缀树。
另外,如果硬件有SSD,现在虚拟内存也很快
推荐阅读
- javascript - jQuery 对话框错误:“无法在初始化之前调用对话框上的方法;试图调用方法‘关闭’”
- php - 通过 SOAP Api 在 PHP 中进行 Gzip 压缩
- node.js - 如何记忆 TypeScript getter
- reactive-programming - 两个 Mono 与条件的组合
- angular - Ionic4 类型的角度总是加载主页
- python - matplotlib 使 webview 崩溃
- dask - 在 dask_jobqueue 中,如何在 job_script 中添加额外的行?
- python - 使用 pyad 更新姓氏
- elasticsearch - 如何添加和/或作为要查询的字符串的一部分?
- node.js - 当我运行 npm start 创建 React 应用程序时缺少脚本