Algorithm 通过子字符串快速筛选字符串集合?

Algorithm 通过子字符串快速筛选字符串集合?,algorithm,string,search,substring,Algorithm,String,Search,Substring,您知道一种快速筛选字符串列表以获取包含指定字符串的子集的方法吗?显而易见的实现是遍历列表,检查每个字符串是否包含搜索字符串。有没有办法为字符串列表编制索引以便更快地进行搜索?没有任何可行的方法,除非您对数据和/或搜索词有额外的先验知识-例如,如果您只在字符串开头搜索匹配项,然后可以对字符串进行排序,只查看搜索词范围内的字符串(甚至可以将它们存储在二叉树中,只查看可能匹配的分支)。同样,如果您的潜在搜索项有限,您可以在最初输入字符串时对其运行所有可能的搜索,然后只存储一个表,其中列出了哪些项匹配,

您知道一种快速筛选字符串列表以获取包含指定字符串的子集的方法吗?显而易见的实现是遍历列表,检查每个字符串是否包含搜索字符串。有没有办法为字符串列表编制索引以便更快地进行搜索?

没有任何可行的方法,除非您对数据和/或搜索词有额外的先验知识-例如,如果您只在字符串开头搜索匹配项,然后可以对字符串进行排序,只查看搜索词范围内的字符串(甚至可以将它们存储在二叉树中,只查看可能匹配的分支)。同样,如果您的潜在搜索项有限,您可以在最初输入字符串时对其运行所有可能的搜索,然后只存储一个表,其中列出了哪些项匹配,哪些项不匹配


除此之外,基本上就是迭代。

这取决于子字符串是在字符串的开头还是可以在字符串中的任何位置

如果它在任何地方,那么您几乎需要迭代整个列表,除非您的列表太大,并且查询发生的次数足够频繁,因此值得构建更复杂的索引解决方案


如果子字符串位于字符串的开头,则很容易。对列表进行排序,通过双精度搜索查找开始/结束,并获取该子集。

是的,例如,您可以为字符串中的所有字符组合创建索引。将在“he”、“el”、“ll”和“lo”的索引中添加类似“hello”的字符串。要搜索字符串“hell”,您将获得所有“he”、“el”和“ll”索引中存在的所有字符串的索引,然后循环这些索引以检查字符串中的实际内容。

列出了一些索引子字符串的方法。你有:

  • N-gram索引,所有N-gram文本的倒排文件
  • 压缩后缀数组
  • LZ指数

如果你可以预处理收集,那么你可以做很多不同的事情


例如,您可以构建一个包含所有字符串后缀的trie,然后使用它进行非常快速的匹配。

如果您要重复搜索同一文本,那么a可能是值得的。如果仔细应用,您可以为大多数字符串问题实现线性时间处理。如果没有,那么在实践中,您将无法做得更好,因为它基于哈希,并且在预期时间内是线性的


后缀树有许多免费的实现。例如,请参见此,或者对于Java,请查看框架。

当然,这取决于数据,这在优化方面的实际效果如何。此算法称为什么?我最近实现了这一点,它相当直接,并为我的特定用例带来了显著的速度提升。啊,这似乎是所有bigram的反向索引(n-gram,其中n=2)。