在C#中,我有一些静态数据可以放在Dictionary<int, T>
中T
是某种引用类型。 Web应用程序只需要静态初始化一次(它不会更改)。
由于我不必担心插入或删除性能,使用什么是最好的数据结构(或者我应该自己动手)?我可能会看到大约100,000个条目,间隔相当均匀。
我正在寻找一种获取此数据的最佳算法。 Dictionary<>
并不错,但我认为必须有针对只读数据优化的内容。
我怀疑,但尚未确认这些密钥的范围可能为0 - 400,000。如果是这样的话,建议会如何变化? (我想我会发布一个可能的答案)。
也许我可以:
这会比具有合理负载系数的HashTable / Dictionary更好还是更差?
答案 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,但应该有一些实现浮动。