【发布时间】:2013-02-17 23:17:01
【问题描述】:
我有以下情况: 我有一大堆平均长度可能为 30 的字符串(比如说 250.000+)。 我要做的是在这些.. 中进行许多搜索,其中大部分是 StartsWith 和 Contains 类型的。
集合在运行时是静态的。这意味着选择集合的初始读取和填充只进行一次..因此构建数据结构的性能绝对不重要。内存也不是问题:这也意味着如果需要,我不介意在每个集合中有两个具有相同数据的集合(比如一个用于startswith,另一个用于包含)。 唯一重要的是搜索的性能,它应该返回与搜索条件匹配的所有元素。
首先,我遇到了 Trie 或 Radix-tree .. 但也许还有更好的选择?
对于包含 .. 我还没有好主意(除了在列表上运行 linq 查询,它不会很快处理这么多的数据)。
提前谢谢大家!
更新:我忘记了一个重要部分:包含我的意思是在集合中没有完全匹配.. 但我想找到集合中包含给定搜索字符串的所有字符串
【问题讨论】:
-
包含搜索的子字符串会处理单词还是单个字符?我想知道建立一个索引是否对那个有意义。
-
应该支持字符。尽管出于性能原因,我可以想象在搜索之前给出至少 3 个或更多字符的长度。 (可以把它想象成文本框中的自动完成功能,只有在输入了一些字符后才会启动)
-
在网上搜索“Rabin Karp”。这应该可以帮助您入门,因为它链接了多个搜索算法...stoimen.com/blog/2012/04/02/… 还可以考虑使用布隆过滤器并在启动时使用您的字符串预加载它。
-
感谢您的提示.. 特别是布隆过滤器对我来说是新的。我明天会阅读更多关于这些的内容,现在该睡觉了。
-
开头。将字符串存储在排序数组中并使用二进制搜索,易于实现、理解和快速。但是对包含没有影响。
标签: c# string algorithm search collections