Hashtable中的负载因子和空间利用率有什么区别?请有人解释一下!
答案 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
。
完美的散列函数将键映射到唯一的地址。如果 潜在地址范围与密钥数量相同 函数是一个最小的(在空间中)完美的散列函数