Minimum Spanning Tree (Árbol de Expansión Mínima)

Slides:



Advertisements
Presentaciones similares
Tania Guzmán García Luis González Varela Alexandre González Rivas
Advertisements

ALGORITMOS DE KRUSKAL Y PRIM
5. Estructuras no lineales estáticas y dinámicas
IBD Clase 7.
GRAFOS ESTRUCTURAS DE DATOS.
GRAFOS: ALGORITMOS FUNDAMENTALES
ÁRBOLES EN C UNIVERSIDAD “ALONSO DE OJEDA” Facultad de Ingeniería
Listas enlazadas c++ Prof. Franklin Cedeño.
1 Extensión de un Estructura de Datos Agustín J. González ELO-320: Estructura de Datos y Algoritmos.
“GRAFOS” Chacón Zamora José Christian González García Andrea
ESTRUCTURAS DE DATOS AVANZADAS
Algoritmos Aleatorizados
Método de Ford-Fulkerson
Definiciones: conjuntos, grafos, y árboles
Listas circulares.
Analisis y Diseño de Algoritmos Tema: Grafos 3ra Parte
Problemes de Viatjants
GRAFOS HUGO ARAYA CARRASCO.
REDES BAYESIANAS Y DECISIÓN ESTADÍSTICA
1 Algoritmos Elementales de Grafos Agustín J. González ELO-320: Estructura de Datos Y Algoritmos 1er.Sem
Programación entera y grafos
1 Kapitel 8: Graphalgorithmen 8.1 Grundlagen 8.2 Tiefen- und Breitensuche 8.3 Prim- und Kruskal-Algorithmus 8.4 Kürzeste Wege in Graphen 8.5 Eulersche.
Estructura de Datos Lineales
PROGRAMACIÓN PARALELA EN ALGORITMOS SOBRE GRAFOS
Material de apoyo Unidad 4 Estructura de datos
Ejemplos de Grafos: Red de tráfico con caminos y cruces.
Teoria de grafos.-clase 4
Definiciones: conjuntos, grafos, y árboles
Árboles, montículos y grafos Cola de prioridades, montículos
Ordenamiento, Heapsort y Colas de prioridad
Árbol recubridor mínimo Distancias
Heaps Mauro Maldonado Abril/2005. Introducción La estructura heap es frecuentemente usada para implementar colas de prioridad. En este tipo de colas,
Single-Source Shortest Paths “Camino más corto desde/hacia una fuente”
Matemáticas Discretas
Diseño y análisis de algoritmos
Diseño y análisis de algoritmos

A LGORITMO DE BÚSQUEDA POR COSTO UNIFORME Dorian López.
ARBOLES ESTRUCTURAS DE DATOS.
1 Estructuras de Datos Elementales:stacks (pilas), queues (colas), linked lists (listas enlazadas), y rooted trees (árboles con raíz) Agustín J. González.
Diseño y análisis de algoritmos
Analisis y Diseño de Algoritmos Tema: Grafos
Parte II. Algorítmica. 3. Algoritmos voraces.
ELO3201 Contenedores Biblioteca Estándar de Templates Agustín J. González ELO320 Contenido Contenedores: Vector, List, Deque, Stack, Queue, Priority Queue,
Diseño y análisis de algoritmos
Agustín J. González ELO-320: Estructura de Datos y Algoritmos
1 Algoritmos Avaros (Greedy Algorithms) Agustín J. González ELO-320: Estructura de Datos y Algoritmos.
Árboles Binarios Estructuras de Datos.
Agustín J. González ELO320: Estructura de Datos y Algoritmos
1 Algoritmos Avaros (Greedy Algorithms) Agustín J. González ELO-320: Estructura de Datos y Algoritmos 1er. Sem
Árboles de Búsqueda Binaria
Estructuras de datos para Grafos
1 Ordenamiento y estadísticas de orden Agustín J. González ELO 320: Estructura de Datos y Algoritmos.
Tópicos I Árboles, montículos y grafos
1 Single-Source Shortest Paths “Camino más corto desde/hacia una fuente” Agustín J. González ELO320: Estructura de Datos y Algoritmos 1.er. Sem
Definiciones: conjuntos, grafos, y árboles
A GRASP for graph planarization. Resende, Ribeiro Meta heurísticas Agustín Pecorari.
1 Flujo Máximo Agustín J. González ELO320: Estructura de Datos y Algoritmos.
Agustín J. González ELO-320: Estructura de Datos Y Algoritmos
1 Extensión de un Estructura de Datos Agustín J. González ELO-320: Estructura de Datos y Algoritmos.
1 Árboles de Búsqueda Binaria Agustín J. González ELO-320: Estructura de Datos y Algoritmos.
Agustín J. González ELO320: Estructura de Datos y Algoritmos
Minimum Spanning Tree (Árbol de Expansión Mínima)
Estructura de Datos 4 Grafos Dirigidos
Heap Fibonacci heap de Fibonacci es una estructura de datos similar a un heap binomial pero con mejor coste amortizado. se utiliza para mejorar el tiempo.
UNIDAD 2 Grafos Árboles abarcadores mínimos Caminos más cortos.
Matemáticas Discretas MISTI
Recorridos de grafos Segunda Parte M.C. Meliza Contreras González.
Lenguaje de Programación II Prof. Rafael Montenegro B. Carrera: T.S.U en Informática Periodo: 2014-I.
Minimum Spanning Tree (Árbol de Expansión Mínima)
Transcripción de la presentación:

Minimum Spanning Tree (Árbol de Expansión Mínima) Agustín J. González ELO320: Estructura de datos y Algoritmos

Introducción No se minimiza el número de arcos, que se puede demostrar es igual a |V|-1. (uno hacia el padre por vértice, menos la raíz) Hay varios problemas en los que se desea minimizar la interconexión de varios puntos. Por ejemplo en la confección de circuitos impresos. El problema consiste buscar el árbol cuya suma de pesos de sus arcos sea mínima en un grafo no dirigido. Hay dos algoritmos que resuelven este problema: Algoritmo de Kruskal y algoritmo de Prim (parecido al de Dijkstra - por verse). Ambos algoritmos corren en tiempo O(E lg V). Si se usa un heap especial (de Fibonacci) el algoritmo de Prim puede correr en O(E + V lg V) lo cual presenta ventajas cuando |V| << |E| Ambos algoritmos son ejemplos de la heurística de optimización llamada “greedy” (avaro, acaparador)

Ejemplo de árbol de expansión de mínimo peso h i d e g f b c 8 4 11 1 2 7 14 10 6 9 a

Una estrategia de avance h i d e g f b c 8 4 11 1 2 7 14 10 6 9 a V-S S

Algoritmo Genérico La idea es ir haciendo crecer el número de nodos que pertenecen al árbol de peso mínimo. Debemos ir buscando nodos y arcos que puedan ser agregados y que satisfagan la propiedad de mantener mínimo peso. Generic-MST(G, w) /* w es la función de peso */ A = {}; while( A no forma un “spanning Tree” ) Encontrar un arco (u,v) que es seguro para A; A = A +{(u,v)}; return A;

Algoritmo de Prim (1957 (Jarník 1930)) MST-PRIM(G, w, r) /* G es el grafo, w es la función de peso, y r es el nodo por el cual empezamos (puede ser cualquiera del grafo) */ Q = V[G]; /* Cola de prioridad con vértices fuera del árbol */ for (cada u en Q) key[u] = infinito; /* key es el peso mínimo para conectar un nodo al árbol */ key [r] = 0; /* raíz del árbol */ p [r] = NIL; while (Q != {} ) u = Extract_Min(Q); for (cada v en Adj [u] ) if ( v está en Q && w(u,v) < key [v] ) p [v] = u; key [v] = w(u,v);

Ejemplo del algoritmo de Prim c b d a h i g f e 4 8 7 9 14 10 2 1 6 11 (b) c b d a h i g f e 4 8 7 9 14 10 1 2 6 11 (a) c b d a h i g f e 4 8 7 9 14 10 2 1 6 11 (c) 2 c b d a h i g f e 4 8 7 9 14 10 2 1 6 11 (d) c b d a h i g f e 4 8 7 9 14 10 2 1 6 11 (e) c b d a h i g f e 4 8 7 9 14 10 2 1 6 11 (f) c b d a h i g f e 4 8 7 9 14 10 2 1 6 11 (g) c b d a h i g f e 4 8 7 9 14 10 2 1 6 11 (h) c b d a h i g f e 4 8 7 9 14 10 2 1 6 11 (i)

Comentarios sobre algoritmo de Prim La eficiencia de este algoritmo depende de cómo se implemente la cola de prioridad Q. Si se implementa con un heap binario se obtiene que el algoritmo corre en tiempo O(V lg V + E lg V) = O(E lg V) Si se usa un heap de Fibonacci (no visto en el curso) el tiempo es O(E+V lgV), lo cual es una mejora cuando |V| << |E|

Algoritmo de Kruskal (1956) Aspecto previo: Conjuntos disjuntos El algoritmo de Kruskal queda mejor definido si utilizamos conjuntos en su descripción. Por ello veremos la definición de un tipo de datos para conjuntos disjuntos. Consideremos una colección , S, de conjuntos disjuntos S = {S1,S2,S3, .. Sk}. Cada conjunto será representado por un representante, el cual es un elemento cualquiera del conjunto. Deseamos disponer de las siguientes operaciones: Make_Set(x): crea un nuevo conjunto cuyo único elemento es apuntado por x (es así el representante). Union(x, y): Une a los conjuntos dinámicos que contienen a x e y en un nuevo conjunto. Como la colección de conjuntos es disjunta, esto destruye los conjuntos originales. Find_Set(x): retorna un puntero al representante del conjunto que contiene x.

Aplicación de Conjuntos disjuntos: Obtención de las componentes conexas en grafos no dirigidos Connected_Components(G) for (cada vértice v en V[G] ) Make_Set(v); for (cada arco (u,v) en E [G]) Union(u,v); Ejemplo: Considerar que los arcos se procesan en el orden: (b,d); (e,g); (a,c); (h,i); (a,b); (e,f); (b,c) f h j a b e c d g i

Posible implementación de Conjuntos disjuntos usando listas enlazadas Se puede tomar como base las listas simplemente enlazadas, e incorporando en cada nodo un puntero al primer nodo. La lista se crea con un elemento. No hay inserción y eliminación. La unión es juntar ambas listas. Find retorna el puntero al primer nodo. Typedef struct disjoint_set_node { struct disjoint_set_node * representante; struct disjoint_set_node * next; elementType element; } DISJOINT_SET_NODE;

Visualización gráfica del conjunto Typedef struct disjoint_set_node { struct disjoint_set_node * representante; struct disjoint_set_node * next; elementType element; } DISJOINT_SET_NODE; Las operaciones Make_Set, Find_Set, y Union, pueden ser implementadas en forma más o menos directa. c h e b a

Algoritmo de Kruskal (1956) MST_Kruskal (G,w) { A = {}; for (cada vértice v en V[G] ) Make_Set(v); Ordenar los arcos de E según peso w no decreciente; for ( cada arco (u,v) en E, en orden no decreciente de peso) if ( Find_Set(u) != Find_Set(v) ) { A = A  {(u,v)}; Union(u,v); } }

Algoritmo de Kruskal :Ejemplo c b d a h i g f e 4 8 7 9 14 10 2 1 6 11 (a) (c) (e) (g) (b) (d) (f) (h)

Algoritmo de Kruskal :Ejemplo (continuación) b d a h i g f e 4 8 7 9 14 10 2 1 6 11 (j) (l) (n) (i) (k) (m)