Download 5. Estructuras no lineales estáticas y dinámicas

Document related concepts

Árbol binario wikipedia , lookup

Recorrido de árboles wikipedia , lookup

Árbol binario de búsqueda wikipedia , lookup

Árbol (informática) wikipedia , lookup

Rotación de árboles wikipedia , lookup

Transcript
5. Estructuras no lineales
estáticas y dinámicas
Dra. María Lucía Barrón Estrada
1.
Conceptos de árbol
1.
2.
2.
Operaciones básicas sobre árboles binarios
1.
2.
3.
4.
3.
Creación
Inserción, eliminación y búsqueda
Recorridos sistemáticos
Balanceo
Conceptos de grafos
1.
2.
3.
4.
Árboles binarios
Árboles generales
Grafos simples
Grafos dirigidos
Representación de grafos
Operaciones básicas sobre grafos
1.
2.
3.
Creación
Inserción, eliminación y búsqueda
El camino mas corto
Conceptos de Árboles
•
•
•
Un árbol es una estructura de datos no lineal que
representa una relación jerárquica de sus
elementos.
Los árboles se utilizan para representar
información ordenada, relaciones estructurales y
para modelar situaciones que se expresan en
términos de jerarquías.
Tipos de árboles
–
–
–
–
Generales
Binarios
Binarios de búsqueda
AVL, Rojo y Negro, B+, etc.
Árboles binarios
• Un árbol binario T es un conjunto finito de elementos
llamados nodos, tal que:
– T es vacío (árbol nulo o vacío): No contiene elementos.
– T contiene un nodo llamado Raíz de T y los nodos
restantes de T forman un par ordenado de árboles
binarios disjuntos T1 y T2.
raíz
Subárbol 5
izquierdo
Subárbol
derecho
1
5
1
Si T contiene una raíz R los 2 árboles T1 y T2 se llaman
respectivamente subárbol izquierdo y derecho de la raíz R.
Ejemplo de estructuras que NO
son árboles binarios
+
+
*
/
12
2
4
*
/
1
12
2
4
5
1
TERMINOLOGIA DE ÁRBOLES
•
•
•
•
•
•
•
•
Hijo: Nodo que desciende de otro nodo.
Padre: Nodo que tiene hijos (descendientes).
Raíz: Único nodo que no tiene padre y tiene nivel 0.
Hoja (Terminal): Nodo que sus árboles izquierdo y
derecho están vacíos.
Camino: Un camino entre dos elementos e1 y e2 de
un árbol binario es una secuencia <x1,x2,..,xn> donde
x1 es e1 y xn es e2 y cada elemento xi es padre de xi+1.
La longitud de un camino <x1,x2,..,xn> es n-1
Rama: Camino que termina en una hoja.
Subárbol: es un árbol que depende de otro árbol.
• Arista: Línea que une a 2 nodos.
• Nivel: Es el número de aristas entre ese nodo y la
raíz.
• Profundidad (Altura): Máximo número de nodos de
una rama desde la raíz ( Máximo Nivel + 1 ).
• Generación: Todos los nodos que tienen el mismo
número de nivel.
• Ancestro de X: Cualquier nodo del cuál X es
descendiente.
• Descendiente de X: Cualquier nodo que se encuentre
en el subárbol donde X es raíz.
• Peso: es el numero de elementos de un árbol.
• Número de Sucesores de cualquier nodo en un árbol
binario = 0, 1, 2.
Ejemplo de Árbol y Sus Componentes.
raíz
Nivel 0
Pedro
Subárbol derecho de Pedro
Juan
arista
Ana
Nivel 1
Maria
Raúl
Silvia
Tito
Eli
Sofía
hermanos
hoja
Nivel 2
Ancestro?
Descendiente?
# de nodos?
Altura?
Generación?
• Árboles Similares: Son aquellos que tienen la
misma estructura.
• Árboles Copia: Aquellos que son similares y
tienen el mismo contenido en sus correspondientes
nodos.
Árbol A1
Árbol A2
*
A
B
D
Árbol A3
*
C
G
A1 similar a A2
4
A
5
3
B
D
C
G
A3 copia de A1
Aplicaciones de árboles
Estatuto if de un LP
Aplicaciones de árboles
12/4*2 + (5-1)
(a-b)/((c*d)+e)
+
/
*
/
12
2
4
-
5
1
a
+
b
*
c
e
d
Representación Gráfica de AB
1) Diagrama de Venn
3) Grafo no dirigido
2) Notación Decimal Dewey
4)Notación Identada
1A
1.1B
1.1.1D
1.1.1.1H
1.1.2E
1. 2C
1.2.1 F
1.2.1.1I
1.2.1.2 J
1.2.2G
5) Anidación de paréntesis
( A ( B ( D ( H ),E ), C ( F ( I, J), G ) ) )
Árbol Binario de Búsqueda
Un árbol binario de búsqueda (ABB) es un árbol binario creado
de manera especial para facilitar la localización de sus
elementos.
Se pueden realizar eficientemente operaciones de:
• Inserción
• Eliminación
• Búsqueda
• Recorrido
Un ABB cumple con las siguientes reglas para todo nodo T del
árbol:
• Todos los valores de los nodos del subárbol izquierdo son
menor o igual al valor del nodo T.
• Todo los valores de los nodos del subárbol derecho son mayor
o igual al valor del nodo T.
Inserción en un Árbol Binario de Búsqueda.
• Si el árbol esta vacío, el elemento se inserta en la
raíz.
• Si el árbol no esta vacío el elemento se compara
con la raíz si es menor se inserta en el subárbol
izquierdo, si es mayor se inserta en el subárbol
derecho.
El proceso de insertar un elemento es recursivo, ya
que la inserción en el subárbol izquierdo o
derecho sigue la misma filosofía.
Insertar elementos
raíz
45
23
2
65
38
7
52
48
96
Insertar 45
Insertar 23
Insertar 2
Insertar 7
Insertar 65
Insertar 38
Insertar 96
Insertar 52
Insertar 48
Eliminación de un Árbol Binario de
Búsqueda.
Casos: N- Nodo a eliminar:
•
Si N es hoja (no tiene hijos) entonces N se elimina haciendo
nulo el enlace del padre de N hacia N.
•
Si N tiene exactamente un hijo, N se elimina reemplazando
el enlace del padre de N con el enlace del hijo de N.
•
Si N tiene 2 hijos, sustituir por el nodo que se encuentra
mas a la izquierda en el subárbol derecho de N o por el
nodo que esta mas a la derecha en el subárbol izquierdo.
Eliminación de un Árbol BB.
raíz 45
23
65
2 38 52 96
Caso 1: Eliminar 48
(enlace padre n = null)
raíz 45
23
2 38 52 96
7 48
raíz 45
23
65
2 38 52 96
7 48
65
7
Caso 2: Eliminar 2
(enlace padre n = enlace hijo n)
raíz 45
23
65
7 38 52 96
48
Eliminación de un Árbol BB.
raíz 45
23
65
2 38 52 96
Caso 3: Eliminar 65
(sustituir nodo por uno de:
nodo +Izq de subárbol derecho
nodo +Der de subárbol izquierdo )
7 48
raíz 45
raíz 45
23
52
2 38 48 96
7
23
96
2 38 52
7 48
Árboles Binarios
• Cuales son los elementos necesarios para
definir un árbol binario?
• Cuales son las operaciones asociadas a un árbol
binario?
• Será posible usar la misma implementación de
las operaciones para todas las aplicaciones?
Interfase de un árbol binario
public interface IBinaryTree {
public boolean buscar(int d);
public void insertar(int d);
public int tamaño();
public void remover(int d);
public boolean vacio();
…
// recorridos
public void inorden();
public void postorden();
public void preorden();
…
}
public class SBinaryTree implements IBinaryTree{
private Nodo raiz;
// constructor para un arbol vacio
public void BinaryTree() {
raiz = null;
}
public
public
public
public
public
boolean busca(int d) {…}
void inserta(int d) {…}
int tamaño() {..}
void remover(int d){…}
boolean vacio(){…}
// recorridos
public void inorden(){…}
public void postorden(){…}
public void preorden(){…}
…
}
class Nodo {
Nodo izquierdo;
Nodo derecho;
int dato;
Nodo(int d) {
izquierdo = null;
derecho = null;
dato = d;
}
}
Implementación usando recursión
• Los árboles binarios son estructuras definidas
recursivamente con dos reglas:
– Una raíz nula
– Una raíz no nula que contiene dos subárboles que a
su vez son también árboles binarios.
• Cual es el caso base?
• Como se podría definir el progreso de los
métodos?
Implementación usando recursión
• Las operaciones sobre un árbol inician siempre en
la raíz.
• Pero, el campo raíz de la clase esta declarado
como privado, lo que indica que no esta
disponible fuera de la clase.
• Los métodos de la interfase sirven para establecer
la forma de ejecución para los usuarios de la clase.
• En la clase se pueden definir métodos recursivos
que inicien el procesamiento desde la raíz.
Buscar un elemento en un ABB
// método para el usuario
public boolean busca(int d) {
return busca(raiz, d);
}
// metodo auxiliar para el procesamiento
private boolean busca(Nodo nodo, int d) {
if (nodo==null)
return false;
if (d==nodo.dato)
return true;
else
if (d<nodo.dato)
return busca(nodo.izquierdo, d);
else
return busca(nodo.derecho, d);
}
Obtener el número de elementos
// método para el usuario
public int tamaño(){
return tamaño(raiz);
}
// metodo auxiliar para el procesamiento
private int tamaño(Nodo raiz){
if (raiz == null)
return 0;
else
return 1+ tamaño(raiz.izquierdo)+ tamaño(raiz.derecho);
}
Insertar elementos en un ABB
public void insertar(int n){
raiz = insertar(raiz, n);
}
//método auxiliar
private Nodo insertar(Nodo r, int n){
if (r == null)
r = new Nodo(n);
else
if (n<=r.dato)
r.izquierda = insertar(r.izquierda, n);
else
r.derecha = insertar(r.derecha, n);
return r;
}
Recorridos de un AB
• Inorden = 2,7,23,38,45,48,52,65,96
raíz
45
23
2
38
7
– Visitar el subarbol izquieredo en inorden
– Visitar el nodo raiz
– Visitar el subarbol derecho en inorden
65
52
48
96
• Preorden= 45,23,2,7,38,65,52,48,96
– Visitar el nodo raiz
– Visitar el subarbol izquieredo en preorden
– Visitar el subarbol derecho en preorden
• Postorden= 7,2,38,23,48,52,96,65,45
– Visitar el subarbol izquieredo en postorden
– Visitar el subarbol derecho en postorden
– Visitar el nodo raiz
Recorridos de un AB
raíz
• Inorden = D,G,B,A,H,E,I,C,F
A
B
C
D
F
E
G
– Visitar el subarbol izquieredo en inorden
– Visitar el nodo raiz
– Visitar el subarbol derecho en inorden
H
I
• Preorden= A,B,D,G,C,E,H,I,F
– Visitar el nodo raiz
– Visitar el subarbol izquieredo en preorden
– Visitar el subarbol derecho en preorden
• Postorden= G,D,B,H,I,E,F,C,A
– Visitar el subarbol izquieredo en postorden
– Visitar el subarbol derecho en postorden
– Visitar el nodo raiz
Implementación de Inorden
public void inorden(){
inorden(raiz);
System.out.println();
}
public void inorden(Nodo r){
if (r!=null) {
inorden(r.izquierda);
System.out.print (r.dato+" ");
inorden(r.derecha);
}
}
Implementación de Preorden
public void preorden(Nodo r){
if (r!=null) {
System.out.print (r.dato+" ");
preorden(r.izquierda);
preorden(r.derecha);
}
}
public void preorden(){
preorden(raiz);
System.out.println();
}
Implementación de Postorden
public void postorden(){
postorden(raiz);
System.out.println();
}
public void postorden(Nodo r){
if (r!=null) {
postorden(r. izquierda);
postorden(r.derecha);
System.out.print (r.info+" ");
}
}
Ejercicios para ABB
• Escribe un método que regrese el número de hijos de n
• Escribe un método que obtenga el padre de n
• Escribe un método que obtenga para cada nodo su balance
(#nodos subárbol izquierdo - #nodos subárbol derecho)
• Escribe un método para Obtener los nodos de una generación
• Escribe un método para Buscar el elemento mayor de un árbol
binario
• Escribe un método para encontrar el promedio de los
elementos de un árbol que contiene datos enteros.
Arboles Generales
Un árbol general, es un conjunto finito no vacío
T de elementos llamados nodos, tales que:
1. T contiene un elemento R, llamado Raíz de T.
2. Los restantes elementos de T forman una
colección ordenada de 0 o más a árboles
disjuntos T1, T2, … Tm.
Los árboles T1,T2,…Tm son llamados subárboles
de R.
Árboles binarios Vs Generales:
Un AB puede estar vacío y el AG no.
En un AB un nodo distingue entre sus hijos como
izquierdo y derecho; en un AG no hay distinción para
hijos.
Ejemplo: Suponer que existen 2 árboles:
A
A
•Si los 2 son AB son diferentes.
C
B
•Si los 2 son AG son iguales.
B
D
C
D
Árboles Generales
Terminología:
•
Padre: Nodo del cual dependen otros nodos.
•
Hijo: Nodo sucesor de otro nodo.
•
Grado de un árbol: Máximo número de sucesores de
un nodo.
•
Hermanos: Nodos con el mismo padre.
•
Generación: Todos los nodos de un mismo nivel.
•
Bosque: es una colección de 0 o mas árboles
distintos.
Bosque:
Es una colección de 0 o más árboles distintos.
Ejemplo:
Si se elimina la raíz R de un árbol general T se
obtiene un bosque que consiste en los subárboles de
R.
A
B
E
M
F
G
N
H
C
D
I
J
K
L
Conversión de un árbol en
bosque
Arbol 1
Arbol 2
B
E
M
F
G
N
H
Arbol 3
C
D
I
J
K
L
Conversión de Árboles Generales a Árboles
Binarios.
1.-Enlazar los hijos de cada nodo de forma horizontal de
izquierda a derecha.
2.-Enlazar de forma vertical el nodo padre con el hijo que se
encuentra mas a la izquierda.
3.-Eliminar los vínculos viejos entre hijos y padres.
4.-Rotar el diagrama 45º.
B
C
A
A
A
D
B
C
D
B
C
A
D
B
C
D
Raiz
A
Ejemplo 2.
B
Raiz
D
I
A
C
G
E
H
B
D
I
E
C
F
J
G
K
F
H
L
X
L
J
K
X
Convertir un bosque a AB:
1) Enlazar en forma horizontal las raíces de los distintos
árboles generales.
2) Enlazar los hijos de cada nodo en forma horizontal.
3) Enlazar en forma vertical el nodo padre con el hijo mas a
la izquierda.
4) Eliminar los vínculos del padre con los hijos.
5) Rotar el diagrama resultante.
Arbol 1
Arbol 2
C
B
F
E
M
G
N
H
I
Arbol 3
D
J
K
L
Arbol 1
Arbol 2
B
F
E
M
Arbol 3
C
G
H
I
N
J
K
Arbol General
B
E
D
C
F
G
M
N
D
I
H
J
K
L
L
Convertir un bosque a AB:
H
A
B
E
D
C
F
I
G
K
P
J
L
Q
M
R
S
T
U
X
A
AB:
B
E
H
I
C
J
D
F
P
Q
K
G
T
L
R
J
M
S
X
Representación en memoria de
Árboles generales.
• Los hijos de un nodo se pueden representar de
diversas formas:
– Cada nodo contiene un campo de liga para cada
hijo.
– Cada nodo contiene un arreglo de hijos.
– Cada nodo contiene un vector de hijos.
– Cada nodo contiene una lista de hijos.
Representación gráfica
Cada nodo contiene un
arreglo o vector de hijos
Cada nodo contiene un
campo de liga para
cada hijo.
Info
Info
h1 h2 ...
hijos
hn
Cada nodo contiene
una lista de hijos
Info
hijos
Info
hijos
Info
hijos
Aplicaciones de árboles generales
•
•
•
•
•
•
Directorio de archivos
Organigrama de una empresa
Contenido de un documento.
Diseño por componentes.
Juegos
Estructuras de un lenguaje de
programación.
Recorridos de un arbol general
• Inorden.
–
–
–
–
–

Recorrer en Inorden T1
Visitar la Raiz
Recorrer en Inorden T2
…
Recorrer en Inorden Tn

Preorden.





Visitar la Raiz
Recorrer en Preorden T1
Recorrer en Preorden T2
…
Recorrer en Preorden Tn
Postorden.





Recorrer en Postorden T1
Visitar la Raiz
Recorrer en Postorden T2
…
Recorrer en Postorden Tn
Otros árboles
• Árboles balanceados
– Por altura (AVL)
– Por peso (perfectamente balanceados)
– Rojinegros
Árboles Balanceados
• Árboles balanceados son aquellos ABB que
cumplen con una condición de equilibrio (que sus
subárboles izquierdo y derecho tengan la misma
profundidad)
• Los árboles balanceados optimizan la búsqueda de
elementos.
• Árboles AVL (1962- Adelson, Velskii y Landis) la
altura de los subárboles asociados a cada elemento
no pueden diferir en más de 1 y los dos subárboles
son también AVL.
Ejemplos de árboles AVL
Altura = 3
Altura = 2
15
Altura = 1
20
Altura = 1
5
Altura = 1
Altura = 2
30
15
18
Altura = 1
5
Altura = 1
18
Inserción en árboles balanceados
35
Insertar 10,18,27
20
15
10
35
20
25
18
27
40
35
Insertar 37,45
15
40
25
20
40
20
15
25
37
45
Inserción en árboles balanceados
Caso 1.
Las ramas izquierda y derecha del árbol tienen la misma altura.
(HRI = HRD )
35
Caso 1.1 Inserta
elemento en rama
izquierda (RI)
20
40
Caso 1.2 Inserta
elemento en rama
derecha (RD)
35
35
20
15
40
20
40
50
Inserción en árboles balanceados
Caso 2.
Las ramas izquierda y derecha del árbol tienen altura diferente.
(HRI ≠ HRD )
35
Caso 2.1.1 Inserta en RI
Caso 2.1 suponer
HRI < HRD
20
40
50
15
35
Caso 2.1.2 Inserta en RD
20
35
40
20
40
50
50
75
Inserción en árboles balanceados
Caso 2. (continuación)
Las ramas izquierda y derecha del árbol tienen altura diferente.
(HRI ≠ HRD )
35
Caso 2.2.1 Inserta en RI
20
Caso 2.2 suponer
HRI > HRD
15
35
Caso 2.1.2 Inserta en RD
20
15
40
35
20
15
40
50
5
40
Reestructuración
• Factor de equilibrio: Es la
diferencia entre la altura de la rama
derecha y la altura de la rama
izquierda. FE = HRD - HRI
-1
65
1
-1
45
70
0
• Cada nodo tiene asociado un factor
de equilibrio que se calcula para
todos los elementos de la rama
donde se realizó la inserción. Este
se utiliza para saber si el árbol esta
balanceado o debe reestructurarse.
33
-1
54
0
50
0
68
Rotaciones
Caso 1 Rotación simple por la rama izquierda
-2
0
35
padre.fe = -2
hijo.fe = -1
20
-1
20
0
0
15
0
padre.izq = hijo.der
hijo.der = padre
padre = hijo
35
15
Caso 2 Rotación simple por la rama derecha
2
0
35
padre.fe = 2
hijo.fe = 1
padre.der = hijo.izq
hijo.izq = padre
padre = hijo
50
1
0
50
0
75
35
0
75
Rotaciones
Caso 3 Rotación compuesta Derecha Izquierda
p
2
0
35
45
padre.fe = 2
hijo.fe = -1 h
n
-1
0
50
45
0
35
50
0
Caso 4 Rotación compuesta Izquierda Derecha
0
-2
padre.fe = -2
hijo.fe = 1
35
25
1
0
20
20
0
25
0
35
hijo.der = n.izq
n.izq= hijo
padre.izq = n.der
n.der = padre
padre = n
5.3 Grafos
Un grafo es una estructura de datos no lineal que
consta de:
1) Un conjunto finito V de elementos llamados
vértices (Nodos, Puntos).
2) Un conjunto E de aristas tales que cada arista
e ε E esta identificada por un único par
(desordenado) [u,v] de nodos de V denotado
como e = [u,v].
Un grafo se denota como G = (V, E).
NODOS VECINOS O ADYACENTES: Dos nodos son
vecinos si existe una arista que los una.
E = (u, v) los vértices u, v son vecinos.
EL GRADO DE UN NODO U: es el número de
aristas que contienen a u.
NODO AISLADO: Son aquellos nodos que tienen
grado 0.
GRAFO ETIQUETADO: Es un grafo donde cada
arista tiene un valor asignado.
Ejemplo de grafos:
Portland
Chicago
New
York
Los Ángeles
Las Vegas
Miami
V(G)= Los Ángeles, Portland, Chicago, New York, Las Vegas,
Miami.
E(G)={(Los ángeles, Chicago),(Los ángeles, New York),
(Chicago, New York), (Chicago, Las Vegas), (Las vegas, New
York), (Las Vegas, Miami)}
Las aristas no están ordenadas lo que significa que:
( Los Ángeles, Chicago) = ( Chicago, Los Ángeles)
( u1, v2) = (u2, v1)
Grado (Los Ángeles) = 2
Grado (Chicago) = 3
Grado de Portland = 0
Grafo dirigido
Un grafo dirigido es una estructura de datos no lineal
que consta de:
•
Un conjunto finito de elementos llamados vértices.
•
Un conjunto E de aristas con orientación (flechas)
que conectan a 2 nodos.
Portland
Chicago
New York
Los Ángeles
Las Vegas
Miami
Terminología:
Un camino P de longitud n desde U hasta V es una
secuencia de n+1 nodos escrita como: P (V0,V1,…,Vn).
Donde:
•U = V0
•Vi es adyacente a Vi-1 para toda i = 1, 2, …, n
•V = Vn
Bucle: Conexión de un vértice consigo mismo.
Camino Cerrado: Es un camino donde V0 = Vn , el vértice
inicial y el final son el mismo.
Camino Simple: Es aquel donde todos los vértices son
distintos (Solo V0 puede ser = a Vn).
Ciclo: Camino simple cerrado de longitud 3 o mayor.
K-Ciclo: Es un ciclo de longitud K.
Grafo Convexo: Grafo donde existe un camino entre
cualesquiera dos de sus nodos.
Grafo Completo: Un grafo es completo si cada nodo U de
G es adyacente a todos los demás nodos de G.
Multigrafo: Es una generalización de un grafo que:
1) Contiene bucles y /o
2) Contiene aristas múltiples que conectan a los
mismos extremos.
G1
G2
Grafo Completo
G3
Grafo Completo
Dirigido
G4
Máximo Numero De Aristas:
•GRAFO:
Gn = n ( n - 1 )
G3 = 4(3) = 12 = 6
2
2
2
•GRAFO DIRIGIDO:
GDn = n ( n – 1 )
G4 = 4 (3) = 12
G1: CICLO A, B, C, A
•GRAFO ACICLICO: Es un grafo que no contiene ciclos.
(Un árbol es un grafo aciclico).
F
A
E
B
C
D
Un Subgrafo S1 de un grafo G se define como:
V (S1) Є V (G)
E (S1) Є E (G)
S1 es un subconjunto de G si y solo si V (S1) Є V (G) y E
(S1) Є E (G).
Ejemplo:
Grafo G
Subgrafo S1
Subgrafo S2
Subgrafo S3
Grafo débilmente conectado:
Para cada par de vértices (u,v) existe un
camino de u a v tal que vo = u y vn= v y para cada
componente de la ruta (vi, vi+1) existe en E(G) el
componente (vi, vi+1) o (vi+1,vi).
El camino quizá no puede recorrerse debido a la
orientación de sus aristas.
Representación secuencial de grafos:
•Se basa en una matriz de adyacencia.
•Suponga que G es un grafo dirigido simple de m nodos y
que los nodos de G han sido ordenados y llamados V1, V2,
… , Vn. La matriz de adyacencia para G es de tamaño m x
m definiendo cada elemento como:
aij =
1 : si Vi es adyacente a vj. Existe e = (vi, vj)
0 : en caso contrario.
Ejemplo 1:
Y
Z
X
W
V1 = X
V1 V2 V3 V4
X
V2 = Y A = Y
Z
V3 = Z
V4 = W
0 0 0 1 V
1
1 0 1 1 V2
1 0 0
1 V3
W 0 0 1 0
X Y Z W
V4
= A1
Para un grafo no dirigido, la matriz de adyacencia es
una matriz simétrica: ai,j = aj,i
Y
Z
X
W
X Y Z W
X
0 1
1 1
Y
1 0
1 1
Z
1
1 0 2
W 1
1 2 0
Considere las potencias A1, A2, A3 … de la matriz de
adyacencia ak(i,j) = la entrada i,j de la matriz Ak.
A1 – Representa el número de caminos de longitud 1
desde el nodo vi hasta vj.
Ak – Representa el número de caminos de longitud k
desde el nodo vi hasta el nodo vj.
A2=
1 0
1 2
0 0 1 1
1 0 0 1
0 0 0 1
A3=
1 0 2 2
A4=
2 0 2 3
0 0 1 1
1 0
1 1
1 0 1 2
1 0 0 1
0 0 1 1
1 0 1 1
Caminos de long. 2
Caminos de long. 3
Caminos de long. 4
Representación en memoria dinámica:
Un grafo se puede representar con una LISTA DE
ADYACENCIA.
Una lista de adyacencia para un vértice a es una lista
ordenada de todos los vértices adyacentes a a.
• Si el Número de nodos es fijo se pueden almacenar
en un arreglo.
Ejemplo:
a
c
Arreglo de
nodos
b
d
Lista de nodos
adyacentes a
cada nodo.
a
c
b
a
c
d
d
b
b
* Si el número de nodos puede variar, se deben
almacenar en una lista.
Lista de
Nodos
a
b
a
b
b
a
c
d
c
d
d
b
c
Operaciones sobre grafos:
1) Buscar un vértice/arista.
2) Insertar un vértice/arista.
3) Eliminar un vértice/arista.
4) Recorrer el grafo.
5) Número de vértices
6) Vacío.
• Los vértices se mantienen en una lista de vértices.
No pueden existir vertices repetidos.
• Los aristas se mantienen en una lista ordenada
para cada vértice.
Búsqueda de el camino más corto:
Encontrar el camino más corto desde A (nodo inicial)
hasta I (nodo final):
1) Marcar todos los nodos con infinito, y seleccionar nodo inicial
(iniciar con 0) como nodo actual
2) Calcular los caminos del nodo actual a los nodos adyacentes,
reemplazar el camino actual por el nuevo solo si este es menor.
3) Marcar el nodo actual como “visitado”.
4) Seleccionar como nodo actual el nodo con camino de valor
mínimo.
5) Repetir para el nodo actual seleccionado los pasos 2, 3, 4 hasta
llegar al nodo final o hasta agotar todos los nodos.
Ejemplo:
∞ (3,A)
* ∞
2
B
3
5
∞ A
*
4
2
1
3
C
* ∞
(5,A)
∞
D
∞ *
∞ (4,A)
E
∞ (5,A, B)
* ∞
2
G
∞
*
∞ (7,A, B, E)
7
F
* ∞
1
∞
(5,A, D)
1
I
2
5
H
∞
*
∞
(8, A, B, E, G)
* ∞∞
(10,A, D, H)
Ejemplo 2. Encontrar el camino
mas corto de A a Z