散列表中空间利用率与负载因子的区别

时间:2013-06-21 05:39:16

标签: data-structures hashtable

Hashtable中的负载因子和空间利用率有什么区别?请有人解释一下!

2 个答案:

答案 0 :(得分:1)

加载系数

定义:

  

Hashtable的加载因子是元素与存储桶的比率。较小的负载因子导致平均查找时间更快,代价是   增加内存消耗。一般默认加载因子为1.0   在速度和尺寸之间提供最佳平衡。

换句话说,太小的load factor将导致更快地访问HashTable的元素(同时查找给定元素或迭代......),但也需要更多的内存使用。

相反,高负载系数将会更慢(平均),内存使用量会减少。

bucket 包含一定数量的项目。

有时表中的每个位置都是一个存储桶,它将包含固定数量的项目,所有这些项目都会散列到同一位置。这样可以加快查找速度,因为可能无需查看其他位置。

  • 线性探测以及双重哈希: 加载因子定义为n/prime,其中n是表格中的项目数和{{ 1}}是表的大小。因此,加载因子为1意味着表已满。

以下是基准测试的示例(此处在大prime个数字的条件下实现):

prime

source

  • 某些哈希表使用其他冲突解决方案: 例如,在单独的链接中,散列到同一位置的项目存储在链接列表中,查找时间由必须检查的列表节点数。要成功搜索,此数字为load --- successful lookup --- --- unsuccessful lookup --- factor linear double linear double ------------------------------------------------------------------------ 0.50 1.50 1.39 2.50 2.00 0.75 2.50 1.85 8.50 4.00 0.90 5.50 2.56 50.50 10.00 0.95 10.50 3.15 200.50 20.00 ,其中1+lf/2是加载因子。因为每个表位置都包含一个链接列表,其中可以包含多个项目,所以加载因子可以大于1,而1是普通哈希表中可能的最大值。


空间利用率

我们的想法是将数据记录存储在哈希表中。每条记录都有一个lf字段和一个关联的key字段。记录存储在基于其密钥的位置。为每个给定键生成此位置的函数称为data

假设每个键字段包含一个整数,数据字段包含一个字符串(字符串数组的字符串)。一个可能的哈希函数是hash function

定义:

  

空间利用率将是完整使用的桶数(相对于加载因子)与哈希表中保留的桶总数的比率。

由于技术原因,大量的存储桶工作得更好,其中(模拟使用的存储桶的数量)可能包含浪费内存



结论:哈希表通常只需进行一次比较,就可以完成查找,而不必进行线性搜索或二进制搜索!但是,有时需要进行两次比较(甚至更多)。因此,哈希表提供(几乎)理想的查找时间。权衡的是,为了获得这个伟大的查找时间,内存空间被浪费了。


正如你所看到的,我不是专家,而且我在写这篇文章的过程中得到的信息,所以欢迎任何评论使这更准确或更少......好吧......错... < / EM>

hash(key) = key % prime

答案 1 :(得分:0)

Load factor衡量哈希表相对于buckets总数的填充程度。假设您有1000个桶,并且您希望仅存储此数字的最大70%。如果load factor比率超过(存储的元素超过700个)此最大比率,则可以增加哈希表大小以有效保存更多元素。

Space utilization是填充桶数与哈希表中桶总数的比率。

通常,当负载系数增加时,空间利用率会增加,并且在ideal哈希表中,负载系数和空间利用率应该彼此线性相关。但是,在大多数情况下,空间利用率是负载因子的sublinear函数,因为在高负载系数比率的情况下,某些存储区被分配用于容纳多于1个元素。

为了获得接近理想情况的散列表现,您可能需要perfect hashing function

  

完美的散列函数将键映射到唯一的地址。如果   潜在地址范围与密钥数量相同   函数是一个最小的(在空间中)完美的散列函数