【问题标题】:Efficient Hashmap Use高效的哈希图使用
【发布时间】:2010-11-16 01:09:47
【问题描述】:

使用哈希图更有效的方法是什么?

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

B) 将所有对象存储在一个巨大的哈希图中?

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

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

【问题讨论】:

    标签: optimization data-structures performance hashmap


    【解决方案1】:

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

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

    如果较小的哈希图具有较小的负载因子,那么您就是在浪费内存。

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

    【讨论】:

    • 第一句假设对象的hashcode方法都生成分布良好的hash值。在最坏的情况下(即所有对象哈希到相同的值)哈希表查找将是O(N)
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      除了@Jon 的回答之外,您可能还有实际原因要维护单独的哈希表。

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

      如果单独的表保存到缓存条目的映射,您可以使用不同的策略来“老化”各个条目。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-08-06
        • 1970-01-01
        • 1970-01-01
        • 2014-10-06
        • 2017-02-20
        • 2015-05-28
        • 1970-01-01
        • 2010-11-03
        相关资源
        最近更新 更多