Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/264.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 静态哈希表应该有多少容量来最小化冲突?_C#_.net_Hashtable - Fatal编程技术网

C# 静态哈希表应该有多少容量来最小化冲突?

C# 静态哈希表应该有多少容量来最小化冲突?,c#,.net,hashtable,C#,.net,Hashtable,我的程序检索一个有限且完整的元素列表,我想通过字符串ID引用这些元素。我正在使用.Net字典来存储这些元素。我个人不知道会有多少元素。可能是几个。可能有数千人 如果程序确切地知道它将在哈希表中放入多少个元素,那么它应该指定什么作为该表的容量。显然,它至少应该是它将包含的元素的数量,但仅使用该数量可能会导致大量冲突 是否有为已知数量的元素选择哈希表容量的指南,以平衡哈希冲突和内存浪费 编辑:我知道哈希表的大小可能会改变。我首先要避免的是将其保留为默认分配,然后立即添加数千个元素,从而导致无数的调整

我的程序检索一个有限且完整的元素列表,我想通过字符串ID引用这些元素。我正在使用.Net
字典来存储这些元素。我个人不知道会有多少元素。可能是几个。可能有数千人

如果程序确切地知道它将在哈希表中放入多少个元素,那么它应该指定什么作为该表的容量。显然,它至少应该是它将包含的元素的数量,但仅使用该数量可能会导致大量冲突

是否有为已知数量的元素选择哈希表容量的指南,以平衡哈希冲突和内存浪费


编辑:我知道哈希表的大小可能会改变。我首先要避免的是将其保留为默认分配,然后立即添加数千个元素,从而导致无数的调整大小操作。我不会在填充元素后添加或删除元素。如果我知道会发生什么,我可以确保前面有足够的空间。我的问题涉及哈希冲突与内存浪费之间的平衡。

类似哈希表的数据结构用于动态内存分配。但是,您可以在某些结构中提到初始大小。但是,当您添加新元素时,它们的大小会扩大。您无法隐式限制大小


有许多可用的数据结构,各有优缺点。你需要选择最好的一个。限制大小不会影响性能。您需要注意添加、删除和搜索,这会影响性能。

类似哈希表的数据结构用于动态内存分配。但是,您可以在某些结构中提到初始大小。但是,当您添加新元素时,它们的大小会扩大。您无法隐式限制大小


有许多可用的数据结构,各有优缺点。你需要选择最好的一个。限制大小不会影响性能。您需要注意添加、删除和搜索,这会影响性能。

您的问题似乎暗示了一个错误的假设,即字典的容量是固定的。事实并非如此

如果您知道在任何给定的情况下,字典将至少包含一定数量的元素,那么您可以指定该数量作为字典的初始容量。字典的容量总是至少和它的项计数一样大(至少对于.NET2到4是这样;我相信这是一个未记录的实现细节,可能会发生更改)

指定初始容量可以减少内存分配的数量,方法是消除字典从默认初始容量增长到您选择的容量时可能发生的内存分配

如果正确选择了使用中的哈希函数,那么冲突的数量应该相对较小,并且对性能的影响应该最小。在某些人为的情况下,指定过大的容量可能会有所帮助,但我绝对不会考虑这一点,除非分析表明字典的查找对性能有重大影响


(作为一个设计情况的例子,考虑一个字典),它的代码是“10007”,所有的密钥都是10007的倍数。在当前的实现中,所有的项都将被存储在一个单独的桶中,因为通过将哈希代码除以容量和取余数来选择桶。在这种情况下,字典将起到链接列表的作用,强迫它使用不同的容量将解决这个问题。)

你的问题似乎暗示了一个错误的假设,即字典的容量是固定的。事实并非如此

如果您知道在任何给定情况下,字典将至少包含一定数量的元素,则可以指定该数量作为字典的初始容量。字典的容量始终至少与其项计数相同(至少对于.NET2到4是这样;我相信这是一个未记录的实现细节,可能会发生更改)

指定初始容量可以减少内存分配的数量,方法是消除字典从默认初始容量增长到您选择的容量时可能发生的内存分配

如果所使用的哈希函数选择得当,冲突的数量应该相对较少,并且对性能的影响应该最小。在某些人为的情况下,指定过大的容量可能会有所帮助,但我绝对不会考虑这一点,除非分析表明字典的查找对蚂蚁对性能的影响


(作为一个设计情况的例子,考虑一个字典),它的代码是“10007”,所有的密钥都是10007的倍数。在当前的实现中,所有的项都将被存储在一个单独的桶中,因为通过将哈希代码除以容量和取余数来选择桶。在这种情况下,字典将起到链接列表的作用,强制它使用不同的容量可以解决这个问题。)

这是一个主观的问题,但让我尽力回答这个问题(从CLR 2.0的角度来看。只是因为我还没有探讨CLR 4.0的字典是否有任何变化)

您正在使用一个以字符串为键的字典。由于可能存在无限多个字符串,因此可以合理地假设每个可能的哈希代码都是“同等可能的”。或者换句话说,每个2^32哈希代码(int范围)对于string类来说也是一样的。BCL中字典的当前版本从由此获得的任何32位哈希代码中减去32位,基本上得到31位哈希代码。因此,我们
hash = <31 bit hash code>
pr = <least prime number greater than or equal to current dictionary capacity>
bucket_index = hash modulus pr