Documentos de Académico
Documentos de Profesional
Documentos de Cultura
NDICE
2.1 Definiciones bsicas: grafos y rboles 2.2 Representaciones de rboles y grafos 2.3 Algoritmos de recorrido de rboles binarios 2.4 Algoritmos de recorrido de grafos 2.5 Ordenacin topolgica
AD3
BIBLIOGRAFA
l
T.H. Cormen, C.E. Leiserson, R.L. Rivest Introduction to Algorithms. MIT Press, 1990. Captulos 5 y 23. Aho A.V., Hopcroft J.E., Ullman J.E. Estructuras de datos y Algoritmos. Addison-Wesley, 1988. Captulos 6 y 7.
AD3
1. DEFINICIONES BSICAS
l
Un grafo permite representar relaciones binarias entre los elementos de un conjunto. Ejemplo: mapa de carreteras.
25 30 21 23 39 49 25 18 35
AD3
Definiciones bsicas
l l l l l l l l
Grafos dirigidos y no dirigidos Relaciones de incidencia y adyacencia Caminos Subgrafos Conectividad Grafos etiquetados rboles Relaciones entre nodos de un rbol
AD3
Grafos Dirigidos
Un grafo dirigido (g.d.) es un par G=(V,E)
nV
es un conjunto finito de vrtices n E es un conjunto de arcos (o aristas). Un arco es un par ordenado(u,v) con u,vV
1 4 2 5 3 6
AD3
Grafos no dirigidos
l
es un conjunto finito de vrtices n E es un conjunto de arcos. Un arco es un par NO ordenado (u,v) con u,vV, uv
1 4 2 5 3 6
AD3 7
V={1,2,3,4,5,6} E={(1,2),(1,5),(2,5),(3,6)}
Sea G=(V,E) un grafo dirigido. Si (u,v)E, decimos que incide desde u (sale de..) e incide en v (llega a..).
Ejemplo: vrtice 2
1 4
2 5
3 6
AD3 8
1 4
2 5
AD3
3 6
9
2 es adyacente a 1 1 NO es adyacente a 2 1 4 2 5 3 6
2 5
3 6
10
1 4
2 5
3 6
El grado de 2 es 2
AD3 11
El grado de un vrtice en un g.d. es el n de arcos que salen de l (grado de salida) ms el n de arcos que entran (grado de entrada).
1 4 2 5 3 6
Caminos
Un camino de longitud k desde u a u en un grafo G=(V,E) es una secuencia de vrtices v0,v1,..,vk tal que vo=u y vk=u y i:1..k:(vi-1,vi)E. La longitud del camino es el nmero de arcos. l Si hay un camino P desde u hasta u, decimos que u es alcanzable desde u via P.
l
AD3
14
Caminos (cont.)
l
Caminos (cont.)
l
En un g.d. un camino <v0,v1,..,vk> forma un ciclo si v0=vk y el camino contiene al menos un arco.
n El ciclo es simple si los vrtices son n Un bucle es un ciclo de longitud 1
distintos
1 4
2 5
AD3
3 <1,2,5,4> es un ciclo 6
16
Caminos (cont.)
En un g.n.d. un camino <v0,v1,..,vk> forma un ciclo si v0=vk y los vi son distintos. l Un grafo sin ciclos diremos que es acclico
l
AD3
17
Subgrafos
l
Un grafo G=(V,E) es un subgrafo de G=(V,E) si VV y EE. l Dado un conjunto VV, el subgrafo de G inducido por V es G=(V,E):E={(u,v)E:u,vV}
Ejemplo: subgrafo inducido por {1,2,3,6}
1 4 2 5 3 6
AD3
3 6
18
Grafos etiquetados
Un grafo etiquetado es un grafo G=(V,E) sobre el que se define una funcin f:E>A, donde A es un conjunto cuyas componentes se llaman etiquetas. l Un grafo ponderado es un grafo etiquetado con nmeros reales (A)
l
AD3
19
Conectividad de un grafo
l
Un g.n.d. es conexo si cualquier par de vrtices estn conectados por un camino. Las componentes conexas de un grafo son las clases de equivalencia en V definidas por la relacin es alcanzable desde..
1 4 2 5
AD3
3 6
20
rboles
Un bosque es un grafo acclico no dirigido. l Un grafo acclico, no dirigido y conexo es un rbol (libre).
l
(a) rbol
(b) Bosque
AD3
(c) Grafo
21
rboles
l
G es un rbol (libre) Cualquier par de vrtices en G estn conectados por un nico camino simple G es conexo y |E|=|V|-1 G es acclico pero si aadimos un arco a E, el grafo resultante contiene un ciclo
10 12 11 1
4 2
4 a 8
b 11 h 7
8 7 c d 9 2 i e 4 14 g f 10
Peso total=37
AD3
24
Si (y,x) es el ltimo arco en el camino desde la raz r del rbol T hasta el nodo x,
ny
es el padre de x y n x es hijo de y.
La raz es el nico nodo en T que no tiene padre. l Si dos nodos tienen el mismo padre son hermanos
l
AD3
25
10 11
4 2
Altura de un rbol
l
Se llama profundidad de un nodo a la longitud del camino desde la raz a ese nodo. l La altura de un rbol es la profundidad del nodo ms profundo.
7 3
Altura=4 Profundidad 0
10 12 11 1
4 2
8 6 9 5
AD3
27
rboles de Posicin
l
En un rbol de posicin los hijos de cada nodo estn etiquetados con un entero positivo. El hijo -simo de un nodo no existe si no hay ningn hijo etiquetado con i. Un rbol k-ario es un rbol de posicin en el que todos los nodos tienen hijos etiquetados con valores menores o iguales a k.
AD3 28
rboles binarios
Un rbol binario es un rbol k-ario con k=2. Ejemplos:
3 2 4 6
AD3
3 7 2 4 6
29
7 1 5 Hijo derecho
5 Hijo izquierdo
rboles completos
l
Un rbol k-ario se dice que es completo si todas las hojas tienen la misma profundidad y todos los nodos internos tienen grado k.
Altura=3 Kh hojas (kh-1)/(k-1) internos
Cuntas hojas tiene un rbol k-ario completo de altura h? Cuntos nodos internos?
AD3 30
rboles
n Hijo
ms a la izquierda-hermano derecha n vector de k hijos para cada nodo n hijo izqdo e hijo dcho para cada nodo si k=2 (rbol binario)
AD3
31
Padre Clave
AD3
32
B nil
C nil
D nil
E nil nil
F nil
AD3
33
REPRESENTACIN DE GRAFOS
l
Listas de Adyacencia: Un grafo G=(V,E) se representa como un vector de listas de vrtices indexado por vrtices (G: vector[V] de V). G[v] es una lista de los vrtices emergentes y/o incidentes de/a vV.
n Memoria:
Matriz de Adyacencias: Un grafo G=(V,E) se representa como una matriz G: matriz[V,V] de booleanos. La componente G[u,v] es 1 si (u,v)E, sino G[u,v]=0.
O(|V|2) n Tiempo de acceso: O(1)
n Memoria:
AD3
35
AD3
36
Hijo-izq(i)=2*i Hijo-der(i)=2*i+1
AD3 37
D nil
F nil
AD3
F nil nil
38
REPRESENTACIN ENLAZADA tipo elemento= ...; nodoptr= nodotipo; nodotipo= tupla info:elemento; izq,der:nodoptr; ftupla arbol-binario=nodoptr ftipo Es, normalmente, la representacin escogida (sobre todo para rboles no llenos)
AD3 39
procedimiento creaAB (e/s a:arbol-binario) a:=nil fprocedimiento funcion esvacioAB (a:arbol-binario) devuelve logico devuelve (a=nil) ffuncion funcion raizAB (a:arbol-binario) devuelve elemento devuelve a.info ffuncion funcion izqAB (a:arbol-binario) devuelve nodoptr devuelve a.izq ffuncion
3. ALGORITMOS DE RECORRIDO DE ARBOLES BINARIOS Recorrido de un rbol: visita de cada elemento del rbol 1 sla vez. Recorrido en amplitud (por niveles) Recorrido en profundidad: Inorden Preorden Postorden
AD3
41
abcdefg
d e f
RID= a b d c e g f
AD3
42
PREORDEN = RID Visitar la raz Recorrer en preorden el subrbol izquierdo Recorrer en preorden el subrbol derecho
procedimiento preorden (a:arbol-binario) Si no esvacioAB(a) entonces proceso(raizAB(a)); preorden(izqAB(a)); preorden(derAB(a)) fsi fprocedimiento
AD3
43
INORDEN = IRD Recorrer en inorden el subrbol izquierdo Visitar la raz Recorrer en inorden el subrbol derecho
procedimiento inorden (a:arbol-binario) Si no esvacioAB(a) entonces inorden(izqAB(a)); proceso(raizAB(a)); inorden(derAB(a)) fsi fprocedimiento
AD3
44
POSTORDEN = IDR Recorrer en postorden el subrbol izquierdo Recorrer en postorden el subrbol derecho Visitar la raz procedimiento postorden (a:arbol-binario) Si no esvacioAB(a) entonces postorden(izqAB(a)); postorden(derAB(a)); proceso(raizAB(a)); fsi fprocedimiento
AD3
45
procedimiento postorden_it(a:arbol-binario); var p:pila_arboles; psal:pila_elemento; aux:arbol-binario; crear_pila_arb(p); crear_pila_ele(psal); apilar_arb(p,a); mientras not vacia_arb(p) hacer aux:=tope_arb(p); desapilar_arb(p); si not esvacioAB(aux) entonces apilar_arb(p,izqAB(aux)); apilar_arb(derAB(aux)); apilar_ele(psal,raizAB(aux)); fsi; fmientras mientras not vacia_ele(psal) hacer procesar(tope_ele(psal); desapilar_ele(psal); fmientras;
AD3
procedimiento preorden_it(a:arbol-binario); var p:pila_arboles; aux:arbol-binario; crear_pila_arb(p); apilar_arb(p,a); mientras not vacia_arb(p) hacer aux:=tope_arb(p); desapilar_arb(p); si not esvacioAB(aux) entonces apilar_arb(p,derAB(aux)); apilar_arb(izqAB(aux)); procesar(raizAB(aux)); fsi; fmientras
AD3
funcion altura(a:arbol-binario) devuelve entero; si vacioAB(a) entonces devuelve 0 sino si altura(izqAB(a))>altura(derAB(a) entonces devuelve altura(izqAB(a))+1 sino devuleve altura(derAB(a))+1 fsi fsi; faltura funcion altura(a:arbol-binario) devuelve entero; var h1,h2:entero si vacioAB(a) entonces devuelve 0 sino h1:= altura(izqAB(a)) h2:= altura(derAB(a)) si h1>h2 entonces devuelve h1+1 sino devuleve h2+1 fsi fsi; faltura
AD3
/* los vertices estn numerados 1..n */ tipo grafo_mat= vector[1..n,1..n] de {1,0} list=lista de enteros grafo_list_ady= vector[1..n] de lista; var gmat:grafo_mat; glist:grafo_list_ady para v:=1 hasta n hacer glist[v]:=listavacia; fpara para v:=1 hasta n hacer para w:=1 hasta n hacer si gmat[v,w]=1 entonces aadir(glist[v],w); fpara fpara
AD3
tipo vector_sal= vector [1..n] de enteros var global R:vector_sal; n: entero; funcin Rec_profundidad (G:grafo) devuelve vector_sal n:=0; para v:=1 hasta nvertices hacer R[v]:=0 fpara; /*vV R[v]:=0 */ para v:=1 hasta nvertices hacer si R[v]:=0 entonces DFS(v) fsi fpara devuelve R; fRec_profundidad algoritmo DFS(v:entero); /*Depth first search */ n:=n+1; R[v]:=n; wadyacentes(v) hacer si R[w]=0 entonces DFS(w) fsi f fDFS
AD3
Recorrido en profundidad
AD3
51
tipo vector_sal= vector [1..n] de enteros var global R:vector_sal; n: entero; Q: cola de enteros funcin Rec_anchura (G:grafo) devuelve vector_sal n:=0; creaq(Q); para v:=1 hasta nvertices hacer R[v]:=0 fpara; /*vV R[v]:=0 */ para v:=1 hasta nvertices hacer si R[v]:=0 entonces BFS(v) fsi fpara devuelveR; fRec_profundidad algoritmo BFS(v:entero); /*Breadth first search */ n:=n+1; R[v]:=n; encolar(Q,v); mientras not vacia(Q) hacer u:=cabeza(Q); descabezar(Q); wadyacentes(u) hacer si R[w]=0 entonces n:=n+1; R[u]:=n; encolar(Q,w) fsi f fmientras fDFS
AD3
Recorrido en anchura
AD3
53
AD3
55