Trova il percorso più lungo dalla radice alla foglia in un albero


15

Ho un albero (nel senso della teoria dei grafi), come nel seguente esempio:

inserisci qui la descrizione dell'immagine

Questo è un albero diretto con un nodo iniziale (la radice) e molti nodi finali (le foglie). A ciascun bordo è assegnata una lunghezza.

La mia domanda è: come trovare il percorso più lungo che inizia alla radice e termina in una delle foglie? L'approccio della forza bruta è quello di controllare tutti i percorsi foglia-radice e prendere quello con la massima lunghezza, ma preferirei un algoritmo più efficiente se ce n'è uno.


Risposte:


16

Ran G. ha dato suggerimenti per un algoritmo efficiente, sebbene forse abbia tralasciato alcuni dettagli. Il calcolo di tutti i percorsi foglia-radice è in effetti un po 'inefficiente se si sta lavorando ripetutamente, ad esempio, se si calcola ciascun percorso e quindi si calcola la lunghezza.

Eseguire il seguente algoritmo ricorsivo iniziando con LongestPath(root)darà ciò che si desidera. In sostanza, calcola ricorsivamente il percorso più lungo per ogni sottostruttura. Ad ogni nodo questo richiede la creazione di nuovi percorsi e la restituzione di quello più lungo.

 LongestPath(node)
   If node is a leaf, return (node,0) 
   If node is not a leaf:  
    For each edge (node,length,next):
       Let (p,l) = LongestPath(next)
       Let (path,len) = (p++[next], l + length)
    Return element (path,len) from previous step with largest value len

Questa è una combinazione di pseudo-codice con qualche notazione di Haskell, quindi spero che sia comprensibile.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.