Java中的二维哈希映射(一般情况下)

时间:2010-02-08 04:24:33

标签: java c++ c cluster-analysis hashmap

这是在Java中有效编写二维散列图的最佳方法吗?举一个我正在谈论的例子:我正在开发一些与集体智慧相关的算法,这些算法通过计算元素对之间的相关性来工作。

如果没有缓存这些值,因为它们是在同一对上多次计算的,性能非常糟糕。(算法可以 O(n ^ 2)但可能 O(n ^ 3 )所以我在考虑使用HashMap来存储要多次使用的值。

在Java中实现这种数据结构的最有效方法是什么?应该可以使用 O(1)来缓存和删除由一对元素生成的值,但无论如何使用显式类似乎太重了。

如果Java结果不够,我将不得不切换到C / C ++,所以任何与这些语言相关的想法都是受欢迎的。

由于

3 个答案:

答案 0 :(得分:4)

最简单的方法是定义Pair类。它应该是不可变的(哈希键不应该更改),hashCode()应该与equals一致。

类似(方法实现省略):

public class Pair() {
  int a, b;

  public Pair(int a, int b);

  public int getA();

  public int getB();

  public boolean equals(Object obj);

  public int hashCode();
}

注意:

  • 如果您不想要整体,请填写您想要的任何类型,或者如果您希望它具有灵活性,请将Pair类设为通用。

  • 取决于(x,y)==(y,x)。

有了这个,您可以使用HashMap<Pair, SomethingElse>作为缓存。

答案 1 :(得分:0)

Google Collections支持双向散列图,请参阅BiMap

(顺便说一下,Google Collections似乎是gaining more mindshare而非Apache Collections。)

更新:注意@danben和@ sateesh的澄清。如果你需要得到一个给定x的y或给定y的x,BiMap就没问题了。但听起来你真的想要查找(x,y)点并获取包含缓存信息的值。在这种情况下,请使用@ danben的建议。

答案 2 :(得分:0)

我通过使用以下内容连接两个项的哈希码来部分解决了这个问题:

private long computeKey(Object o1, Object o2)
{
    int h1 = o1.hashCode();
    int h2 = o2.hashCode();

    if (h1 < h2)
    {
        int swap = h1;
        h1 = h2;
        h2 = swap;
    }

    return ((long)h1) << 32 | h2;
}

我仍然需要弄清楚当算法不再需要该项时,哪个是存储已使用指定缓存的所有元素的最有效方法来删除它们,只是为了避免填充{{1}浪费了一件物品。那是因为这种算法在每次迭代时合并两个项目,从已使用的项目中删除它们,但添加新生成的项目。