【发布时间】:2014-05-28 13:52:47
【问题描述】:
Eclipse 通过以下方式为单链表的 Node 类实现 hashCode() 函数:
class Node{
int val;
Node next;
public Node(int val){
this.val = val;
next = null;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((next == null) ? 0 : next.hashCode());
result = prime * result + val;
return result;
}
}
现在,一个节点的hashCode() 取决于它后面的节点的哈希码。
因此,hashCode() 的每次调用都将在链表的长度上花费线性时间。因此使用HashSet<Node> 将变得不可行。
解决此问题的一种方法是将hashCode 的值缓存在一个变量中(称为散列),以便只计算一次。但即使在这种情况下,一旦任何节点的 val 更改,哈希也会变得无效。同样,修改当前节点之后的节点hashCode 需要线性时间。
那么对于这样的链表节点有什么好的实现散列的方法呢?
【问题讨论】:
-
好吧,只是
return val;,因为它是int;不过,这取决于您如何实现.equals() -
问题是节点代表整个列表,因此它的哈希码取决于整个列表。
-
这样想——如果你不说
ll1.equals(ll2)是true,那么你肯定不希望他们的hashCode()s是一样的。因此,以尊重该合同的方式实施它。 -
@NikunjBanka 以下两个链表是否“相等”?
[x] -> [x] -> NULL与[x] -> [x] -> [x] -> NULL;它们只包含x,但其中一个更长。考虑一下。 -
致对这个问题投反对票的人:这是一个完全有效的问题,值得思考。绝对不值得一票。
标签: java hash linked-list singly-linked-list