mantenendo un albero spanning equilibrato di un grafico non indirizzato in crescita


19

Sto cercando dei modi per mantenere un albero di spanning relativamente bilanciato di un grafico, mentre aggiungo nuovi nodi / spigoli al grafico.

Ho un grafico non orientato che inizia come un singolo nodo, la "radice".

Ad ogni passaggio, aggiungo al grafico un nuovo nodo e un bordo che lo collega al grafico, o solo un nuovo bordo, che collega due vecchi nodi. Mentre coltivo il grafico, mantengo un albero di spanning. Il più delle volte, questo significa che quando aggiungo un nuovo nodo e bordo, imposto il nuovo nodo in modo che sia figlio del vecchio nodo a cui si connette.

Non ho alcun controllo sull'ordine in cui vengono aggiunti i nuovi nodi, quindi l'algoritmo di creazione degli alberi sopra riportato può ovviamente portare a squilibri tra gli alberi.

Qualcuno conosce l'euristica online che manterrà lo spanning tree "relativamente equilibrato", riducendo al minimo la quantità di lavoro svolto nel re-treeing? Ho il pieno controllo della struttura ad albero. Ciò che non controllo è la connettività del grafico o l'ordine in cui vengono aggiunti nuovi nodi.

Nota che le risposte standard di Google a termini come "bilanciato" "spanning" e "albero" sembrano essere alberi binari e alberi B, nessuno dei quali si applica. I miei nodi grafici possono avere un numero qualsiasi di vicini, quindi i nodi dell'albero possono avere un numero qualsiasi di figli, non 2 come alberi binari. Gli alberi B mantengono l'equilibrio cambiando i loro elenchi di adiacenza e non posso cambiare la connettività del grafico.


3
Forse sarebbe d'aiuto se tu fossi più specifico su quale sarebbe il tuo albero spanning equilibrato ideale di un grafico statico. Un albero BFS è automaticamente una buona scelta come albero bilanciato (è il più superficiale possibile, se si sceglie la radice giusta o entro un fattore due indipendentemente dalla radice)? È necessario che il numero di nodi in ogni sottostruttura sia più piccolo di un fattore costante rispetto al numero di nodi nel genitore, in qualsiasi punto dell'albero e, in caso affermativo, cosa si fa per i grafici che non hanno tali alberi?
David Eppstein,

Un albero BFS sarebbe davvero un albero di spanning equilibrato ideale se stavo eseguendo questo offline, con l'intero grafico dato in una volta. Non è necessario che il numero di nodi in ogni sottostruttura sia inferiore di un fattore costante rispetto al numero di nodi nel genitore.
SuperElectric,

Hai esaminato gli alberi migliori? it.wikipedia.org/wiki/Top_tree
Peer Sommerlund

Risposte:


4

Ogni volta che aggiungi un nuovo vertice con un bordo, non hai opzioni. Ogni volta che aggiungi un nuovo bordo, se la distanza corrente dalla radice è maggiore della distanza attraverso il nuovo bordo, rimuovi il bordo vecchio nel vecchio percorso più breve e aggiungi quello nuovo. Altrimenti, mantieni il tuo albero invariato. Penso che in questo modo ottieni qualcosa di molto simile a un albero BFS, nel senso che i livelli dell'albero conterranno gli stessi vertici e la distanza da un vertice alla radice sarà uguale alla distanza nell'albero BFS (e in il grafico), ma non so se sia abbastanza per soddisfare la tua condizione di "albero spanning equilibrato ideale".


2

Ho finito per fare quanto segue:

La risposta di Vinicius Santos è la prima parte di essa. Come dice, in ogni frame aggiungo un nuovo nodo e un bordo genitore-figlio che si collega ad esso, o semplicemente aggiungo un bordo tra due nodi esistenti. I bordi padre-figlio non offrono opportunità per modificare la struttura ad albero, solo i bordi incrociati lo fanno. Prendi in considerazione l'aggiunta di una E tra i nodi A e B, dove B ha la maggiore profondità dell'albero. Se (A.depth + 1) <B.depth, allora possiamo ridurre B.depth rendendolo figlio di A.

Avendo ridotto la profondità di B, ora dobbiamo controllare i vicini di B, per vedere se possono diminuire la loro profondità diventando figli di B. Eseguiamo quindi un attraversamento di ampiezza da B, che attraversa un bordo da X a Y se X. profondità + 1 <Y.depth e imposta Y come figlio di X.

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.