使用散列图的效率更高的方法是什么?

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

B)将所有对象存储在一个巨型hashmap中?

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

澄清:选项B意味着通过主键进行隔离 - 即,不需要额外的查找来确定使用哪个实际的散列映射。 (例如,如果查找键是字母数字,则Hashmap 1存储A,Hashmap 2存储B,等等。)

有帮助吗?

解决方案

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

如果将地图拆分为N个较小的哈希图,则每次查找时必须平均搜索其中一半。如果较小的散列图具有与较大映射相同的加载因子,则会将比较总数增加约N / 2倍。

如果较小的哈希图具有较小的加载因子,则会浪费内存。

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

其他提示

这些地图是否在逻辑上不同的地方使用?例如,我不会有一个包含用户,缓存查询结果,记录器等的地图,只是因为您碰巧知道密钥不会发生冲突。但是,我同样不会将单个地图拆分为多个地图。

为每个逻辑映射保留一个哈希映射,从键到值。

另外@ Jon的回答,可能有实际的原因,你想要维护单独的哈希表。

如果您有不同映射的单独表,则可以独立地“清除”每个映射;例如通过调用'clear'或删除对相应表的引用。

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top