最快的集合,用于查找以字符串属性开头的所有项目

时间:2014-09-03 14:33:33

标签: c# collections

我目前正在使用ICollection返回location.path.StartsWith(value)所有项目。

集合本身保存在单个对象中,并在从sproc调用到Sql数据库的对象实例化时保持水合。虽然物品数量只有1300左右,但是集合本身有可能经常被搜索(我不能经常定义 - 可能是100,000甚至100万 - 它会有所不同)。

鉴于上述细节,可能还需要更多,用于查找path.StartsWith(value)所有项目的最有效集合类型是什么?

1 个答案:

答案 0 :(得分:3)

我认为您正在寻找一个Trie,可让您添加与该关键字相关联的项目,然后查找所有包含以您的搜索字词开头的项目的项目

从页面:

  

如下所述,trie具有许多优于二进制的优点   搜索树。[4] trie也可用于替换哈希表   它具有以下优点:

     
      
  • 在最糟糕的情况下查找trie中的数据更快,O(m)时间(其中m是搜索字符串的长度),与不完美相比   哈希表。不完美的哈希表可能存在关键冲突。关键   collision是将不同键的hash函数映射到同一个   在哈希表中的位置。最糟糕的查找速度不完美   哈希表是O(N)时间,但更典型的是O(1),O(m)   花在评估哈希上的时间。
  •   
IIRC,我找了一些c#代码,发现this implementation工作得相当好

编辑评论: 您需要扫描字典中的所有键,以查看它们是否以搜索字符串开头。在Trie中,您要求的节点与您的搜索字符串匹配,然后您可以保证该节点下的所有元素都有一个以您提供的搜索字符串开头的键。

From linked Trie article

在这里,您可以看到搜索te需要向下钻取Trie中的两个节点,并且您到达所有后代以te开头的节点