【问题标题】:Is Dictionary<TKey, TValue> adding empty elements in the backing storage?Dictionary<TKey, TValue> 是否在后备存储中添加空元素?
【发布时间】:2010-10-24 09:05:57
【问题描述】:

我正在研究Dictionary&lt;TKey, TValue&gt; 背后的代码。有趣的是在private Insert 方法中,有一个bucket 似乎在预先确定大小的数组中保留了空槽。在Insert 方法中,代码检查存储桶是否还有任何元素,并在必要时调整大小。添加的元素数量是质数的因数。此外,字典条目属性存储在具有哈希码、键和值的结构中。

我的问题:目的是什么?这样做是为了防止在可能没有足够内存时尝试向字典对象添加项目吗?

注意:我不想在这里粘贴任何代码,因为它需要反汇编才能阅读。

【问题讨论】:

  • 了解哈希表的实现。
  • @leppie,我很乐意 - 需要几个链接? :)

标签: .net dictionary


【解决方案1】:

Dictionary&lt;TKey,TValue&gt; 对象不会使用这种方法添加新的空值。它所做的是为稍后将被要求添加的数据预先分配一个后备存储。最终目标是平均插入案例不需要完成分配。相反,它会在现有存储桶数组中找到一个插槽来放置自己。

您提到的其他一些项目(如素数和哈希码)的原因是大多数哈希表样式实现的常见属性。我不会在这里逐一介绍它们,而是将您指向有关该主题的维基百科文章

【讨论】:

  • 根据wiki:对于分离链,最坏的情况是所有条目都插入到同一个桶中,在这种情况下哈希表无效,成本是搜索桶数据结构。如果后者是一个线性列表,则查找过程可能必须扫描其所有条目;所以最坏情况下的成本与表中条目的数量 n 成正比。我错了还是 MS 使用了这种方法?
【解决方案2】:

每次需要调整集合的大小时,都会在堆上造成一些需要一些时间的抖动。这些“空槽”被初始化以防止这种情况发生。

大多数集合都有构造函数,可让您指定初始大小、初始“潜在”大小和增长因子。就这一点而言,如果您知道这是最好的做法,请指定确切的尺寸。

【讨论】:

  • 啊...这是有道理的-显然,调整大小是渐进的素数(素数* 2)的一个因素-我想这是另一个有趣的方面,并且想知道为什么它是用于调整大小的素数...
  • 是的;我认为从统计学上讲,他们如何使用质数来增加大小,以及在“典型”使用或类似情况下可能预计的大小增加。呵呵
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-09
  • 2016-06-14
  • 1970-01-01
  • 2011-04-11
相关资源
最近更新 更多