【发布时间】:2013-06-18 04:18:45
【问题描述】:
Hashtable 中的负载因子和空间利用率有什么区别?请有人解释一下!
【问题讨论】:
-
这个问题被标记为 C++,直到 legends2k 删除该标记。它是关于 C++ 中使用的术语的问题,还是一般术语问题?
Hashtable 中的负载因子和空间利用率有什么区别?请有人解释一下!
【问题讨论】:
Load factor 衡量哈希表相对于buckets 的总数的填充程度。假设您有 1000 个存储桶,并且您只想存储最多 70% 这个数字。如果load factor 比率超过(存储超过 700 个元素)这个最大比率,则可以增加哈希表大小以有效容纳更多元素。
Space utilization是哈希表中已填充的桶数与总桶数的比值。
通常,当负载因子增加时,空间利用率会增加,并且在ideal 哈希表中,负载因子和空间利用率应该是线性相关的。但是,在大多数情况下,空间利用率是负载因子的sublinear 函数,因为在高负载因子比率的情况下,某些存储桶被分配容纳超过 1 个元素。
为了获得接近理想情况的哈希性能,您可能需要perfect hashing function。
一个完美的散列函数将一个键映射到一个唯一的地址。如果 潜在地址的范围与键的数量相同,则 函数是最小(在空间上)完美散列函数
【讨论】:
load_factor 和max_load_factor 混淆了吗?
负载系数
定义:
哈希表的负载因子是元素与桶的比率。较小的负载因子会导致更快的平均查找时间,但代价是 增加内存消耗。默认负载因子一般为 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)
【讨论】:
maximum 元素与桶的比率”...
is元素与桶的比率”