Estoy tratando de comprobar si los dos nodos son los mismos, es decir que tienen el mismo número de niños, y que esos niños conducir a exactamente los mismos estados. Por lo tanto, estoy efectivamente tratando de comparar los subárboles en el dos nodos. Me pregunto si puedo usar hash para hacer esta comprobación de igualdad.
No, hash no se debe utilizar para verificar la igualdad. Ese no es su propósito. Eventualmente puede ayudarte a descubrir si los objetos no son iguales, pero no te dirá nada si son iguales.
Los mismos objetos generarán el mismo valor hash, pero dos objetos diferentes que no son iguales también pueden generar el mismo hash.En otras palabras, si los valores de hash son diferentes, usted sabe con certeza que los objetos son diferentes. Eso es.
Si desea probar la igualdad, debe implementar equals. En su caso, existe el peligro de que su método sea recursivo y provoque un desbordamiento de la pila. ¿Qué pasa si tu objeto contiene una referencia a sí mismo?
Si desea generar un hash, podría tener en cuenta el tamaño de la matriz (y el hecho de que es nulo o no), pero no trataría de usar el valor hash de los objetos en la matriz , debido a posibles bucles infinitos. No es perfecto, pero es lo suficientemente bueno.
Hay otro método radical que también puede proporcionar un buen resultado. En lugar de calcular dinámicamente los valores hash, establezca un valor int aleatorio para cada instancia de objeto Node (me refiero a una vez por todas en la creación y siempre devuelvo ese valor). En su caso, no correría el riesgo de bucles infinitos tomando el valor hash de las instancias del objeto en su matriz.
Si los hashes son iguales, entonces tendría que comenzar a comparar instancias de objetos de matriz.
REM: Si los nodos contienen otros atributos, calcule el hash en estos otros atributos y olvídese de la matriz. Comience a investigar sobre el contenido/tamaño de la matriz si y solo si los hash son idénticos entre dos objetos.
REM2: Comentarios menciona gráfico DAG, lo que significa que no vamos a golpear problemas de recursividad. Sin embargo, esa condición no es suficiente para garantizar que deepHashCode() tenga éxito. Además, sería excesivo también. Hay una manera más eficiente de resolver este problema.
Si el método hash utilizado por el nodo solo usa la matriz para calcular un valor hash, entonces deepHashCode() puede funcionar. Pero no sería eficiente. Si el método hash usa otros atributos de nodo, entonces estos atributos tendrían que ser iguales también.
Hay una manera más rápida de comparar nodos para la igualdad. Marque cada instancia de nodo con un número único. Luego, para comparar dos nodos, primero compare su tamaño de matriz. Si es igual, entonces compara los nodos de cada matriz usando su número único. Si una matriz no 'tiene' el otro nodo, entonces no estamos tratando con nodos iguales. Esta solución es mucho más rápida que ir recursiva.
Supongo que el árbol de nodos que construyes termina en algún punto y no es infinito. – justkt
Sí, termina. – efficiencyIsBliss
@efficiencyIsBliss: siempre que no hay nodos secundarios que hagan referencia a los nodos principales, debería poder utilizar deepHashCode y deepEquals en la matriz. – justkt