Tengo cíclico estructura de tipo gráfico representada por Nodo objetos. A El nodo es un valor escalar (hoja) o una lista de n> = 1 Nodos (nodo interno).Cómo comprimir y verificar la igualdad de objetos con referencias circulares
Debido a las posibles referencias circulares, no puedo simplemente usar una función recursiva HashCode(), que combina el HashCode() de todos los nodos secundarios: terminaría en una recursión infinita.
Mientras que la parte HashCode() parece al menos ser factible al marcar e ignorar los nodos visitados, tengo algunos problemas para pensar en un algoritmo eficiente y eficiente para Equals().
Para mi sorpresa, no encontré ninguna información útil sobre esto, pero estoy seguro de que muchas personas inteligentes han pensado en buenas maneras de resolver estos problemas ... ¿no?
Ejemplo (pitón):
A = [ 1, 2, None ]; A[2] = A
B = [ 1, 2, None ]; B[2] = B
A es igual a B, ya que representa exactamente la misma gráfica.
BTW. Esta pregunta no está dirigida a ningún lenguaje específico, pero la implementación de hashCode() y equals() para el objeto descrito Node en Java sería un buen ejemplo práctico.
Gracias por su respuesta, sin embargo esto realmente no me ayuda: – mfya
No puedo calcular el hash de un nodo antes de saber el hash de todos sus elementos secundarios. Con BFS o DFS puedo evitar la recursión infinita, pero el hash que obtengo puede no ser bueno si hay ciclos: por ejemplo, cuando ignoro los nodos que veo por segunda vez, el hash de un nodo sería el mismo como de un nodo sin el ciclo. Estaba buscando un algoritmo hash que tenga sentido y no introduzca colisiones innecesarias (si eso existe para este caso). – mfya