用于只读字典访问的最有效的内存数据结构

时间:2011-12-20 02:44:50

标签: c# data-structures readonly

在C#中,我有一些静态数据可以放在Dictionary<int, T>T是某种引用类型。 Web应用程序只需要静态初始化一次(它不会更改)。

由于我不必担心插入或删除性能,使用什么是最好的数据结构(或者我应该自己动手)?我可能会看到大约100,000个条目,间隔相当均匀。

我正在寻找一种获取此数据的最佳算法。 Dictionary<>并不错,但我认为必须有针对只读数据优化的内容。

我怀疑,但尚未确认这些密钥的范围可能为0 - 400,000。如果是这样的话,建议会如何变化? (我想我会发布一个可能的答案)。


也许我可以:

  1. 扫描一次数据并抓住最高键
  2. 分配一个大小为最高键+ 1的数组。
  3. 再次传递并将数据存储在数组中。
  4. 这会比具有合理负载系数的HashTable / Dictionary更好还是更差?

2 个答案:

答案 0 :(得分:5)

Dicrionary是正确的方法,这里引用MSDN

  

Dictionary(Of TKey,TValue)泛型类提供了一个映射   一组值的一组键。每增加一本字典   由值及其关联键组成。通过检索值   使用它的键非常快,接近O(1),因为词典(Of   TKey,TValue)类被实现为哈希表。

因此,在构建字典(计算哈希值和构建树)时需要花费大量时间,但是通过密钥读取数据会很快暴风雪。

修改

如果你在0-400k范围内有超过50%的密钥存在,那么使用简单的arrray是有意义的,其中key是项目索引。这将为您提供 O(1)复杂性。 但根据你的问题,只有25%的钥匙会出现。所以在这种情况下我会使用字典,我认为与简单数组相比,它存储75%的内存开销来存储每个键值对。

答案 1 :(得分:0)

如果它真的是字典,那么trie工作得相当好。 Dictionary(哈希表)是另一种可能性,只要你对其进行微调即可。哪个会更快......我不知道,你需要对它进行分析,我猜。在空间方面,特里赢得了胜利。我不认为.NET在其标准库中有一个trie,但应该有一些实现浮动。