unidad 6 - mate discretas

40
UNIDAD 6 – Teoría de Grafos Matemáticas Discretas. Profr.: Juan Carlos Gómez Ramírez. Salón: 701 Integrantes del equipo: Jesús Moreno Garzón Ricardo Jacob Olivares Solís Alejandro Organista Mongoy Sergio Arturo Padilla Ignacio Brian Rodríguez Serrano

Upload: jacob-os

Post on 09-Aug-2015

39 views

Category:

Documents


5 download

TRANSCRIPT

Page 1: UNIDAD 6 - Mate Discretas

UNIDAD 6 – Teoría de Grafos

Matemáticas Discretas.

Profr.: Juan Carlos Gómez Ramírez.Salón: 701

Integrantes del equipo:

Jesús Moreno GarzónRicardo Jacob Olivares SolísAlejandro Organista MongoySergio Arturo Padilla IgnacioBrian Rodríguez Serrano

Page 2: UNIDAD 6 - Mate Discretas

Grafos

Desafortunadamente no existe una terminología estandarizada en la teoría de los grafos, por lo tanto es oportuno aclarar que las presentes definiciones pueden variar ligeramente entre diferentes publicaciones de estructura de datos y de teoría de grafos, pero en general se puede decir que un grafo como indica su nombre lo indica es la representación (para nuestro caso) gráfica de los datos de una situación particular, ejemplo:

   Los datos contienen, en algunos casos, relaciones entre ellos que no es necesariamente jerárquica. Por ejemplo, supongamos que unas líneas aéreas realizan vuelos entre las ciudades conectadas por líneas como se ve en la figura anterior (más adelante se presentaran grafos con estructuras de datos); la estructura de datos que refleja esta relación recibe el nombre de grafo.

Un grafo, G, es un par ordenado de V y A, donde V es el conjunto de vértices o nodos del grafo y A es un conjunto de pares de vértices, a estos también se les llama arcos o ejes del grafo. Un vértice puede tener 0 o más aristas, pero toda arista debe unir exactamente a dos vértices.

Los grafos representan conjuntos de objetos que no tienen restricción de relación entre ellos. Un grafo puede representar varias cosas de la realidad cotidiana, tales como mapas de carreteras, vías férreas, circuitos eléctricos, etc.

La notación G = A (V, A) se utiliza comúnmente para identificar un grafo.

Los grafos se constituyen principalmente de dos partes: las aristas, vértices y los caminos que pueda contener el mismo grafo.

Page 3: UNIDAD 6 - Mate Discretas

6.1 Elementos y Características de los Grafos

La teoría de grafos juega un papel importante en la fundamentación matemática de las ciencias de la computación. Los grafos constituyen una herramienta básica para modelizar fenómenos discretos y son fundamentales para la compresión de las estructuras de datos y el análisis del algoritmo.

Definición:

Un grafo G = (N, A) consta de un conjunto de nodos N y un conjunto de aristas A, en donde a cada arista es un par no ordenado de nodos (vértices o puntos). Una arista en general se representa por { a, b }. Alas aristas también se le llaman segmentos. Una forma de representar grafos es mediante círculos para los nodos, conectados por líneas para las aristas.

Ejemplo 1:

 El Grafo G que consta de los nodos N y segmentos se denota como:

G(N,S) donde: N = {n1, n2, n3, n4, n5, n6, n7, n8}A= {{n1, n2}, {n1, n5}, {n3, n4}, {n4, n7}, {n2, n6},{n6, n2}}

Notación:

Una arista es un conjunto, pero puede haber dos aristas que conecte los mismos nodos, por lo que se le puede anteponer un nombre, por ejemplo la arista 1 puede nombrarse como a 1= {n2, n6}, la arista 2 como a 2={n2, n6}, estas dos aristas unen los nodos n2y n6. También puede ser que en una arista importe el orden de los nodos por lo que podemos en este caso utilizar la notación de par ordenado (n1, n2) cambiando las llaves por paréntesis y orientando el sentido de la arista. La terminología que manejaremos regularmente para el uso de grafos es el siguiente:

•CAMINO.

Page 4: UNIDAD 6 - Mate Discretas

Es una secuencia alternada de vértices y segmentos de la formaV1,S1,V2,S2,V3,S3,V4.Secuencia de vérticesV1,V2,V3,V4o secuencia de segmentosS1,S2,S3.

Para la siguiente figura un camino puede representarse como:6,4,5,1,2 otro ejemplo es3,2,5,4,6 El siguiente NO es un camino válido: 6,5,3,1 pues no hay un segmento entre los nodos 6 y 5, ni entre 5 y 3, ni entre 3 y 1..175864132

•LONGITUD DE CAMINO.

Es el número de segmentos en ese camino. Para el camino 6, 4, 5, 1,2 la longitudes 4 pues hay 4 segmentos.

•SENDERO.

Es un camino en el cual todos los segmentos son diferentes. El camino 6, 4, 5, 1,2 es un sendero. El camino 6, 4, 5, 2, 5, 1 no lo es pues un mismo segmento es recorrido 2 veces.

•TRAYECTORIA.

Es un camino en el cual todos los nodos son diferentes; así toda trayectoria debe ser un sendero. El camino 6, 4, 5, 1, 2 es una trayectoria, el camino 6, 4, 5, 2, 3, 4 no lo es pues se repite el nodo 4.

•CAMINO SIMPLE.

Es cuando todos sus vértices, excepto tal vez el primero y el último, son distintos.

•CICLO SIMPLE.

Es un camino simple de longitud por lo menos de uno, que empieza y termina en el mismo vértice. El camino 4, 5, 2, 3, 4 es un ciclo.

6.1.1 Componentes de un grafo

Un grafo (g) es un diagrama que consta de un conjunto de vértices (v) y un conjunto de lados (l).

Vértices (nodos):

Se indican por medio de un pequeño círculo y se les asigna un número o letra

Page 5: UNIDAD 6 - Mate Discretas

 Arista (lados o ramas):son las líneas que unen un vértice con otro y se les asigna una letra, un número o una combinación de ambos. Los lados paralelos son aquellas aristas que tienen relación con un mismo par de vértices 

Lazos o bucles:

Un lazo o bucle es una arista que relaciona al mismo nodo; es decir, una arista donde el nodo inicial y el nodo final coinciden. Es aquel que sale de un vértice y regresa al mismo vértice 

Valencia de un vértice:Es el número de lados que salen o entran a un vértice.

6.1.2 Tipos de grafos

Grafos simples

Un grafo es simple si a lo más existe una arista uniendo dos vértices cualesquiera. Esto es equivalente a decir que una arista cualquiera es la única que une dos vértices específicos.

Grafos conexos

Un grafo es conexo si cada par de vértices está conectado por un camino; es decir, si para cualquier par de vértices (a, b), existe al menos un camino posible desde a hacia b.

Un grafo es doblemente conexo si cada par de vértices está conectado por al menos dos caminos disjuntos; es decir, es conexo y no existe un vértice tal que al sacarlo el grafo resultante sea disco-nexo.

Grafos completos

Un grafo es completo si existen aristas uniendo todos los pares posibles de vértices. Es decir, todo par de vértices (a, b) debe tener una arista e que los une.

Grafos bipartitos

Un grafo G es bipartito si puede expresarse como   (es decir, sus vértices son la unión de dos grupos de vértices), bajo las siguientes condiciones:

 y   son disjuntos y no vacíos.

Cada arista de A une un vértice de V1 con uno de V2.

Page 6: UNIDAD 6 - Mate Discretas

No existen aristas uniendo dos elementos de V1; análogamente para V2.

Bajo estas condiciones, el grafo se considera bipartito, y puede describirse informalmente como el grafo que une o relaciona dos conjuntos de elementos diferentes, como aquellos resultantes de los ejercicios y puzzles en los que debe unirse un elemento de la columna A con un elemento de la columna B.

Grafos planos

Cuando un grafo o multígrafo se puede dibujar en un plano sin que dos segmentos se corten, se dice que es plano.

6.2 Representación de los grafos

6.2.1 Matemática

Existen diferentes formas de representar un grafo (simple), además de la geométrica y muchos métodos para almacenarlos en una computadora. La estructura de datos usada depende de las características del grafo y el algoritmo usado para manipularlo. Entre las estructuras más sencillas y usadas se encuentran las listas y las matrices, aunque frecuentemente se usa una

Page 7: UNIDAD 6 - Mate Discretas

combinación de ambas. Las listas son preferidas en grafos dispersos porque tienen un eficiente uso de la memoria. Por otro lado, las matrices proveen acceso rápido, pero pueden consumir grandes cantidades de memoria.

6.2.2 Computacional

Page 8: UNIDAD 6 - Mate Discretas

6.3 Algoritmos de recorrido y búsqueda

RECORRIDO DE GRAFOS:

Recorrer un grafo significa tratar de alcanzar todos los nodos que estén relacionados con uno que llamaremos nodos de salida. Existen básicamente dos técnicas para recorrer un grafo: el recorrido en anchura y el recorrido en profundidad.

Así, para recorrer un grafo consiste en visitar todos los vértices alcanzables a partir de uno dado. Hay dos formas.

Recorrido en profundidad (DFS)

Recorrido en anchura (BFS)

Algoritmo BFS

Page 9: UNIDAD 6 - Mate Discretas

El algoritmo de recorrido en anchura o BFS, explora sistemáticamente todas las ramas o aristas del grafo de manera que primero se visitan los nodos o vértices más cercanos a un nodo inicial.

Para la implementación de este algoritmo se utiliza globalmente un contador y un vector de enteros para marcar los vértices ya visitados y almacenar el recorrido. El algoritmo BFS requiere también un vector de cola auxiliar para gestionar los vértices no visitados.

En muchos casos es necesario ejecutar este algoritmo empezando en los nodos más alejados del nodo escogido como nodo inicial.

Algoritmo DFS

El algoritmo de recorrido en profundidad o DFS, explora sistemáticamente las ramas o aristas del grafo de manera que primero se visitan los nodos o vértices adyacentes a los visitados más recientemente. De esta forma se va "profundizando" en el grafo, es decir, alejándose progresivamente del nodo inicial [2]. Esta estrategia admite una implementación simple en forma recursiva, utilizando globalmente un contador y un vector de enteros para marcar los vértices ya visitados y almacenar el orden del recorrido.

BÚSQUEDA EN PROFUNDIDAD (BEP)

Se comienza en el vértice inicial (vértice con índice 1) que se marca como vértice activo. Hasta que todos los vértices hayan sido visitados, en cada paso se avanza al vecino con el menor índice siempre que se pueda, pasando este a ser el vértice activo. Cuando todos los vecinos al vértice activo hayan sido visitados, se retrocede al vértice X desde el que se alcanzó el vértice activo y se prosigue siendo ahora X el vértice activo.

ALGORITMO BEP:

Sea G = (V, A) un grafo conexo, V' = V un conjunto de vértice, A'un vector de arcos inicialmente vacío y P un vector auxiliar inicialmente vacío:

Page 10: UNIDAD 6 - Mate Discretas

Se introduce el vértice inicial en P y se elimina del conjunto V'.

Mientras V' no sea vacío repetir los puntos 3 y 4. En otro caso parar.

Se toma el último elemento de P como vértice activo.

Si el vértice activo tiene algún vértice adyacente que se encuentre en V':

Se toma el de menor índice.

Se inserta en P como último elemento.

Se elimina de V'.

Se inserta en A' el arco que le une con el vértice activo.

Si el vértice activo no tiene adyacentes se elimina de P.

BÚSQUEDA ANCHURA (BEA)

Se comienza en el vértice inicial (vértice con índice 1) y se marca como vértice activo, a diferencia con la BEP ahora se visitan en orden creciente de índice todos los vecinos del vértice activo antes de pasar al siguiente. Hasta que todos los vértices hayan sido visitados, en cada paso se van visitando en orden creciente de índice todos los vecinos del vértice activo. Cuando se han visitado todos los vecinos del vértice activo, se toma como nuevo vértice activo el primer vértice X visitado después del actual vértice activo en el desarrollo del algoritmo.

ALGORITMO BEA:

Sea G = (V, A) un grafo conexo, V' = V un conjunto de vértices, A' un vector de arcos inicialmente vacío y P un vector auxiliar inicialmente vacío:

Se introduce el vértice inicial en P y se elimina del conjunto.

Mientras V' no sea vacío repetir los puntos 3 y 4. En otro caso parar.

Se toma el primer elemento de P como vértice activo.

Si el vértice activo tiene algún vértice adyacente que se encuentre en V':

Se toma el de menor índice.

Se inserta en P como último elemento.

Se elimina de V'.

Page 11: UNIDAD 6 - Mate Discretas

Se inserta en A' el arco que le une con el vértice activo.

Si el vértice activo no tiene adyacentes se elimina de P.

6.3.1 El camino más corto

El problema de los caminos más cortos es el problema que consiste en encontrar un camino entre dos vértices (o nodos) de tal manera que la suma de los pesos de las aristas que lo constituyen es mínima. Un ejemplo es encontrar el camino más rápido para ir de una ciudad a otra en un mapa. En este caso, los vértices representan las ciudades, y las aristas las carreteras que las unen, cuya ponderación viene dada por el tiempo que se emplea en atravesarlas.

Ahora bien, podemos emplear el algoritmo de Dijkstra para estos casos, los pasos o procedimiento a seguir para éste algoritmo son los siguientes: Teniendo un grafo dirigido ponderado de N nodos no aislados, sea x el nodo inicial, un vector D de tamaño N guardará al final del algoritmo las distancias desde x al resto de los nodos.

1. Inicializar todas las distancias en D con un valor infinito relativo ya que son desconocidas al principio, exceptuando la de x que se debe colocar en 0 debido a que la distancia de x a x sería 0.

2. Sea a = x (tomamos a como nodo actual).

3. Recorremos todos los nodos adyacentes de a, excepto los nodos marcados, llamaremos a estos vi.

4. Si la distancia desde x hasta v guardada en D es mayor que la distancia desde x hasta a, sumada a la distancia desde a hasta v; esta se sustituye con la segunda nombrada, esto es: si (Di> Da+ d(a, vi)) entonces Di= Da+ d(a, vi)

5. Marcamos como completo el nodo a.

6. Tomamos como próximo nodo actual el de menor valor en D (puede hacerse almacenándolos valores en una cola de prioridad) y volvemos al paso 3 mientras existan nodos no marcados. Una vez terminado al algoritmo, D estará completamente lleno.

6.3.2 A lo ancho

La búsqueda en anchura es otro procedimiento para visitar sistemáticamente todos los vértices de un grafo. Es adecuado especialmente para

Page 12: UNIDAD 6 - Mate Discretas

resolver problemas de optimización, en los que se deba elegir la mejor solución entre varias posibles. Al igual que en la búsqueda en profundidad se comienza en un vértice v (la raíz) que es el primer vértice activo. En el siguiente paso se etiquetan como visitados todos los vecinos del vértice activo que no han sido etiquetados. Se continúa etiquetando todos los vecinos de los hijos de v (que no hayan sido visitados aún). En este proceso nunca se visita un vértice dos veces por lo que se construye un grafo sin ciclos, que será un árbol generador de la componente conexa que contiene a v. Sea G(V, E) un grafo conexo y v un vértice de V. El algoritmo de búsqueda en anchura puede detallarse así:1. Designamos a v como vértice activo y como raíz del árbol generador T que se construirá. Se le asigna a v la etiqueta 0.2. Sea i=0 y S= {v}.3. Hallar el conjunto M de todos los vértices no etiquetados que son adyacentes a algún vértice de S.

4. Si M es vacío el algoritmo termina. En caso contrario, se etiquetan todos los vértices de M coni+1, se añaden a T las aristas entre cada vértice de S y su vecino en M y se hace S=M.5. i=i+1 y volver al paso 3.Al terminar el proceso se habrá construido un árbol generador del grafo inicial. En caso de G no ser conexo, habría que modificar el algoritmo para encontrar un árbol generador de cada componente conexa de G. La complejidad de este algoritmo es O (máx.{n, m}).

6.3.3 En profundidad.

Muchos algoritmos de grafos necesitan visitar de un modo sistemático todos los vértices de un grafo. En la búsqueda en profundidad se avanza de vértice en vértice, marcando cada vértice visitado. La búsqueda siempre avanza hacia un vértice no marcado, internándose “profundamente” en el grafo in repetir ningún vértice. Cuando se alcanza un vértice cuyos vecinos han sido marcados, se retrocede al anterior vértice visitado y se avanza desde éste. Si dado un grafo simple G, escogemos un vértice v para iniciar la exploración del grafo utilizando la búsqueda en profundidad, el árbol que se construye es un árbol generador de la componente conexa del grafo que contiene a v. Sea G (V, E) un grafo conexo y v un vértice de V. El algoritmo de búsqueda en profundidad puede detallarse así: 1. Se comienza en un vértice v (vértice activo) y se toma como la raíz del árbol generador T que se construirá. Se marca el vértice v.2. Se elige un vértice u, no marcado, entre los vecinos del vértice activo. Si no existe tal vértice, ira 4.3. Se añade la arista (v, u) al árbol T. Se marca el vértice u y se toma como activo. Ir al paso 2.4. Si se han alcanzado todos los vértices de G el algoritmo termina. En caso contrario, se toma el vértice padre del vértice activo como nuevo vértice activo y se vuelve al paso 2.La complejidad de este algoritmo es O (máx. {n, m})

Page 13: UNIDAD 6 - Mate Discretas

6.4.- ARBOLES.

Concepto de Árbol

Los árboles forman una de las subclases de gráficas que más se utilizan. La ciencia de la computación hace uso de los árboles ampliamente, especialmente para organizar y relacionar datos en una base de datos. Los árboles surgen en problemas teóricos como el tiempo óptimo para ordenar.

Formalmente se define un árbol de tipo T como una estructura homogénea que es la concatenación de un elemento de tipo T junto con un número finito de árboles disjuntos, llamados subárboles.

Una forma particular de árbol puede ser la estructura vacía. Un árbol es un grafo simple en el cual existe un único camino entre cada par de vértices.

Los árboles pueden ser construidos con estructuras estáticas y dinámicas. Las estáticas son arreglos, registros y conjuntos, mientras que las dinámicas están representadas por listas. Sea G =(V,A) un grafo no dirigido. G se denomina ARBOL, si es conexo y no contiene ciclos. Ejemplo de árbol:

Otros ejemplos de árbol son:

Page 14: UNIDAD 6 - Mate Discretas

En donde: Los grafos G1 y G2 son árboles, mientras que los grafos G3 y G4 no lo son.

Bosque

Es un grafo donde cada componente conexa es un árbol, es decir es un conjunto de árboles no conexos entre sí. Además es un grafo sin ciclos por estar compuesto por árboles.

Arborescencia. Es un árbol dirigido con un nodo llamado raíz, tal que existe un único camino desde la raíz a cualquier otro nodo del árbol. Ese camino es elemental y simple.

Page 15: UNIDAD 6 - Mate Discretas

6.4.1.- Componentes. (RAIZ, HOJA, PADRE, HIJO, DESCENDIENTE, ANCESTRO)

Un árbol está divido en tres subconjuntos separados.

El primer subconjunto contiene un único elemento llamado raíz del árbol.

Los otros 2 subconjuntos son por si mismos árboles binarios y se les conoce como subárboles izquierdo y derecho del árbol original. Cada elemento de un árbol binario se denomina nodo. La ausencia de una ramificación indica un subárbol vacío.

Si A es la raíz de un árbol binario y B es la raíz de su subárbol izquierdo o derecho, se dice que A es el padre de B y se dice que B es el hijo izquierdo o derecho de A.

Un nodo que no tiene hijos se denomina hoja. El nodo n1 es un ancestro del nodo n2 (y n2 es un descendiente de n1) si n1 es el padre de n2 o el padre de algún ancestro de n2. 2 nodos son hermanos si son el hijo izquierdo y derecho del mismo padre.

Si cada nodo que no es hoja es un árbol binario tiene subárboles izquierdo y derecho que no están vacíos, el elemento se clasifica como árbol estrictamente binario.

Los árboles representan las estructuras no lineales y dinámicas de datos más importantes en computación. Dinámicas porque las estructuras de árbol pueden

Page 16: UNIDAD 6 - Mate Discretas

cambiar durante la ejecución de un programa. No lineales, puesto que a cada elemento del árbol pueden seguirle varios elementos.

Se utiliza la recursión para definir un árbol porque representa la forma más apropiada y porque además es una característica inherente de los mismos. Los árboles tienen una gran variedad de aplicaciones. Por ejemplo, se pueden utilizar para representar fórmulas matemáticas, para organizar adecuadamente la información, para construir un árbol genealógico, para el análisis de circuitos eléctricos y para numerar los capítulos y secciones de un libro.

TIPOS DE ÁRBOL

Árbol libre

Un árbol T (libre) es una gráfica simple que satisface lo siguiente; si v y w son vértices en T, existe una trayectoria simple única de v a w. Se muestra un ejemplo:

ÁRBOLES DE EXPANSIÓN

Un árbol T es un árbol de expansión de una gráfica G si T es una subgráfica de G que contiene a todos los vértices de G. Una gráfica G tiene un árbol de expansión si y solo si G es conexa.

Page 17: UNIDAD 6 - Mate Discretas

El árbol de expansión para la gráfica G que se presenta, se muestra con línea seguida.

Existen dos métodos para encontrar el árbol de expansión de una gráfica G:

1. Por búsqueda a lo ancho: permite procesar todos los vértices en un nivel dado antes de moverse al nivel más alto que lo sigue; primero se selecciona un orden de los vértices, considerando el primer vértice de ese orden como raíz.

2. Por búsqueda en profundidad: o conocido también como de regreso.

Ejemplo

Utilice la búsqueda a profundidad con el orden h, g, f, e, d, c, b, a de los vértices para determinar un árbol de expansión de la gráfica G. Tomado h como vértice raíz tenemos:

Page 18: UNIDAD 6 - Mate Discretas

Árboles de expansión mínimo

Un árbol de expansión comprende un grafo que posee nodos, arcos cada uno con longitud (peso) no negativa. Para encontrar el árbol de expansión mínima se debe recorrer todos los vértices del árbol en el que la suma de los pesos de sus aristas sea mínima, no se incluyen ciclos en la solución.

Un árbol de expansión mínima de G es un árbol de expansión de G con peso mínimo.

Árboles Binarios

Están entre los tipos de árboles binarios especiales con raíz, su característica es que todo vértice tiene cuando mucho dos hijos. Donde cada hijo se designa como un hijo izquierdo o un hijo derecho, además, su posición en el árbol los identifica.

Formalizando se dice que un árbol binario es un árbol con raíz en el que cada vértice tiene ningún hijo, un hijo o dos hijos. Si el vértice tiene un hijo se designa como un hijo izquierdo o como derecho (pero no ambos). Si un vértice tiene dos hijos, un hijo se designa como hijo izquierdo y el otro como hijo derecho.

Un árbol binario completo es un árbol binario en el que cada vértice tiene dos o cero hijos.

Ejemplo

Page 19: UNIDAD 6 - Mate Discretas

Arboles degenerados: Árbol con un solo vértice y sin lados.

Árbol maximal: T es un árbol maximal de un grafo G conexo, si es un árbol y contiene todos los vértices de G.

Arboles generadores: Un árbol T es un árbol generador de un grafo G si T es un subgrafo de G que contiene todos los vértices de G. Todo grafo conexo posee un árbol generador. Su algoritmo es:

Si G es un grafo conexo con n vértices:

Paso 1: Elegir un vértice v de G y considerar el árbol Ai formado sólo por v.

Paso 2: Para i = 2, . . . , n formar el árbol A a partir de A eligiendo un vértice de G que no sea vértice de A i-1 tal que esté conectado con algún vértice de Ai-1 por una arista, y añadiendo esa arista.

Paso 3: El árbol An así obtenido es árbol generador.

6.4.2.- PROPIEDADES

Todo árbol es a su vez un grafo bipartito. Todo árbol con sólo un conjunto numerable de vértices es además un grafo plano.

Todo grafo conexo G admite un árbol de expansión, que es un árbol que contiene cada vértice de G y cuyas aristas son aristas de G.

Page 20: UNIDAD 6 - Mate Discretas

Dado n vértices etiquetados, hay n n-2 maneras diferentes de conectarlos para construir un grafo. El resultado se llama fórmula de Cayley. El número de árboles con n vértices de grado d1 ,d2 ,...,dn es:

Los árboles son un tipo especial de grafo.

G es un grafo, no dígrafo sin bucles. G es un árbol si es conexo y no tiene ciclos.

Teorema 1: Si a y b son dos vértices distintos de un árbol, entonces existe un único camino elemental que conecta dichos vértices.

Teorema 2: T es un árbol cualquiera, entonces |v|=|E|+1.

Teorema 3: T es un árbol con |v|"2, se verifica que tiene a menos dos vértices terminales.

6.4.3.- CLASIFICACION (ALTURA, NUMERO DE NODOS)

Altura

La altura (o profundidad) de un árbol es el largo del mayor camino de la raíz a una hoja.

Dado un camino < v0, v1, v2,..., vk > el largo de este camino es k.

Por lo cual el largo de un camino es igual al número de arcos del camino.

Page 21: UNIDAD 6 - Mate Discretas

Numero de Nodos

Nodo:

Es el término usado para referirse a un vértice de un árbol con raíz.

Un árbol estrictamente binario con n hojas siempre contiene 2n - 1 nodos. El nivel de un nodo en árbol binario se define del modo siguiente: la raíz del árbol tiene el nivel 0, el nivel de cualquier otro nodo en el árbol es uno más que el nivel de su padre.

Si un árbol binario contiene m nodos en el nivel I, contiene cuando mucho 2m nodos en el nivel I + 1. Dado que un árbol binario solo contiene un nodo en el nivel 0 (raíz), puede contener un máximo de 2I nodos en el nivel I. Un árbol binario completo de profundidad d es el árbol que contiene 2I nodos en el nivel entre 0 y d. La cantidad total de nodos en un árbol binario completo de profundidad d, tn es igual a la suma de la cantidad de nodos en cada nivel entre 0 yd.

Un árbol binario de profundidad d es un árbol binario casi completo si:

Cualquier nodo nd a un nivel menor que d - 1tiene 2 hijos.

Para cualquier nodo nd en el árbol con un descendiente derecho en el nivel d, nd debe tener 1 hijo izquierdo y cada descendiente izquierdo de nd es una hoja en el nivel d o tiene 2 hijos.

Los nodos de un árbol binario casi completo se enumeran para que se asigne a la raíz el No.1, se asigne a un hijo izquierdo 2 veces el número asignado a su padre y se asigne a un hijo derecho 1 más el doble del No. asignado a su padre. Un árbol estrictamente binario casi completo con n hojas tiene 2n - 1nodos, como cualquier otro árbol estrictamente binario con n hojas. Un árbol binario casi completo con n hojas que no es estrictamente binario tiene 2n nodos.

Solo hay un árbol binario casi completo con n nodos. Este árbol es estrictamente binario si y solo si n es impar.

Igual que en el caso de los nodos de lista, los nodos de árboles se implementan como elementos de un arreglo o como asignaciones de una variable dinámica. Cada nodo contiene campos info, left, right y father. Los campos left, right y father de un modo apuntan al hijo izquierdo, al hijo derecho y al padre del nodo, respectivamente.

Por definición, los nodos de hoja no tienen hijos. En ocasiones, se usan 2 conjuntos de nodos separados para hojas y los que no son hojas. Los nodos que no son hojas contienen campos info, left y right. . se asignan como registros

Page 22: UNIDAD 6 - Mate Discretas

dinámicos o como un arreglo de registros controlados usando una lista disponible. Los nodos hojas no contienen un campo left o right y se conservan como una arreglo info único que se asigna secuencialmente conforme se necesita.

Cuando se establece la diferencia entre los nodos de hojas y los no hojas, los no hojas se llaman nodos internos y los hojas se llaman nodos externos

CLASIFICACIÓN DE LOS ARBOLESExisten cuatro tipos de árbol binario:  * Distinto.   *Similares.   * Equivalentes.   * Completos. 

DISTINTO: Se dice que dos árboles binarios son distintos cuando sus estructuras son diferentes. Ejemplo: 

SIMILARES: Dos árboles binarios son similares cuando sus estructuras son idénticas, pero la información que contienen sus nodos es diferente. Ejemplo: 

EQUIVALENTES: Son aquellos árboles que son similares y que además los nodos contienen la misma información. Ejemplo: 

COMPLETOS: Son aquellos árboles en los que todos sus nodos excepto los del ultimo nivel, tiene dos hijos; el subárbol izquierdo y el subárbol derecho

POR NÚMERO DE NODOS.: Nodo es la unidad sobre la que se construye el árbol y puede tener cero o más nodos hijos conectados a él. Se dice que un nodo a es padre de un nodo b, si existe un enlace desde a hasta b (en ese caso, también decimos que b es hijo de a). Sólo puede haber un único nodo sin padres, que llamaremos raíz. Un nodo que no tiene hijos se conoce como hoja.

POR SU ALTURA: Un árbol binario perfecto es un árbol binario lleno en el que todas las hojas vértices con cero hijos están a la misma profundidad distancia desde la raíz, también llamada altura, es la altura de la raíz (o equivalentemente el máximo de las profundidades).

ARBOLES CON PESO: Un grafo es pesado cuando sus aristas contienen daros (etiquetas). Una etiqueta puede ser un nombre, costo o un valor de cualquier tipo

Page 23: UNIDAD 6 - Mate Discretas

de dato, también a este tipo de grafo se le denomina “red de actividades” y el numero asociado al arco se le denomina factor de peso. Tanto a las aristas como a los vértices les puede ser asociada información, a esta información se le llama etiquetas, si la etiqueta que se asocia es un numero se le llama peso, costo o longitud. Un grafo cuyas aristas o vértices tienen pesos asociados recibe el nombre de grafo etiquetado o ponderado.

CODIFICAR INFORMACIÓN USANDO EL CÓDIGO DE HUFFMAN.

        En 1952, David Huffman propuso un método estadístico que permitía asignar un código binario a los diversos símbolos a comprimir (píxeles o caracteres, por ejemplo). La longitud de cada código no es idéntica para todos los símbolos: se asignan códigos cortos a los símbolos utilizados con más frecuencia (los que aparecen más a menudo), mientras que los símbolos menos frecuentes reciben códigos binarios más largos. La expresión Código de Longitud Variable (VLC) se utiliza para indicar este tipo de código porque ningún código es el prefijo de otro. De este modo, la sucesión final de códigos con longitudes variables será en promedio más pequeña que la obtenida con códigos de longitudes constantes. 

El codificador Huffman crea una estructura arbórea ordenada con todos los símbolos y la frecuencia con que aparecen. Las ramas se construyen en forma recursiva comenzandocon los símbolos menos frecuentes. 

La construcción del árbol se realiza ordenando en primer lugar los símbolos según la frecuencia de aparición. Los dos símbolos con menor frecuencia de aparición se eliminan sucesivamente de la lista y se conectan a un nodo cuyo peso es igual a la suma de la frecuencia de los dos símbolos. El símbolo con menor peso es asignado a la rama 1, el otro a la rama 0 y así sucesivamente, considerando cada nodo formado como un símbolo nuevo, hasta que se obtiene un nodo principal llamado raíz. 

El código de cada símbolo corresponde a la sucesión de códigos en el camino, comenzando desde este carácter hasta la raíz. De esta manera, cuanto más dentro del árbol esté el símbolo, más largo será el códigoÁRBOLES LIBRES.

Es un grafo no dirigido acíclico conexo.

ÁRBOLES DE EXPANSION.

Page 24: UNIDAD 6 - Mate Discretas

Un árbol de expansión T de un grafo conexo, no dirigido G es un árbol compuesto por todos los vértices y algunas (quizá todas) de las aristas de G. Informalmente, un árbol de expansión de G es una selección de aristas de G que forman un árbol que cubre todos los vértices. Esto es, cada vértice está en el árbol, pero no hay ciclos.Por otro lado, todos los puentes de G deben estar contenidos en T.Un árbol de expansión de un grafo conexo G puede sertambién definido como el mayor conjunto de aristas de G que no contiene ciclos, o como el mínimo conjunto de aristas que conecta todos los vértices.En ciertos campos de la teoría de grafos es útil encontrar el mínimo árbol de expansión de un grafo ponderado. También se han abordado otros problemas de optimización relacionados con los árboles de expansión, como el máximo árbol de expansión, el máximo árbol que cubre al menos k vértices, el mínimo árbol de expansión con k aristas por vértice como máximo (árbol de expansión de mínimo grado, MDST por sus siglas en inglés), el árbol de expansión con el máximo número de hojas (estrechamente relacionado con el problema del menos conjunto dominante y conexo), el árbol de expansión con el menor número de hojas (relacionado con el problema del camino ha miltoniano), el árbol de expansión de mínimo diámetro o el árbol de expansión de la mínima dilación.

POR BÚSQUEDA A LO ANCHO.La búsqueda se realiza a lo largo del árbol o grafo, recorriendo todos los nodos de una correspondiente fila antes de pasar a la siguiente:Este es una implementación en pseudocódigo el cual representa el comportamiento de esta estrategia de búsqueda.

POR BÚSQUEDA EN PROFUNDIDAD.Es un algoritmo que permite recorrer todos los nodos de un grafo o árbol de manera ordenada, pero no uniforme. Su funcionamiento consiste en ir expandiendo todos y cada uno de los nodos que va localizando, de forma recurrente, en un camino concreto. Cuando ya no quedan más nodos que visitar en dicho camino, regresa (Backtracking), de modo que repite el mismo proceso con cada uno de los hermanos del nodo ya procesado.

ÁRBOLES DE EXPANSIÓN MÍNIMO.Árbol de máximo alcance cuyo valor es mínimo, es decir, la suma de sus aristas es mínima.

POR ALGORITMO DE PRIM.Permite hallar el árbol minimal de cualquier grafo valorado (con capacidades). Hay

Page 25: UNIDAD 6 - Mate Discretas

que seguir los siguientes pasos:   * Se marca un nodo cualquiera, será el nodo de partida.   * Seleccionamos la arista de menor valor incidente en el nodo marcado anteriormente, y marcamos el otro nodo en el que incide.   * Repetir el paso 2 siempre que la arista elegida enlace un nodo marcado y otro que no lo esté.   * El proceso termina cuando tenemos todos los nodos del grafo marcados.

POR ALGORITMO DE KRUSKAL.    Permite hallar el árbol minimal de cualquier grafo valorado (con capacidades). Hay que seguir los siguientes pasos:   * Se marca la arista con menor valor. Si hay más de una, se elige cualquiera de ellas.   * De las aristas restantes, se marca la que tenga menor valor, si hay más de una, se elige cualquiera de ellas.   * Repetir el paso 2 siempre que la arista elegida no forme un ciclo con las ya marcadas.  * El proceso termina cuando tenemostodos los nodos del grafo en alguna de las aristas marcadas, es decir, cuando tenemos marcados n-1 arcos, siendo n el número de nodos del grafo.

6.4.5.- RECORRIDO DE UN ÁRBOL.

Los árboles ordenados con raíz se utilizan frecuentemente para almacenar la información, necesitamos procedimientos (algoritmos de recorrido de un árbol) que permitan visitar cada uno de los vértices para acceder a los datos.Los 3 algoritmos de recorrido de un árbol más conocidos son:  * Recorrido en preorden.  * Recorrido en inorden.  * Recorrido en postorden.

EN PREORDEN: Si lo recorremos en preorden, la raíz del árbol es visitada primero y luego los subárboles son procesados de izquierda a derecha en preorden.

EN INORDEN: Se comienza recorriendo el árbol izquierdo en orden simétrico, luego se visita la raíz y a continuación los restantes subárboles son procesados de izquierda a derecha en orden simétrico.

EN POSTORDEN: En este caso la raíz es visitada al final, después que todos los

Page 26: UNIDAD 6 - Mate Discretas

subárboles han sido procesados de izquierda a derecha en postorden.

6.5 REDES. (TEOREMA DE FLUJO MÁXIMO, TEOREMA DE FLUJO MÍNIMO, PAREOS Y REDES DE PETRI)

Una Red de Transporte es una gráfica dirigida, simple, con pesos y que debe cumplir las siguientes:

Poseer una fuente o vértice fijo que no tiene aristas de entrada.

Poseer un sumidero o vértice fijo que no tiene arista de salida

El peso Cij de la arista dirigida de i a j llamado capacidad de “ij” es un número no negativo.

Ejemplo de una red que parte de un punto a que es un Muelle y llega a un punto z que es una refinería.

Teorema de flujo máximo.

Siendo G una red de trasporte, un flujo máximo es un flujo con valor máximo. En general, habrá varias flujos con el mismo valor máximo. La idea es sencilla: comenzar con cierto flujo inicial e incrementar de forma iterativa hasta que no pueda mejorarse más. El flujo resultante será el máximo.Para aumentar el valor de un flujo dado, debemos determinar un camino de la fuente al sumidero e incrementar el flujo a lo largo de ese camino.

Teorema del flujo mínimo.

En lo que respecta a las redes, un corte es un conjunto de corte en el

cual quedan dos partes disjuntas del conjunto de vértices, V1 y V2 que, situados en

la red, dejan la fuente en una de ellas y al sumidero en la otra.

Page 27: UNIDAD 6 - Mate Discretas

Redes de Petri

Una red de Petri es un grafo orientado con dos tipos de nodos: lugares (representados mediante circunferencias) y transiciones (representadas por segmentos rectos verticales). Los lugares y las transiciones se unen mediante arcos o flechas.

Un arco une siempre lugares con transiciones y nunca dos lugares o dos transiciones.

Una transición puede ser destino de varios lugares y un lugar puede ser el destino de varias transiciones.

Una transición puede ser origen de varios lugares y un lugar puede ser origen de varias transiciones.

Los lugares pueden presentar marcas (una marca se representa mediante un punto en el interior del círculo).Cada lugar tiene asociada una acción o salida.

Los lugares que contiene marcas se consideran lugares activos.

Cuando un lugar está activo sus salidas están a uno.

A las transiciones se les asocia eventos (funciones lógicas de las variables de entrada).

Page 28: UNIDAD 6 - Mate Discretas

Una transición se dice que está sensibilizada cuando todos su lugares origen están marcados.

Cuando ocurre un evento asociado a una transición (la función lógica se hace uno), se dice que la transición está validada.

6.6 APLICACIONES DE GRAFOS Y ARBOLES

6.6.- Aplicación de grafos y arboles

Aplicaciones de grafos

Gracias a la teoría de grafos se pueden resolver diversos problemas como por ejemplo la síntesis de circuitos secuenciales, contadores o sistemas de apertura. Se utiliza para diferentes áreas por ejemplo, Dibujo computacional, en toda las áreas de Ingeniería.

Los grafos se utilizan también para modelar trayectos como el de una línea de autobús a través de las calles de una ciudad, en el que podemos obtener caminos óptimos para el trayecto aplicando diversos algoritmos como puede ser el algoritmo de Floyd.

Para la administración de proyectos, utilizamos técnicas como PERT en las que se modelan los mismos utilizando grafos y optimizando los tiempos para concretar los mismos.

La teoría de grafos también ha servido de inspiración para las ciencias sociales, en especial para desarrollar un concepto no metafórico de red social que sustituye los nodos por los actores sociales y verifica la posición, centralidad e importancia de cada actor dentro de la red. Esta medida permite cuantificar y abstraer relaciones complejas, de manera que la estructura social puede representarse gráficamente. Por ejemplo, una red social puede representar la estructura de poder dentro de una sociedad al identificar los vínculos (aristas), su dirección e intensidad y da idea de la manera en que el poder se transmite y a quiénes.

Los grafos son importantes en el estudio de la biología y hábitat. El vértice representa un hábitat y las aristas (o "edges" en inglés) representa los senderos

Page 29: UNIDAD 6 - Mate Discretas

de los animales o las migraciónes. Con esta información, los científicos pueden entender cómo esto puede cambiar o afectar a las especies en su hábitat.

Aplicaciones de árboles.

Un árbol binario es una estructura de datos útil cuando se trata de hacer modelos de procesos en donde se requiere tomar decisiones en uno de dos sentidos en cada parte del proceso. Por ejemplo, supongamos que tenemos un arreglo en donde queremos encontrar todos los duplicados. Esta situación es bastante útil en el manejo de las bases de datos, para evitar un problema que se llama redundancia.

Una manera de encontrar los elementos duplicados en un arreglo es recorrer todo el arreglo y comparar con cada uno de los elementos del arreglo. Esto implica que si el arreglo tiene   elementos, se deben hacer  comparaciones, claro, no es mucho problema si   es un número pequeño, pero el problema se va complicando más a medida que   aumenta.

Si usamos un árbol binario, el número de comparaciones se reduce bastante, veamos cómo.

El primer número del arreglo se coloca en la raíz del árbol (como en este ejemplo siempre vamos a trabajar con árboles binarios, simplemente diremos árbol, para referirnos a un árbol binario) con sus subárboles izquierdo y derecho vacíos. Luego, cada elemento del arreglo se compara son la información del nodo raíz y se crean los nuevos hijos con el siguiente criterio:

Si el elemento del arreglo es igual que la información del nodo raíz, entonces notificar duplicidad.

Si el elemento del arreglo es menor que la información del nodo raíz, entonces se crea un hijo izquierdo.

Si el elemento del arreglo es mayor que la información del nodo raíz, entonces se crea un hijo derecho.

Una vez que ya está creado el árbol, se pueden buscar los elementos repetidos. Si x el elemento buscado, se debe recorrer el árbol del siguiente modo:

Sea k la información del nodo actual p. Si   entonces cambiar el nodo actual a right(p), en caso contrario, en caso de que   informar una ocurrencia

duplicada y en caso de que   cambiar el nodo actual a left(p).

Page 30: UNIDAD 6 - Mate Discretas

Para saber el contenido de todos los nodos en un árbol es necesario recorrer el árbol. Esto es debido a que solo tenemos conocimiento del contenido de la dirección de un nodo a la vez. Al recorrer el árbol es necesario tener la dirección de cada nodo, no necesariamente todos al mismo tiempo, de hecho normalmente se tiene la dirección de uno o dos nodos a la vez; de manera que cuando se tiene la dirección de un nodo, se dice que sevisita ese nodo.

Aunque hay un orden preestablecido (la enumeración de los nodos) no siempre es bueno recorrer el árbol en ese orden, porque el manejo de los apuntadores se vuelve más complejo. En su lugar se han adoptado tres criterios principales para recorrer un árbol binario, sin que de omita cualquier otro criterio diferente.

Los tres criterios principales para recorrer un árbol binario y visitar todos sus nodos son, recorrer el árbol en:

preorden:

Se ejecutan las operaciones:

1. Visitar la raíz2. recorrer el subárbol izquierdo en preorden3. recorrer el subárbol derecho en preorden

entreorden:Se ejecutan las operaciones:

1. recorrer el subárbol izquierdo en entreorden2. Visitar la raíz3. recorrer el subárbol derecho en entreorden

Page 31: UNIDAD 6 - Mate Discretas

postorden:Se ejecutan las operaciones:

1. recorrer el subárbol izquierdo en postorden2. recorrer el subárbol derecho en postorden3. Visitar la raíz

Al considerar el árbol binario que se muestra en la figura 28 usando cada uno de los tres criterios para recorrer el árbol se tienen las siguientes secuencias de nodos:

En preorden: 

En entreorden: 

En postorden: 

Para ordenar los elementos de un arreglo en sentido ascendente, se debe construir un árbol similar al árbol binario de búsqueda, pero sin omitir las coincidencias.

El arreglo usado para crear el árbol binario de búsqueda fue

<14,15,4,9,7,18,3,5,16,4,20,17,9,14,5>