2012-03-29 13 views
16

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

1

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.

+1

Unfortunetly in algoritmo di Kruskal è necessario union-find che non è O (1) ;/ –

35

ci sono 4 casi:

  1. bordo è a MST e valore decrescente di bordo:
    MST attuale è ancora MST

  2. Edge 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).

  3. 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).

  4. Edge non è in MST e aumentando il suo valore di bordo:
    MST attuale è ancora MST

+1

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. –

+0

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

+0

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. –

Problemi correlati