【问题标题】:What datastructure to use for find intersection of 2 tree用什么数据结构来查找两棵树的交集
【发布时间】:2023-03-20 01:20:02
【问题描述】:

我有两棵树,其中包含节点,在我创建它们之后,我将第一棵树的所有节点放入链表,将第二棵树的所有节点放入哈希图,作为映射的键。我想从树中找到两个节点,它们具有相同的变量,称为:状态(长类型)。所以在创建之后我调用:

List<Node> list;
HashMap<Node, Node> hashtable;

...create nodes, take them to the collections

for(Node n : list){
    if(hashtable.containsKey(n)){
        //doSomething          
    }
}

我正在使用 hashmap,因为它非常快,而且很艰难,我有 4000000(400 万)个节点。我已经覆盖了 Node 类的 equals 方法,但似乎 containskey 方法检查了哈希码,但据我了解,它只需要检查 equals 方法link to java reference。所以问题是我应该使用什么数据结构来检查这个东西,或者我应该如何重写代码?

这是我的 equals 方法:

    @Override
    public boolean equals(Object obj) {
    if(obj instanceof Node){
        Node node = (Node)obj;
        return (states == node.getStates());
    }
    return false;
}

【问题讨论】:

    标签: java search data-structures hashmap equals


    【解决方案1】:

    您必须在覆盖equals() 时覆盖hashCode() 方法,以便相等的对象必须具有相同的哈希码。参考http://docs.oracle.com/javase/6/docs/api/java/lang/Object.html#equals(java.lang.Object)。

    【讨论】:

    • 我使用父节点和节点的状态变量来创建哈希,然后它们是唯一的,如果我只使用状态变量,那么会有很多节点相同状态,所以我在哈希图中有大约 50000 个节点而不是 200 万个。但如果它们的状态相等,我仍然希望节点相等。
    • 我的意思是我只想使用哈希对地图中的节点进行排序
    • 这并不取消符合equal()hashCode() 的要求。所以你有两棵Node 的树并且想要找到交叉点。为此,我建议您使用出色的 Apache 实用程序。见link
    • 您认为比较这些大数据是否足够快?
    • 至少你可以试试。认为它相当快。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-19
    • 2011-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多