您是否知道快速过滤字符串列表以获取包含指定字符串的子集的方法?显而易见的实现是遍历列表,检查每个字符串是否包含搜索字符串。有没有办法索引字符串列表,以便更快地完成搜索?
答案 0 :(得分:13)
Wikipedia article列出了几种索引子字符串的方法。你有:
- Suffix tree
- Suffix array
- N-gram索引,是所有N-gram文本的倒置文件
- 压缩后缀数组1
- FM-index
- LZ-索引
答案 1 :(得分:2)
是的,您可以为字符串中的所有字符组合创建索引。在“he”,“el”,“ll”和“lo”的索引中将添加类似“hello”的字符串。要搜索字符串“hell”,您将获得所有“he”,“el”和“ll”索引中存在的所有字符串的索引,然后遍历这些字符串以检查字符串中的实际内容。 / p>
答案 2 :(得分:1)
如果您可以预处理该集合,那么您可以做很多不同的事情。
例如,您可以构建包含所有字符串后缀的trie,然后使用它来进行非常快速的匹配。
答案 3 :(得分:1)
如果你要反复搜索相同的文字,那么suffix tree可能是值得的。如果仔细应用,您可以实现大多数字符串问题的线性时间处理。如果没有,那么在实践中,你将无法比基于散列的Rabin-Karp做得更好,并且在预期时间内是线性的。
有许多免费提供的后缀树实现。例如,请参阅此C implementation或Java,请查看Biojava框架。
答案 4 :(得分:0)
除非您对数据和/或搜索字词有更多的先验知识,否则不是真的有任何可行之处,例如,如果您只是在开头处搜索匹配项字符串,然后您可以对字符串进行排序,只查看搜索项范围内的字符串(甚至将它们存储在二叉树中,只查看可能匹配的分支)。同样,如果您的潜在搜索条件有限,您可以在最初输入时对字符串运行所有可能的搜索,然后只存储一个表匹配哪些条件,哪些不匹配。
除了这种事情之外,基本上就是迭代。
答案 5 :(得分:0)
这取决于子字符串是否在字符串的开头,或者可以在字符串中的任何位置。
如果它在任何地方,那么你几乎需要遍历整个列表,除非你的列表太大并且查询经常发生,因此值得构建更复杂的索引解决方案。
如果子串位于字符串的开头,则很容易。对列表进行排序,通过biseciton搜索找到开始/结束并获取该子集。