Questo suona come un caso in cui è finalmente possibile applicare quella domanda di domande trivia: trovare un ciclo in una lista collegata utilizzando solo memoria O (1).
In questo caso la "lista collegata" è la sequenza di elementi che enumeri.Usa due enumeratori, eseguine uno a metà velocità e se il più veloce si imbatte in quello lento, allora hai un ciclo. Questo sarà anche il tempo O (n) invece del tempo O (n^2) richiesto per controllare un elenco 'visto'. Lo svantaggio è che si scopre solo il loop dopo che alcuni nodi sono stati elaborati più volte.
Nell'esempio, ho sostituito il metodo "mezza velocità" con il metodo "drop marker" più semplice da scrivere.
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);
}
}
fonte
2009-03-15 04:00:05
Non esiste un ciclo in un albero binario. Perfino i dati genealogici corretti non sarebbero un albero binario. Ho modificato la domanda per leggere "graph" – Triptych
curioso, è questo per capire l'indice di dosaggio, il nickname di Werk o qualcosa di simile (come nei purosangue)? – nlucaroni
No ... Esportare l'intero albero genealogico del cavallo in un file. Lo userò anche per rilevare la consanguineità, ma poiché il mio prodotto software non è specifico per la razza, non ho molti dati storici da analizzare. – Romias