Un grafico (bordi di peso positivo) con un MST Se qualche spigolo, e viene modificato in un nuovo valore, qual è il modo migliore per aggiornare l'MST senza rifarlo completamente. Penso che questo possa essere fatto in tempo lineare. Inoltre, sembra che avrei bisogno di un algoritmo diverso basato sul fatto che 1) e sia già una parte del MST e 2) se il nuovo bordo, e sia più grande o più piccolo dell'originaleAggiornamento spanning tree minimo con modifica del bordo
risposta
My O (n) soluzione si basa sul presupposto, che prima di iniziare a modificare i bordi, dovresti trovare MST (non è dato con il grafico). Per fare ciò, è possibile utilizzare l'algoritmo di Kruskal che funziona in O (n log n), e come effetto collaterale produce l'elenco ordinato dei bordi. Il suo costo è dominato dall'ordinamento, quindi quando modifichi il peso di un bordo, puoi eliminarlo dall'elenco ordinato in O (log n), e reinserirlo con un nuovo valore, anche in O (log n), e infine chiamare Kruskal di nuovo l'algoritmo, che ora viene eseguito in tempo lineare perché i bordi sono ordinati.
Questa è una soluzione lineare come richiesto, ma sembra che possa essere eseguita più velocemente.
ci sono 4 casi:
bordo è a MST e valore decrescente di bordo:
MST attuale è ancora MSTEdge non è in MST e diminuendo valore del bordo:
Aggiungere questo margine all'MST. Ora hai esattamente 1 ciclo.
In base a cycle property in MST è necessario trovare e rimuovere bordo con il valore più alto che si trova su quel ciclo. Puoi farlo usando dfs o bfs. Complessità O (n).Edge è in MST e aumentando il suo valore di bordo:
Inserisci questa bordo da MST. Ora hai 2 componenti collegati che dovrebbero essere collegati. Puoi calcolare entrambi i componenti in O (n) (bfs o dfs). Hai bisogno di trovare il bordo con il più piccolo valore che collega questi componenti. Iterare i bordi in ordine crescente in base al loro valore. Complessità O (n).Edge non è in MST e aumentando il suo valore di bordo:
MST attuale è ancora MST
CASE 3. NON O (N). per scorrere i bordi in ordine crescente. dobbiamo ordinarli. ci sono bordi O (n^2). anche se stiamo prendendo i bordi ordinati che abbiamo calcolato durante la creazione di mst, dovrebbe comunque passare attraverso questi (tutti potrebbero nel peggiore dei casi) i bordi. –
Potrebbe essere O (n). 1. Rimuovere il bordo il cui peso è stato aumentato e tenere traccia dei due nodi collegati da questo bordo 2. Eseguire bfs/dfs iniziando con questi due nodi che sono ora in 2 set disgiunti. Dovresti in qualche modo cancellare i vertici visitati in modo da poterli accedere in O (1). Creerei due hashtables, uno per ogni set disgiunto. 3. Passare attraverso tutti i bordi in E-E 'dove G = (V, E) e MST = (V, E'). Se uno spigolo contiene 1 nodo per ogni tabella hash, collega i due gruppi disgiunti. Mantenere una variabile min per determinare quale lato ha collegato i due set e ha avuto il peso più basso. O (E) – Olshansk
Olshansk, O (E) è O (n^2), come ha sottolineato Ashish.Per quanto ne so, la rimozione richiede O (n^2), perché per ogni spigolo (supponiamo ordinato già in una lista), dobbiamo trovare il bordo più piccolo che collega i due alberi di copertura. Questo può richiedere fino a O (n^2) se l'unico lato che li collega è anche il bordo con il valore più alto. –
- 1. trovare tutti spanning tree minimo
- 2. Il minimo più veloce algoritmo spanning tree
- 3. Algoritmo spanning tree minimo in parallelo
- 4. bidirezionale spanning tree
- 5. Le differenze tra minimo Spanning Tree e Shortest Path Albero
- 6. C'è uno spanning tree minimo che non contenga il bordo ponderato min/max?
- 7. Spanning tree minimo: cos'è esattamente la proprietà Cut?
- 8. Spanning tree che riduce al minimo il numero di vertici connessi a più spigoli?
- 9. Ricerca di uno spanning tree che riduca al minimo la somma delle profondità dei nodi
- 10. Qual è la differenza tra l'algoritmo spanning tree minimo per i grafici diretti vs diretti?
- 11. Aggiornamento di un albero di copertura minimo quando si inserisce
- 12. Trova se un albero spanning minimo contiene un bordo in tempo lineare?
- 13. Percorso minimo in assenza del bordo specificato
- 14. Aggiungi un nuovo spigolo al grafico e trova il nuovo spanning tree in O (n)
- 15. Algoritmo per trovare l'albero di spanning minimo dei vertici scelti
- 16. Un algoritmo veloce per alberi con spanning minimo quando le lunghezze degli spigoli sono vincolate?
- 17. Modifica dimensioni del bordo inferiore di EditText
- 18. colonne Spanning con TableLayout
- 19. Modifica testo Colore bordo bordo iOS
- 20. Modifica del colore del bordo su un modulo Windows
- 21. Riga bootstrap su Twitter con spanning wraps
- 22. Modifica di un bordo JMenuBar
- 23. Modifica del valore minimo della sequenza di Postgres
- 24. Modifica dei colori del bordo di una casella combinata WPF
- 25. Riguardo al testo di modifica bordo completo
- 26. Modifica/aggiornamento di grafici in Haskell
- 27. UIButton con colore del bordo personalizzato, iPhone
- 28. angoli arrotondati con colore del bordo
- 29. Bordo doppio CSS con bordo esterno più spesso del bordo interno
- 30. Aggiornamento stile di modifica di UITableViewCell a seconda del contenuto
Unfortunetly in algoritmo di Kruskal è necessario union-find che non è O (1) ;/ –