loadFactor = 0.1是否使得HashMap真的比loadFactor = 0.6快,或者有一些下限使得loadFactor更小没有任何意义?
我的意思是如果我不关心内存消耗 - 如果只有速度(put / contains - 涉及查找相应的bucket / key(-value)的操作)很重要?
有一个共同的观点,即loadFactor应该在0.6 - 0.8之内,但为什么我从来没有听过人们认真地谈论0.1,0.2,0.05。
答案 0 :(得分:0)
散列映射使其快速的唯一属性是散列函数的avalanche effect。
哈希函数是我们所依赖的,无论该空间的大小如何,都可以利用给予hashmap的空间。
让我们看看案例,
高负载系数意味着当空间几乎满时,hashmap只会重新显示它的密钥。您可以看到,在这种情况下,只有散列函数良好时才会提高性能,否则,我们会将多个密钥放在同一个存储桶中。
低负载系数意味着hashmap经常需要分配内存以保持密钥空间尽可能宽。性能再次由散列函数而不是空间决定,因为散列函数必须在此空间上分配密钥。
请注意,此时性能因素不仅取决于键的分布情况,还取决于每次碰撞节省多少空间。有足够的空间,但该空间中的项目数量非常少意味着存储每个项目所需的内存量(至少)将为(1 / loadfactor)
。那就是我们不会发生碰撞。
例如,如果hashmap存储字节并且总空间为100
个字节,那么加载因子为0.1
,每个1
个字节的存储空间等同于{{在重新散列之前,可以存储1}个字节,并且只能存储最多10
个项目。但是,如果发生碰撞,则此数字会增加。因此,如果我们得到两个项目冲突,那么我们只使用10
桶中的9
桶,因此事实证明存储每个项目所需的内存量恰好高于{{ {1}}字节。
最后,我建议使用Java一直推荐的内容(0.75)。我不太确定他们如何确定这个值,但它似乎达到了降低冲突(每个字节10
字节)所产生的空间成本以及重新散列频率的最佳点。
这一切都指向散列函数 - 它可以使用给定空间的程度决定了散列映射的性能,以及我们对负载因子的影响程度。毕竟目标是完美哈希,其中加载因子为11
,冲突为1.33
。
我建议你练习一个hashmap并调整它的加载因子,以及使用的哈希函数,以真正了解它的作用。