Optimization 高效地使用Hashmap

Optimization 高效地使用Hashmap,optimization,data-structures,performance,hashmap,Optimization,Data Structures,Performance,Hashmap,使用hashmaps的更有效方法是什么 A) 使用多个较小的哈希映射,或 B) 将所有对象存储在一个巨大的hashmap中 (假设密钥的散列算法相当有效,导致很少冲突) 澄清:选项B意味着按主键进行分离——即,不需要额外的查找来确定要使用哪个实际哈希映射。(例如,如果查找键是字母数字键,则Hashmap 1存储A,Hashmap 2存储B,依此类推。)绝对是B。哈希表的优点是每次查找的平均比较次数与大小无关 如果将映射拆分为N个较小的哈希映射,则每次查找都必须平均搜索其中的一半。如果较小的Has

使用hashmaps的更有效方法是什么

A) 使用多个较小的哈希映射,或

B) 将所有对象存储在一个巨大的hashmap中

(假设密钥的散列算法相当有效,导致很少冲突)


澄清:选项B意味着按主键进行分离——即,不需要额外的查找来确定要使用哪个实际哈希映射。(例如,如果查找键是字母数字键,则Hashmap 1存储A,Hashmap 2存储B,依此类推。)

绝对是B。哈希表的优点是每次查找的平均比较次数与大小无关

如果将映射拆分为N个较小的哈希映射,则每次查找都必须平均搜索其中的一半。如果较小的HashMap与较大的map具有相同的加载因子,那么您将把比较的总数增加大约N/2

如果较小的哈希映射具有较小的负载因子,则会浪费内存


所有这一切都是假设您在较小的哈希映射之间随机分配密钥。如果您根据键的某些功能(例如字符串前缀)分发它们,那么您创建的是a,这对于某些应用程序(例如web表单中的自动完成)是有效的。

这些映射是否用于逻辑上不同的位置?例如,我不会仅仅因为知道键不会冲突,就有一个包含用户、缓存查询结果、记录器等的映射。然而,我同样不会将一张地图分割成多张地图


为从键到值的每个逻辑映射保留一个hashmap。

除@Jon的答案外,您希望维护单独的哈希表可能有一些实际原因

如果不同映射有单独的表,则可以独立地“清除”每个映射;e、 g.通过调用“clear”或去掉对相应表的引用

如果单独的表包含到缓存项的映射,则可以使用不同的策略来“老化”相应的项


如果应用程序是多线程的,使用单独的表可能会减少锁争用,并且(对于某些处理器体系结构)可能会增加处理器内存缓存命中率。

第一句话假设对象的哈希代码方法都会生成分布良好的哈希值。在最坏的情况下(即所有对象散列到相同的值),哈希表查找将是
O(N)