La presentazione è in caricamento. Aspetta per favore

La presentazione è in caricamento. Aspetta per favore

Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Capitolo 12 Minimo albero ricoprente: Algoritmo di Prim Algoritmi e Strutture.

Presentazioni simili


Presentazione sul tema: "Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Capitolo 12 Minimo albero ricoprente: Algoritmo di Prim Algoritmi e Strutture."— Transcript della presentazione:

1 Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Capitolo 12 Minimo albero ricoprente: Algoritmo di Prim Algoritmi e Strutture Dati

2 Il problema del calcolo di un Minimum Spanning Tree (MST) Input: un grafo non orientato e pesato G=(V,E,w) Soluzione ammissibile: un albero di copertura (uno spanning tree) di G, ovvero un albero T=(V,F) con F  E Misura della soluzione (da minimizzare): costo di T:  e  F w(e)

3 Riepilogo: regole del taglio e del ciclo Scegli un taglio del grafo che non è attraversato da archi blu. Tra tutti gli archi non ancora colorati che attraversano il taglio, scegline uno di costo minimo e coloralo di blu (cioè, aggiungilo alla soluzione). Scegli un ciclo nel grafo che non contiene archi rossi. Tra tutti gli archi non ancora colorati del ciclo, scegline uno di costo massimo e coloralo di rosso (cioè, scartalo per sempre).

4 Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 4 Algoritmo di Prim (1957) (in realtà scoperto nel 1930 da Jarník)

5 Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 5 Strategia Mantiene un unico albero blu T, che all’inizio consiste di un vertice arbitrario Applica per n-1 volte il seguente passo: scegli un arco di peso minimo incidente su T (ovvero con un estremo in V(T) e l’altro estremo in V\V(T)) e coloralo di blu (applica ripetutamente la regola del taglio, da cui ne consegue la correttezza!) Complessità computazionale di un approccio brutale: In ognuno degli n-1 passi, guardo tutti gli O(m) archi che attraversano il taglio (V(T),V\V(T)) corrente, e scelgo quello di peso minimo  costo O(m·n)

6 Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 6 Un approccio più efficiente Per v  T, definiamo arco azzurro associato a v un arco (u,v) tale che u  T, ed (u,v) ha peso minimo tra tutti gli archi che connettono v ad un vertice in T L’algoritmo mantiene in una coda di priorità i nodi non ancora aggiunti alla soluzione, aventi ciascuno per chiave il peso del rispettivo arco azzurro associato (+  nel caso in cui esso non esista); l’insieme delle chiavi viene memorizzato anche in un vettore ausiliario d[1..n]; Ad ogni passo, viene estratto il minimo dalla coda, aggiungendo il nodo associato alla soluzione, e si procede quindi all’eventuale aggiornamento delle chiavi nella coda di priorità

7 Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 7 Pseudocodice

8 Esempio B D E C F G A

9 Esempio B D E C F G s A

10 Esempio D E C F G s A B

11 Esempio D E F G s A B C

12 Esempio D F G s A B C E

13 Esempio D G s A B C E F

14 Esempio D s A B C E F G

15 Esempio s A B C E F G D

16 Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 16 Tempo di esecuzione utilizzando heap Supponendo che il grafo G sia connesso e rappresentato tramite liste di adiacenza, avremo n insert, n deleteMin e al più m decreaseKey n·O(1) + n·O(log n) + O(m)·O(log n) = O(m log n) utilizzando heap binari o binomiali (come Kruskal) n·O(1) + n·O(log n) + O(m)·O(1) * = O(m+n log n) utilizzando heap di Fibonacci (meglio di Kruskal, che costava O(m log n), se m=ω(n), mentre i due approcci si equivalgono se m=Θ(n)).

17 Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 17 Tempo di esecuzione: implementazioni elementari Supponendo che il grafo G sia rappresentato tramite liste di adiacenza, e supponendo che tutti i nodi siano connessi ad s, avremo n insert, n deleteMin e al più m decreaseKey nella coda di priorità, al costo di: n·O(1) + n·O(n) + O(m)·O(1) = O(n 2 ) con array non ordinati n·O(n) + n·O(1) + O(m)·O(n) = O(m·n) con array ordinati n·O(1) + n·O(n) + O(m)·O(1) = O(n 2 ) con liste non ordinate n·O(n) + n·O(1) + O(m)·O(n) = O(m·n) con liste ordinate InsertDelMinDecKey Array non ord.O(1)O(n)O(1) Array ordinatoO(n)O(1)O(n) Lista non ord.O(1)O (n)O(1) Lista ordinataO(n)O(1)O(n)

18 Un algoritmo per calcolare i minimi antenati comuni in un albero un’altra applicazione interessante della struttura dati Union-Find

19 Il problema del calcolo dei minimi antenati comuni in un albero Input: un albero radicato T=(V,E) un insieme S di archi non dell’albero Output: per ogni (u,v)  S, vogliamo il minimo antenato comune LCA(u,v) (da Least Common Ancestor) di u e v, ovvero l’antenato di u e v che è più lontanto dalla radice LCA(9,12)=7 LCA(10,5)=1 LCA(8,3)=4

20 l’idea eseguo una visita DFS mantengo con insiemi disgiunti le “parti” di albero già visitate (alberi rossi) il nome di una “parte” di albero è il nodo più vicino alla radice prima di abbandonare un nodo u posso trovare LCA(u,v) con v già visitato (abbandonato) facendo una find(v) u

21 l’algoritmo (Tarjan ‘79)

22 l’algoritmo

23 l’algoritmo

24 l’algoritmo

25 l’algoritmo

26 l’algoritmo

27 l’algoritmo

28 l’algoritmo

29 l’algoritmo

30 l’algoritmo

31 l’algoritmo

32 l’algoritmo

33 l’algoritmo

34 l’algoritmo LCA(9,12)= find(9)=7 3

35 l’algoritmo LCA(9,12)= find(9)=7 3

36 l’algoritmo LCA(9,12)= find(9)=7 3

37 l’algoritmo LCA(9,12)= find(9)=7 3

38 l’algoritmo LCA(9,12)= find(9)=7 3

39 l’algoritmo LCA(9,12)= find(9)=7 3

40 l’algoritmo LCA(9,12)= find(9)=7 3

41 l’algoritmo LCA(9,12)= find(9)=7 3

42 l’algoritmo LCA(9,12)= find(9)=7 LCA(10,5)= find(10)=1 3

43 l’algoritmo LCA(9,12)= find(9)=7 LCA(10,5)= find(10)=1 3

44 l’algoritmo LCA(9,12)= find(9)=7 LCA(10,5)= find(10)=1 3

45 l’algoritmo LCA(9,12)= find(9)=7 LCA(10,5)= find(10)=1 3

46 l’algoritmo LCA(9,12)= find(9)=7 LCA(10,5)= find(10)=1 3

47 l’algoritmo LCA(9,12)= find(9)=7 LCA(10,5)= find(10)=1 3

48 l’algoritmo LCA(9,12)= find(9)=7 LCA(10,5)= find(10)=1 3

49 l’algoritmo LCA(9,12)= find(9)=7 LCA(10,5)= find(10)=1 LCA(8,3)= find(8)=4 3

50 l’algoritmo LCA(9,12)= find(9)=7 LCA(10,5)= find(10)=1 LCA(8,3)= find(8)=4 3

51 l’algoritmo LCA(9,12)= find(9)=7 LCA(10,5)= find(10)=1 LCA(8,3)= find(8)=4 3

52 l’algoritmo LCA(9,12)= find(9)=7 LCA(10,5)= find(10)=1 LCA(8,3)= find(8)=4

53 correttezza u calcolo LCA(u,v) quando sto abbandonando u e v è già stato visitato (abbandonato) cosa stanno mantenendo gli insiemi disgiunti?

54 analisi della complessità la visita DFS dell’albero – senza contare le operazioni sulla struttura dati Union-find – costa O(n) Costo per le operazioni sulla Union-find: n operazioni di makeSet n-1 operazioni union m=|S| operazioni di find tempo O(n+ TempoUF(n,m)) tempo O(n+m  (n+m,n))

55 Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati The end


Scaricare ppt "Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Capitolo 12 Minimo albero ricoprente: Algoritmo di Prim Algoritmi e Strutture."

Presentazioni simili


Annunci Google