比较java中两个数据结构的最快方法

时间:2009-04-17 17:59:01

标签: java

我想知道java 1.5中比较两种数据结构的最快方法是什么。

我的数据结构代表了一棵非常大的树。我可以遍历整个数据结构并逐个节点地比较(我想这会很慢)。或者我可以计算数据结构的哈希来更快地完成它,对吧?

计算此哈希的最佳(有效且不太长)方法是什么?

我不想花太多时间来计算哈希......

希望我很清楚......: - )......

7 个答案:

答案 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());
}