【问题标题】:Mapping int to int (in Java)将 int 映射到 int(在 Java 中)
【发布时间】:2015-08-27 14:52:35
【问题描述】:

在 Java 中。

如何将一组数字(例如整数)映射到另一组数字? 所有数字都是正数,并且所有数字在它们自己的集合中都是唯一的。

第一组数字可以是任意值,第二组数字表示数组的索引,所以目标是能够通过第一组数字访问第二组数字。这是一对一的关联。

速度至关重要,因为该方法每秒必须被调用多次。

编辑:我尝试了 SE hashmap 实现,但发现它对于我的目的来说很慢。

【问题讨论】:

  • 你能举个例子吗?
  • HashMap
  • 我认为 HashMap 会太慢。但是,是的,本质上它基本上是整数之间的映射。
  • 怎么会慢?这是恒定的时间查找。什么比恒定时间更快?
  • 如果数组的访问速度比散列图的快,那么我需要尽可能地提高速度。

标签: java algorithm dictionary integer mapping


【解决方案1】:

有一篇文章,专门讨论这个问题(附有解决方案):Implementing a world fastest Java int-to-int hash map

代码可以在相关GitHub repository中找到。 (最好的结果在 IntIntMap4a.java 类中)

文章引用:


总结

如果您想优化您的哈希映射以提高速度,您必须尽可能多地执行以下列表:

  • 使用容量等于 2 次方的底层数组 - 这将允许您使用便宜的 & 而不是昂贵的 % 作为数组索引
  • 不要将状态存储在单独的数组中 - 使用专用字段来存储空闲/删除的键和值。
  • 在一个数组中交错键和值 - 它可以让您免费将值加载到内存中。
  • 实施一项策略以消除“已移除”单元格 - 您可以牺牲一些移除性能以支持更频繁的 get/put。
  • 在计算初始单元格索引时对键进行打乱 - 这是处理连续键的情况所必需的。

    是的,我知道如何使用引文格式。但它看起来很糟糕,并且不能很好地处理项目符号列表。

【讨论】:

    【解决方案2】:

    您要查找的结构称为关联数组。在计算机科学中,关联数组、映射、符号表或字典是由(键、值)对的集合组成的抽象数据类型,这样每个可能的键在集合中只出现一次。

    如前所述,尤其是在 java 中,这很容易通过 HashMap 完成。

    HashMap<Integer, Integer> cache = new HashMap<Integer, Integer>();
    

    你可以使用put方法插入元素

    cache.put(21, 42);
    

    你可以用get检索一个值

    Integer key = 21
    Integer value = cache.get(key);
    System.out.println("Key: " + key +" value: "+ value); 
    
    Key: 21 value: 42
    

    如果你想遍历数据,你需要定义一个迭代器:

    Iterator<Integer> Iterator = cache.keySet().iterator();
    
    while(Iterator.hasNext()){
      Integer key = Iterator.next();
      System.out.println("key: " + key + " value: " + cache.get(key));
    }
    

    【讨论】:

    • 这里是关于一般关联数组和特别是 HashMap 的最佳答案。
    【解决方案3】:

    听起来像 HashMap&lt;Integer,Integer&gt; 就是你要找的东西。

    【讨论】:

    • @WinterBreeze 你必须比这更具体。您应该在原始帖子中包含这些详细信息。
    • @WinterBreeze HashMaps 的访问时间为 O(1)。你不会比这更快。
    • @Rubixus 是的。常量对于他的情况来说不够好,实际上经常发生,因为装箱开销和太多的方法调用。常量很重要。
    • @Rubixus 我相信 HashMap 的访问时间是 O(log n),而且自动装箱开销也很严重,而且 HashMap 对捕获不友好,我最好只对数组进行线性迭代, 如果里面没有太多记录的话。
    【解决方案4】:

    如果你愿意使用外部库,可以使用apache的IntToIntMap,它是Apache Lucene的一部分。

    它实现了一个非常有效的 int 到 int 映射,该映射将原语用于不应遭受装箱开销的任务。

    【讨论】:

      【解决方案5】:

      如果您对第一个列表的大小有限制,则可以只使用一个大数组。假设你知道第一个列表只有数字 0-99,你可以使用 int[100]。使用第一个数字作为数组索引。

      【讨论】:

        【解决方案6】:

        Map 接口可以满足您的要求。例如,请参阅HashMap&lt;K,V&gt;

        MapHashMap

        【讨论】:

          猜你喜欢
          • 2012-04-06
          • 2016-02-12
          • 1970-01-01
          • 2016-02-14
          • 1970-01-01
          • 2023-03-19
          • 1970-01-01
          • 1970-01-01
          • 2015-11-15
          相关资源
          最近更新 更多