从Java的约Hashtable类的文档,它说为什么Hashtable的负载因子与CLRS书中描述的负载因子不一致?
作为一般规则,默认加载因子(.75)
因此加载时间和空间成本上寻求一种折衷Hashtable的因子是0.75,这意味着如果有N个密钥,Hashtable将使用M = N/0.75个空间来存储它们。
在CLRS书中,它还引入了负载因子alpha。但是从我的理解来看,CLRS打算设置大于1的α,即M = N/alpha < N.这意味着Hashtable可以使用M个时隙,这样它可以节省未使用密钥的存储空间。
我说M < N可以节省存储空间,因为通常我们不知道N的确切值,但是我们知道这组密钥并使用N代表可能的密钥数量。这组键可能非常大,但实际使用的键的数量非常小。因此设置小于N的M可以节省存储空间。这也是为什么通常Hashtable不使用直接数组映射每个{key,value} 1:1的原因。
但Java中的哈希表使用的存储量超过了N.我认为它与CLRS设计不一致,对吧?
对吗?
谢谢
是的,我知道计算。我的问题是为什么它将allocationsSize设置为大于N?我认为不使用直接数组映射的Hashtable的一点是保存存储。但是将allocationSize设置为大于N是浪费,对吧? – 2012-02-18 09:26:40
关于HashMap的'whole' javadoc提供了更多信息。使N大于1是无稽之谈。访问时间将极其缓慢,整个HashMap将“无用”。 – poitroae 2012-02-18 09:33:41