Estoy buscando una buena estructura de datos para crear clases de equivalencia en los nodos de un árbol. En una estructura ideal, las siguientes operaciones deben ser rápido (O (1)/O (n) según el caso) y fácil (no hay párrafos de código misterio):¿Cuál es una buena estructura de datos para crear clases de equivalencia en los nodos de un árbol?
- (A) recorrer el árbol de la raíz; en cada nodo -> transición niño enumerar todas las versiones equivalentes del nodo hijo
- (B) Combinar dos clases de equivalencia
- (C) Crear nuevos nodos de una lista de nodos existentes (los niños) y otros datos de
- (D) Busca nodos estructuralmente equivalentes a nodo (es decir, tienen el mismo número de hijos, los hijos correspondientes pertenecen a la misma clase de equivalencia y sus "otros datos" son iguales) para que los nodos nuevos (o modificados) colocarse en la clase de equivalencia correcta (a través de una fusión)
Hasta ahora he considerado (algunos de estos podrían usarse en combinación):
- Un parfait, donde los niños son referencias a colecciones de nodos en lugar de a nodos. (A) es rápido, (B) requiere caminar por el árbol y actualizar nodos para apuntar a la colección fusionada, (C) requiere encontrar la colección que contiene cada hijo del nuevo nodo, (D) requiere caminar por el árbol
- Mantenimiento de un árbol hash de nodos por sus características. Esto hace que (D) sea mucho más rápido pero (B) más lento (ya que el hash debería actualizarse cuando se fusionaron las clases de equivalencia)
- Enlaza los nodos en una lista circular vinculada. (A) es rápido, (B) sería rápido, pero por el hecho de que esa parte de "fusión" de una lista circular con ella misma realmente divide la lista (C) sería rápida, (D) requeriría caminar por el árbol
- Al igual que arriba, pero con un puntero "arriba" adicional en cada nodo, que podría usarse para encontrar un miembro canónico de la lista circular.
¿Estoy perdiendo una dulce alternativa?
La etiqueta debe ser un algoritmo, no algoritmos. – ashawley