我想知道java 1.5中比较两种数据结构的最快方法是什么。
我的数据结构代表了一棵非常大的树。我可以遍历整个数据结构并逐个节点地比较(我想这会很慢)。或者我可以计算数据结构的哈希来更快地完成它,对吧?
计算此哈希的最佳(有效且不太长)方法是什么?
我不想花太多时间来计算哈希......
希望我很清楚......: - )......
答案 0 :(得分:2)
您是否考虑过保持正在运行的hashCode,当您从树中插入或删除元素时,该hashCode会不断更新?这样,通过hashCode在任何给定时间比较树将是瞬时的。
根据您实现哈希函数的方式以及插入和删除节点的频率,这可能是一个可怕的解决方案。如果你的哈希函数很快,你没有做很多改变,你需要进行大量的比较,这可能会有效。
答案 1 :(得分:1)
每个对象都从.equals()
继承.hashCode()
和Object。
Java中的标准数据结构应该已经为您实现了一个相对快速的.hashCode()
方法(可以逐步计算哈希值,或者可能需要迭代每个元素,检查数据结构的来源,你是用来确定)。
您应该知道,即使数据结构不相同,也可能发生hash collisions。
为了进行准确的比较,我会在两棵树上同时执行tree traversal比较每个元素。这样,树的形状以及包含的元素将在O(n)
时间进行比较,其中n
是最大树的大小。
答案 2 :(得分:1)
要计算哈希值,您必须完全遍历两个树。您必须检查每个节点的属性并执行哈希计算。例如,如果节点中有String
,则必须迭代其字符并进行一些数学运算。然后,您必须将节点的哈希值与其他节点的哈希值组合在一起。
因此,计算两个结构的哈希值具有相同的顺序(可能稍微贵一些),因为它们一次比较它们是相等的。事实上,因为在执行相等比较时,您可以在检测到任何差异时立即停止,平均而言,单个相等性测试会更快。
只有在缓存哈希值并重复使用多次时,哈希才有可能是有益的。请记住,因为不同树的哈希值可能会发生冲突,所以仍然需要实现相等比较。答案 3 :(得分:1)
正如gdm所说,你可以保持一个正在运行的hashCode,这将允许你快速确定两棵树是否不同(一旦你确定了,那么你需要进行深度比较)他们有相同的哈希)。您可以对所有节点使用node {ha}的xor
(例如),这样可以添加和删除一个非常简单的计算:
this.hashcode ^= nodeInQuestion.hashCode;
或者,您可以创建一个immutable结构,intern。同样,它增加了更改的开销,但没有比例比引用相等更快。这取决于你是在优化修改还是比较,是否需要类似的正面和负面速度,最重要的是你的树的大小是否真的很明显。
答案 4 :(得分:1)
根据比较节点的成本,可能值得首先仅比较树的拓扑结构,并且只有在比较每对节点时树结构相同时才值得。
答案 5 :(得分:1)
如果图中的所有对象都具有可比性 - 您只需调用compareTo即可。在可能的情况下,我总是在POJOS上实现可比较的(以及hashcode和equals)。
为了加快速度,您可以实现快捷方式,以便尽可能早地返回不匹配的对象。我们这样做,这确实有帮助。
我不会尝试过早地优化其他方法,直到你运行真正的分析器(Netbeans是免费的并且有一个非常好的分析器)。
添加compareTo的好处在于它为您提供了一个在其他地方有用的通用功能:TreeMaps,排序集合等
答案 6 :(得分:1)
public void preOrderTraversal(Node r1, Node r2) {
if (r1 != r2 ) { // implement equals here !!
System.exit(0); // exit and print not equal
}
preOrderTraversal(r1.left(),r2.left());
preOrderTraversal(r1.right(),r2.right());
}