什么是STARTwith和/或包含搜索的最快的字符串集合结构/算法

时间:2013-03-03 22:49:35

标签: c# string algorithm search collections

我有以下情况: 我有一大堆字符串(比方说250.000+),平均长度可能是30。 我要做的就是在这些内部进行很多搜索......主要是那些将是StartsWith和Contains类型。

该集合在运行时是静态的。这意味着初始读数和填充选择只进行一次。因此,构建数据结构的性能绝对不重要。内存也不是问题:这也意味着我不介意在需要时有两个具有相同数据的集合(例如一个用于startswith而另一个用于contains)。 唯一重要的是搜索的性能,它应返回与搜索条件匹配的所有元素。

首先,我遇到了Trie或Radix-tree ..但也许有更好的选择?

For contains ..我根本没有任何好主意(除了在列表上运行linq查询时,该数据量不会非常快)。

先谢谢大家!

更新:我忘记了一个重要的部分:使用Contains我的意思是集合中没有完全匹配..但我想找到集合中包含给定searchstring的所有字符串

1 个答案:

答案 0 :(得分:3)

构建suffix tree将允许您在O(1)中并行搜索所有字符串。在我的迂腐中不禁注意到它真的O(n + m)其中n是与您的子字符串匹配的字符串数,m是要查询的子字符串的大小。

那么你问的是什么后缀树?在其最基本的实现中,它是一个具有更高级插入方法的trie:除了添加字符串之外,它还将该字符串的每个可能后缀添加到trie。在此数据结构上,子字符串搜索成为所有可能后缀的前缀搜索。由于您还想进行前缀搜索,因此您需要在每个插入的字符串和查询子字符串前面添加一个特殊字符。特殊字符将允许您区分后缀和完整字符串。

虽然后缀树的这种实现非常简单,但它的效率也很低(O(n^2)空间和构建时间)。幸运的是,还有其他更有效的实现可以大大减少空间和时间限制。其中之一,Ukkonen的算法,在this SO answer中得到了很好的解释,并将空间限制为O(n)。您可能还想查看suffix arrays,它们是后缀树的等效但更有效的表示。

虽然我知道有很多后缀树的实现(其中一个可能会为你的用例找到最佳点)我只是不知道它们。在您确定实施之前,我建议您对该主题进行一些研究。