¿Cómo generar una lista ordenada de elementos padre-hijo de múltiples listas, CON MÚLTIPLES RAÍCES?

Recientemente hice una pregunta aquí y obtuve algunas respuestas muy elegantes. Aquí está:

Visite ¿Cómo generar una lista ordenada de elementos padre-hijo de varias listas?

Tengo un problema similar, en el que puede haber múltiples raíces, lo que significa que hay árboles separados. Aquí hay un ejemplo (en perl);

my @rules = (
  [ qw( A B C ) ],
  [ qw( B D E ) ],
  [ qw( C H G ) ],
  [ qw( G H   ) ],
  [ qw( Z C   ) ]
);

En la lista de listas @rules, A es el padre de B y C. Generalmente, el primer elemento es el padre del resto de los elementos de la lista.

Me gustaría procesar este conjunto de matrices y generar una lista que contenga el orden correcto. Aquí, A y Z deben preceder a los demás elementos (el orden de A y Z no es importante, ya que son independientes). Aquí hay dos soluciones de ejemplo:

(A,Z,B,C,D,E,F,G,H), or (Z,A,B,D,E,F,C,G,H)

Importante: Mire la matriz número 3; H viene antes de G, aunque es un hijo de G en el cuarto arreglo. Por lo tanto, no hay un orden particular de hijos en cada matriz, pero en el resultado final (como se muestra arriba) debe tener algún padre antes de que sea hijo/s.

Aquí, A y H son independientes entre sí, pero usan nodos comunes.

preguntado el 03 de mayo de 12 a las 15:05

Una solución fácil sería encontrar todos los nodos que ocurren solo como el primer elemento (lo que significa que ningún otro nodo hace referencia a ellos) y asignarles a todos un padre "falso", como; (X raíz1 raíz2 ..) -

El código al que se vincula encuentra todas las raíces. ¿Cuál es el problema? ¿Dónde está tu intento? -

@ikegami: Ya resolví el problema descrito por el método en mi primer comentario, y pronto lo publicaré, necesito hacer algunos cambios. Estoy buscando lo que el mundo de algunos millones de desarrolladores tiene en mente :-) -

1 Respuestas

¿Qué tal esto? Sin embargo, es bastante sencillo.

my @rules = (
  [ qw( A B C ) ],
  [ qw( B D E F ) ],
  [ qw( C H G ) ],
  [ qw( G H   ) ],
  [ qw( Z C   ) ]
);

my %weight_for;
for (@rules) {
  my ($parent, @children) = @{$_};
  $weight_for{$_}++ for ($parent, @children);
  $weight_for{$_} += $weight_for{$parent} 
    for @children; 
}

print "$_ = $weight_for{$_}\n" 
  for sort { $weight_for{$a} <=> $weight_for{$b} } keys %weight_for;

contestado el 03 de mayo de 12 a las 17:05

Fantástica y sencilla solución. ¿Te importaría escribir una pequeña descripción de la estrategia, más en términos de concepto que de esta solución específica? Gracias por tu tiempo.. - Gogi

Esta solución no funciona si el padre ocurre después de la última aparición de cualquiera de sus hijos. - Gogi

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.