string - 在包含子字符串的字符串集中查找字符串的快速方法

标签 string algorithm indexing substring

任务

我有一个 S 的集合 n = 10,000,000 个字符串 s 并且需要找到集合 S sub>p 包含 S 的字符串 s,其中包含子字符串 p

简单的解决方案

因为我使用的是 C#,所以使用 LINQ 是一项非常简单的任务:

string[] S = new string[] { "Hello", "world" };
string p = "ll";
IEnumerable<string> S_p = S.Where(s => s.Contains(p));

问题

如果 S 包含许多字符串(如提到的 10,000,000 个字符串),这会变得非常慢。

想法

建立某种索引以更快地检索 Sp

问题

为此任务索引 S 的最佳方法是什么?您是否有任何 C# 实现?

最佳答案

这是一种方法:
1. 创建一个字符串 T = S[0] + sep_0 + S[1] + sep_1 + ... + S[n - 1] + sep_n-1(其中 sep_i 是一个独特的字符,对于任何 j 都不会出现在 S[j] 中(如果字符集不够大,它实际上可以是一个整数)) .
2. 为T构建后缀树(线性时间即可完成)。
3. 对每个查询字符串Q遍历后缀树(花费O(length(Q))时间)。然后所有可能的答案都将位于某个子树的叶子中。所以你可以遍历所有这些叶子。如果Q比较长,那么这棵子树的叶子数很可能远小于n
4. 如果 Q 真的很短,那么子树中的叶子数量可能会非常多。这就是为什么您可以对短查询字符串使用另一种策略:预先计算 S[0] ... S[n - 1] 的所有短子字符串,并为它们中的每一个存储一组索引发生。然后你可以为给定的 Q 打印这些索引。这里很难说“短”的确切含义,但可以通过实验找到。

关于string - 在包含子字符串的字符串集中查找字符串的快速方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26301787/

相关文章:

c# - 从字符串输入中获取参数值

algorithm - 在matlab中从人脸中提取唇部区域和参数,用于口型同步

c - 二部图中的最大匹配

java - 如何在 Lucene 3.0.1 中索引 BigDecimal 值

python - 使用 Pandas 中的方法链接分配给列的子集

python - 每第 n 行 Pandas iloc 复杂切片

c# - 可以使用 LINQ 从字符串中提取关键字吗?

java - 为什么我的字符串到字符串比较失败?

c - 是否有一个函数可以将一个字符的所有实例复制到另一个字符串的相同索引中?

c++ - 用于区分和修补字符串的 Linux C 或 C++ 库?