Java中的二维哈希映射(以及一般)

Java中的二维哈希映射(以及一般),java,c++,c,cluster-analysis,hashmap,Java,C++,C,Cluster Analysis,Hashmap,用Java高效地编写二维哈希映射的最佳方法是什么?举一个我所说的例子:我正在开发一些与集体智能相关的算法,这些算法通过计算元素对之间的相关性来工作 如果不缓存这些值,因为它们是在同一对上多次计算的,所以性能非常糟糕。。算法可以在^2上,但也可以在^3上,所以我考虑使用HashMap来存储要多次使用的值 在Java中实现这种数据结构最有效的方法是什么?应该可以缓存和删除由一对O1元素生成的值,但是使用显式类似乎太重了 如果Java还不够,我将不得不切换到C/C++,所以任何与这些语言相关的想法都是

用Java高效地编写二维哈希映射的最佳方法是什么?举一个我所说的例子:我正在开发一些与集体智能相关的算法,这些算法通过计算元素对之间的相关性来工作

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

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

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


谢谢

Google Collections支持双向哈希映射,请参阅

顺便说一句,Google Collections似乎超越了Apache Collections


更新:注意@danben和@sateesh的澄清。如果需要得到给定x的y或给定y的x,则可以使用BiMap。但听起来你真的想查找一个x,y点,然后得到一个包含缓存信息的值。在这种情况下,按照@danben的建议去做。

Google Collections支持双向哈希图,请参阅

顺便说一句,Google Collections似乎超越了Apache Collections


更新:注意@danben和@sateesh的澄清。如果需要得到给定x的y或给定y的x,则可以使用BiMap。但听起来你真的想查找一个x,y点,然后得到一个包含缓存信息的值。在这种情况下,按照@danben的建议去做。

最简单的方法是定义一个Pair类。它应该是不可变的,哈希键不应该改变,哈希代码应该与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();
}
注:

如果不需要int,可以使用任何类型的sub,或者如果希望Pair类灵活,可以将其设置为泛型

x,y==y,x由你决定


有了它,您就可以拥有一个HashMap作为缓存。

最简单的方法是定义一个Pair类。它应该是不可变的,哈希键不应该改变,哈希代码应该与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();
}
注:

如果不需要int,可以使用任何类型的sub,或者如果希望Pair类灵活,可以将其设置为泛型

x,y==y,x由你决定


有了它,您就可以拥有一个HashMap作为缓存。

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

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;
}

我仍然需要找出哪种最有效的方法来存储所有已缓存的元素,并在算法不再需要该项时使用指定的元素来删除它们,以避免在HashMap中填充浪费的项。这是因为这种算法在每次迭代时都会合并两个项目,将它们从已使用的项目中删除,但添加新生成的项目。

我通过使用如下方式连接两个项目的哈希代码,部分解决了此问题:

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;
}

我仍然需要找出哪种最有效的方法来存储所有已缓存的元素,并在算法不再需要该项时使用指定的元素来删除它们,以避免在HashMap中填充浪费的项。这是因为这种算法在每次迭代时都会合并两个项目,从使用过的项目中删除它们,但添加新生成的项目。

您的问题标题和描述之间不匹配。标题是二维的,但描述是双向的。也许你需要修正这两个问题中的任何一个。我在你的帖子中自由地将双向改为二维,因为这与帖子的内容一致,而且你的标题中已经有了二维。如果这不正确,请随意回滚。您的问题标题和描述不匹配。标题是二维的,但描述是双向的。也许你需要修正这两个问题中的任何一个。我在你的帖子中自由地将双向改为二维,因为这与帖子的内容一致,而且你的标题中已经有了二维。如果这是不正确的,请随时回滚。谷歌收藏获得市场份额+1。Apache Commons中的类型集合似乎已经丢失太久了。这很好,但如果你读了这篇文章,BiMap并不能解决他的问题。@danben,我怀疑你是对的,OP想问一个不同的问题。他问的问题大部分是正确的。在两次出现的单词BidDimensional中,只有一次拼写错误为双向,并且与po的上下文有关
st说得很清楚。是的,我指的是二维的,不是双向的。。很抱歉,Google Collections的市场份额被打错了+1。Apache Commons中的类型集合似乎已经丢失太久了。这很好,但如果你读了这篇文章,BiMap并不能解决他的问题。@danben,我怀疑你是对的,OP想问一个不同的问题。他问的问题大部分是正确的。在“双向”这个词的两次出现中,只有一次拼写错误为“双向”,这篇文章的上下文也很清楚。是的,我指的是“双向”,而不是“双向”。。很抱歉,我已经尝试过这种方法,但是堆增长太多,我希望避免为插入hashmap的每对项分配另一个对象。。因为它们可能是百万,我已经尝试过这种方法,但是堆增长太多,所以我希望避免为插入到hashmap中的每对项分配另一个对象。。因为他们可能是数百万