【问题标题】:Difference between Space utilization and Load factor in hashtable哈希表中空间利用率和负载因子之间的差异
【发布时间】:2013-06-18 04:18:45
【问题描述】:

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

【问题讨论】:

  • 这个问题被标记为 C++,直到 legends2k 删除该标记。它是关于 C++ 中使用的术语的问题,还是一般术语问题?

标签: data-structures hashtable


【解决方案1】:

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

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

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

为了获得接近理想情况的哈希性能,您可能需要perfect hashing function

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

【讨论】:

  • 你解释它的方式使它看起来好像负载因子是空间利用率的上限。你把load_factormax_load_factor 混淆了吗?
  • 负载因子是每个桶的条目数。
  • @juanchopanza,抱歉含糊不清,总容量,我的意思是桶的总数
  • 编辑后仍然令人困惑:总容量!=桶数。
【解决方案2】:

负载系数

定义:

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

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

相反,高负载因子会更慢(平均而言),内存使用量更少。

bucket 拥有一定数量的项目。

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

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

这里是一个基准测试的例子(这里是在prime数字很大的情况下实现的):

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

source

  • 一些哈希表使用其他冲突解决方案: 例如,在单独的链接中,哈希到相同位置的项目存储在链接列表中,查找时间由列出必须检查的节点。对于成功的搜索,此数字为1+lf/2,其中lf 是负载因子。因为每个表位置都有一个链表,链表可以包含多个项目,所以负载因子可以大于 1,而 1 是普通哈希表中可能的最大值。


空间利用率

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

假设每个关键字段包含一个整数,数据字段包含一个字符串(字符串类型的字符数组)。一种可能的散列函数是hash(key) = key % prime

定义:

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

出于技术原因,质数的桶效果更好,这(模数为小马使用的桶的数量)可能会浪费内存



结论: 哈希表通常只需进行一次比较即可完成查找,而不是进行线性搜索或二分搜索!然而,有时需要进行两次(甚至更多)比较。因此,哈希表提供(几乎)理想的查找时间。代价是,为了获得如此出色的查找时间,内存空间被浪费了。


如您所见,我不是专家,而且我在写这篇文章时正在获取信息,所以欢迎任何评论以使其更准确或更少......好吧.. . 错误...

         I switched it in Community Wiki mode (Feel free to improve)

【讨论】:

  • 不,那个链接有不同的定义:-)
  • 从这里引用:msdn.microsoft.com/en-us/library/…,你在说什么链接?
  • “Hashtable 的负载因子决定了元素与桶的最大比例”。这与您所说的不同(对于某些类型的哈希表可能是正确的)。
  • @bbill 是的,但我进行了编辑。被 jogojapan 提出争议的原始定义是“哈希表的负载因子决定了 maximum 元素与桶的比率”...
  • 没看到。现在我仔细阅读了,也许定义应该是“哈希表的负载因子is元素与桶的比率”
猜你喜欢
  • 2020-08-13
  • 1970-01-01
  • 2016-10-20
  • 2011-08-08
  • 2010-11-02
  • 1970-01-01
  • 1970-01-01
  • 2013-08-10
  • 2018-08-24
相关资源
最近更新 更多