Esto suena como un caso en el que finalmente puede aplicar la pregunta de preguntas de la entrevista: busque un ciclo en una lista vinculada utilizando solo la memoria O (1).
En este caso, su "lista vinculada" es la secuencia de elementos que enumera.Usa dos enumeradores, ejecuta uno a la mitad de velocidad, y si el rápido alguna vez se encuentra con el lento, entonces tienes un bucle. Este también será el tiempo O (n) en lugar del tiempo O (n^2) requerido para verificar una lista 'vista'. Lo malo es que solo se entera sobre el ciclo después de que algunos de los nodos hayan sido procesados varias veces.
En el ejemplo he reemplazado el método de 'media velocidad' con el método de 'soltar marcadores' más simple de escribir.
class GenTreeNode {
...
///<summary>Wraps an the enumeration of linked data structures such as trees and linked lists with a check for cycles.</summary>
private static IEnumerable<T> CheckedEnumerable<T>(IEnumerable<T> sub_enumerable) {
long cur_track_count = 0;
long high_track_count = 1;
T post = default(T);
foreach (var e in sub_enumerable) {
yield return e;
if (++cur_track_count >= high_track_count) {
post = e;
high_track_count *= 2;
cur_track_count = 0;
} else if (object.ReferenceEquals(e, post)) {
throw new Exception("Infinite Loop");
}
}
}
...
///<summary>Enumerates the tree's nodes, assuming no cycles</summary>
private IEnumerable<GenTreeNode> tree_nodes_unchecked() {
yield return this;
foreach (var child in this.nodes)
foreach (var e in child.tree_nodes_unchecked())
yield return e;
}
///<summary>Enumerates the tree's nodes, checking for cycles</summary>
public IEnumerable<GenTreeNode> tree_nodes()
{
return CheckedEnumerable(tree_nodes_unchecked());
}
...
void ProcessTree() {
foreach (var node in tree_nodes())
proceess(node);
}
}
No existe un ciclo en un árbol binario. Incluso los datos genealógicos correctos no serían un árbol binario. Edité la pregunta para leer "gráfico" – Triptych
curioso, ¿esto es para averiguar el Índice de dosificación, Werk Nick Rating o algo similar (como en purasangres)? – nlucaroni
No ... Estoy exportando todo el pedigrí del caballo a un archivo. Lo usaré también para detectar la endogamia, pero como mi producto de software no es específico de raza, no tengo mucha información histórica para analizar. – Romias