java – 为BST实现equals和hashcode
这个问题是
Implementing hashCode for a BST的后续问题.我的问题很难想到,所以我得到了一个我不确定如何使用的答案.
我需要为BST实现equals:这样如果两个BST在结构和内容上相等,那么equals返回true.因此,我想我还需要实现hashCode函数.我得到了hashCode函数的答案,使得树的结构和内容相同. @Override puclic int hashCode(){ int h = Objects.hashCode(data);//data is int int child=0; if(null != left) child =left.hashCode(); if(null != right) child+= right.hashCode(); if(0<child) h= h*31+child; return h; } 但是,我如何实现equals函数?如果树木在结构和内容上都相同,那么下面的工作是否会起作用? @Override public boolean equals(Node otherRoot){ return root.hashCode() == otherRoot.hashCode(); } 有可能出现误报的情况吗? 或者我的hashCode应该是 @Override public int hashCode(){ int h = contents.hashCode(); h = h * 31 + Objects.hashCode(leftChild); h = h * 31 + Objects.hashCode(rightChild); return h; } 而在后一种情况下,我的平等会避免误报吗? 解决方法
不,它不起作用,因为哈希码相等是单向的:当对象相等时,哈希码必须相等.但是,当对象不相等时,哈希码可能相同也可能不相等.一旦你应用了pigeonhole principle,这是有意义的:可能的哈希码的数量大约是4B,而可能的BST的数量实际上是无限的. 您可以使用与构建哈希代码相同的方式构建比较 – 即递归: >检查被比较节点的值是否相等.如果值不同,则返回false>检查两个节点是否都有左子树.如果其中一个有左子树而另一个没有,则返回false>检查两个节点是否都有正确的子树.如果其中一个具有正确的子树而另一个没有,则返回false>递归应用等于左子树.如果结果为false,则返回false>递归应用等于右子树.如果结果为false,则返回false>回归真实 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- Java日历的设置值不会提供预期的日期时间
- java – 为Web应用程序开发选择应用程序服务器
- Java操作redis的工具类
- java – Spring @Transactional提交失败; Deby Eclipselink
- Java定时器Timer使用方法详解
- Executing System commands in Java---ref
- Java中StringBuffer和StringBuilder区别
- java – 春季MVC中的CSRF(跨站点请求伪造)保护
- 如何在Java中的Apache Spark中将DataFrame转换为Dataset?
- java – 有没有办法在我的整个Android应用程序中使SharedPr