1.74k likes | 1.96k Views
Almacenamiento y recuperación de información. Prof. Hugo Moncayo López Cubículo H-294 Tel. 5318-9532/139 Correo hmoncayo@hp9000a1.uam.mx. Contenido sintético. Árbles AVL Grafos y sus aplicaciones Estructuras de archivos Ordenamiento externo Indexación Árboles B y B+ Dispersión.
E N D
Almacenamiento y recuperación de información Prof. Hugo Moncayo López Cubículo H-294 Tel. 5318-9532/139 Correo hmoncayo@hp9000a1.uam.mx
Contenido sintético • Árbles AVL • Grafos y sus aplicaciones • Estructuras de archivos • Ordenamiento externo • Indexación • Árboles B y B+ • Dispersión
Evaluaciones • Dos evaluaciones periódicas en las semanas 4 y 7 • Una evaluación terminal en la semana de evaluaciones globales • 8 tareas consistentes el elaboración de programas • Calificación: • Evaluaciones 60% • Tareas 40%
Escala de calificaciones • NA > 6 • S entre 6 y menos de 7 • B entre 7 y menos de 8.5 • MB 8.5 o superior
Bibliografía • Folk, M. J., Zoellick, Bill, Riccardi, Greg. "Fil estructures: an object orientes approach with C++, Addison Wesley Longman, Inc. 1998 • Cormen, T. H., Leiserson, C. E., Rivest, R. L., "Introduction to algorithms", Mc Graw Hill, 1998. • Knuth, D.E., "The art of computer programming: Vol. 3 Sorting and searching", Addison-Wesley Publishing Company, Inc. Philipines, 1973. • Joyanes, L. "Programación en C++: Algoritmos, estructuras de datos y objetos", McGraw-Hill/Interamericana de España, S. A. U., 2000 • Langsam, Y., Augenstein, M., Tenenbaum, A. M., "Estructuras de datos con C y C++" segunda edición, Prentice-Hall Hispanoamericana, S. A. 1997.
1.- Árboles AVL • Adelson, Velskii, Landis • Son árboles de búsqueda bien balanceados • Permiten inserciones y remociones en tiempo muy eficientes • Mantienen una profundidad de O(log N)
Árboles no balanceados 11 13 10 5 3
Árbol balanceado 10 5 13 3 11
Propiedades de los árboles AVL • Balanceado • En cualquier nodo las alturas de los hijos izquierdo y derecho sólo pueden diferir en uno • Los nodos vacíos tienen altura de –1 • Las hojas tienen altura de 0 • Los nodos se encuentran ordenados por una llave
Altura de los nodos 10 3 5 13 2 1 3 1 7 0 11 0 1 0
llave llave llave raiz altura altura altura Estructuras de datos para árboles AVL
Estructuras en C++ class Nodo; class avl{ public: Nodo *raiz; avl() {raiz = 0;} void RotacionSimpleIzquierda(); void RotacionSimpleDerecha(); ... }; class Nodo{ public: int llave; int altura; avl izq, der; Nodo(int llave) { this->llave = llave; altura = 0; izq.raiz = 0; der.raiz = 0; } };
10 5 3 2 1 0 beta delta nil nil Rotación simple por la izquierda this raiz raiz->izq
10 5 3 2 1 0 beta delta nil nil Rotación simple por la izquierda this void avl::RotacionSimpleIzquierda() { Nodo *t = raiz; raiz t raiz->izq
10 5 3 2 1 0 beta delta nil nil Rotación simple por la izquierda this void avl::RotacionSimpleIzquierda() { Nodo *t = raiz; raiz = t->izq.raiz; raiz t raiz->izq
10 5 3 2 1 0 delta beta gama delta nil nil Rotación simple por la izquierda this void avl::RotacionSimpleIzquierda() { Nodo *t = raiz; raiz = t->izq.raiz; t->izq = raiz->der; raiz t raiz->izq
10 5 3 2 1 0 delta beta gama nil nil Rotación simple por la izquierda this void avl::RotacionSimpleIzquierda() { Nodo *t = raiz; raiz = t->izq.raiz; t->izq = raiz->der; raiz->der.raiz = t; raiz t raiz->izq
10 5 3 0 1 0 delta beta gama nil nil Rotación simple por la izquierda this void avl::RotacionSimpleIzquierda() { Nodo *t = raiz; raiz = t->izq.raiz; t->izq = raiz->der; raiz->der.raiz = t; raiz->der.AjustaAltura(); raiz t raiz->izq
10 5 3 0 1 0 delta beta gama nil nil Rotación simple por la izquierda this void avl::RotacionSimpleIzquierda() { Nodo *t = raiz; raiz = t->izq.raiz; t->izq = raiz->der; raiz->der.raiz = t; raiz->der.AjustaAltura(); raiz->der.AjustaAltura(); AjustaAltura(); } raiz t raiz->izq
10 5 3 0 1 0 delta beta gama nil nil Rotación simple por la izquierda this void avl::RotacionSimpleIzquierda() { Nodo *t = raiz; raiz = t->izq.raiz; t->izq = raiz->der; raiz->der.raiz = t; raiz->der.AjustaAltura(); raiz->der.AjustaAltura(); AjustaAltura(); } raiz raiz->izq
Rotación doble 50 20 rotación simple izquierda 20 50 30 30
50 20 30 2 1 0 alfa beta gamadelta Rotación doble izquierda this raiz raiz->izq Subarbol alfa > 50 beta < 20 20 < gama < 30 30 < delta < 50
50 30 20 2 1 0 alfa delta betagama Rotación doble izquierda this void RotacionDobleIzquierda() { raiz->izq.RotacionSimpleDerecha(); } raiz raiz->izq Subarbol alfa > 50 beta < 20 20 < gama < 30 30 < delta < 50
50 30 20 0 1 0 delta alfa betagama Rotación doble izquierda this void RotacionDobleIzquierda() { raiz->izq.RotacionSimpleDerecha(); Rotacion SimpleIzquierda(); } raiz raiz->izq Subarbol alfa > 50 beta < 20 20 < gama < 30 30 < delta < 50
Grafos Un grafo es un conjunto de vértices conectados por líneas llamadas aristas Grafo no dirigido 1 2 3 4 G=(V,A) 5 6 Grafo dirigido 1 2 3 4 5
3 2 1 4 1 5 3 2 6 6 1 6 2 4 3 4 Representación de grafos Lista de adyacencia 1 2 1 2 3 4 5 6 3 4 5 6 Matriz de adyacencia
3 6 2 4 3 2 2 5 Representación de grafos Lista de adyacencia 1 2 3 4 5 1 2 3 4 5 Matriz de adyacencia
Búsqueda primero en amplitud Para cada vertice u en V[G] u.color = blanco u.distancia = infinito u.padre = nil s.color = gris s.distancia = 0 s.padre = nil Q.InsertaFinal(s) Mientras Q no sea vacio u = Q.ExtraeCabeza() Para cada vertice v en u.adyacencia Si v.color = blanco v.color = gris v.distancia = u.distancia+1 v.padre = u Q.AgregaFinal(v) u.color = negro
1 1 2 0 1 2 1 0 0 Búsqueda primero en aplitud t u t u r s r s Q = {s} Q = {} v w x y v w x y t u r s t u r s Q = {w,r} Q = {r,t,x} v w x y v w x y
1 2 1 2 2 2 3 2 0 1 1 2 3 0 2 0 1 3 2 1 0 3 2 2 1 2 3 2 1 Búsqueda primero en amplitud t u r s t u r s Q = {x,v,u} Q = {t,x,v} v w x y v w x y r s t u r s t u Q = {u,y} Q = {v,u,y} v w x y v w x y
0 2 1 2 3 2 1 3 3 1 2 3 2 0 1 2 Búsqueda primero en amplitud r s t u r s t u Q = {y} Q = {} v w x y v w x y
Búsqueda primero en amplitud • Funciona para arista unitarias • Calcula la distancia más corta desde el vértice origen a cada uno de los vértices a los que se puede llegar • Se puede aplicar a grafos direccionados o grafos no direccionados • Genera el árbol de rutas mas cortas mediante los predecesores de cada nodo
Implementación Clase deque Constructora: deque<Vertice*> adyacencia; Funciones de acceso: adyacencia.push_back(&Vertice) adyacencia.push_front(&Vertice) adyacencia.begin(); adyacencia.end();
Iterar en los elementos de deque deque<Vertice*>::iterator it; for (it = u.adyacencia.begin(); it != u.adyacencia.end(); it++) { Vertice *v = *it; }
Búsqueda primero en profundidad • Busca primeramente la máxima profundidad posible en cada ruta • Cuando ha agorado una ruta en lo profundo regresa (backtrack) a los vértices por donde vino para analizar las aristas pendientes
Algoritmo ALGORITMO BPP(G) Para cada vértice u en G.V u.color = BLANCO u.padre = NIL time = 0 Para cada vértice u en G.V Si u.color = BLANCO BPP_Visita(u) ALGORITMO BPP_Visita(u) u.color = GRIS u.distancia = time++ Para cada vértice v en u.Adyacencia Si v.color = BLANCO v.padre = u BPP_Visita(v) u.color = NEGRO u.f = time++
0 0 0 0 0 0 0 0 0 0 0 1/ BPP w u v ALGORITMO BPP(G) Para cada vértice u en G.V u.color = BLANCO u.padre = NIL time = 0 Para cada vértice u en G.V Si u.color = BLANCO BPP_Visita(u) ALGORITMO BPP_Visita(u) u.color = GRIS u.distancia = time++ Para cada vértice v en u.Adyacencia Si v.color = BLANCO v.padre = u BPP_Visita(v) u.color = NEGRO u.f = time++ time 0 x y z u=u(v, x) v=v w u v time 1 x y z
1/ 0 0 0 0 0 0 0 0 2/ 1/ 0 BPP w ALGORITMO BPP(G) Para cada vértice u en G.V u.color = BLANCO u.padre = NIL time = 0 Para cada vértice u en G.V Si u.color = BLANCO BPP_Visita(u) ALGORITMO BPP_Visita(u) u.color = GRIS u.distancia = time++ Para cada vértice v en u.Adyacencia Si v.color = BLANCO v.padre = u BPP_Visita(v) u.color = NEGRO u.f = time++ u v time 1 x y z x y z u=u(v, x),v(y) v=y w u v time 2 x y z x y z
0 1/ 2/ 0 0 3/ 0 2/ 1/ 0 0 0 BPP w u v ALGORITMO BPP(G) Para cada vértice u en G.V u.color = BLANCO u.padre = NIL time = 0 Para cada vértice u en G.V Si u.color = BLANCO BPP_Visita(u) ALGORITMO BPP_Visita(u) u.color = GRIS u.distancia = time++ Para cada vértice v en u.Adyacencia Si v.color = BLANCO v.padre = u BPP_Visita(v) u.color = NEGRO u.f = time++ time 2 x y z x y z u=u(v, x),v(y),y(x) v=x w u v time 3 x z x y z
0 1/ 2/ 0 4/ 3/ 0 2/ 1/ 3/ 0 0 BPP w w u v ALGORITMO BPP(G) Para cada vértice u en G.V u.color = BLANCO u.padre = NIL time = 0 Para cada vértice u en G.V Si u.color = BLANCO BPP_Visita(u) ALGORITMO BPP_Visita(u) u.color = GRIS u.distancia = time++ Para cada vértice v en u.Adyacencia Si v.color = BLANCO v.padre = u BPP_Visita(v) u.color = NEGRO u.f = time++ time 3 x z x y z u=u(v, x),v(y),y(x),x(v) v=v w u v time 4 z x y z
0 1/ 2/ 0 4/5 3/ 0 1/ 4/ 3/ 2/ 0 BPP w u v ALGORITMO BPP(G) Para cada vértice u en G.V u.color = BLANCO u.padre = NIL time = 0 Para cada vértice u en G.V Si u.color = BLANCO BPP_Visita(u) ALGORITMO BPP_Visita(u) u.color = GRIS u.distancia = time++ Para cada vértice v en u.Adyacencia Si v.color = BLANCO v.padre = u BPP_Visita(v) u.color = NEGRO u.f = time++ time 4 z x y z u=u(v, x),v(y),y(x),x(v) v=v w u v time 5 z x y z
0 1/ 2/ 0 4/5 3/6 0 1/ 4/5 3/ 2/ 0 BPP w u v ALGORITMO BPP(G) Para cada vértice u en G.V u.color = BLANCO u.padre = NIL time = 0 Para cada vértice u en G.V Si u.color = BLANCO BPP_Visita(u) ALGORITMO BPP_Visita(u) u.color = GRIS u.distancia = time++ Para cada vértice v en u.Adyacencia Si v.color = BLANCO v.padre = u BPP_Visita(v) u.color = NEGRO u.f = time++ time 5 z x y z u=u(v, x),v(y),y(x),x(v) v= w u v time 6 z x y z
0 1/ 2/7 0 4/5 3/6 0 1/ 4/5 3/6 2/ 0 BPP w u v ALGORITMO BPP(G) Para cada vértice u en G.V u.color = BLANCO u.padre = NIL time = 0 Para cada vértice u en G.V Si u.color = BLANCO BPP_Visita(u) ALGORITMO BPP_Visita(u) u.color = GRIS u.distancia = time++ Para cada vértice v en u.Adyacencia Si v.color = BLANCO v.padre = u BPP_Visita(v) u.color = NEGRO u.f = time++ time 6 z x y z u=u(v, x),v(y),y(x),x(v) v= w u v time 7 z x y z
0 1/8 2/7 0 4/5 3/6 0 1/ 4/5 3/6 2/7 0 BPP w u v ALGORITMO BPP(G) Para cada vértice u en G.V u.color = BLANCO u.padre = NIL time = 0 Para cada vértice u en G.V Si u.color = BLANCO BPP_Visita(u) ALGORITMO BPP_Visita(u) u.color = GRIS u.distancia = time++ Para cada vértice v en u.Adyacencia Si v.color = BLANCO v.padre = u BPP_Visita(v) u.color = NEGRO u.f = time++ time 7 z x y z u=u(v, x),v(y),y(x),x(v) v=x w u v time 8 z x y z
0 1/8 2/7 9/ 4/5 3/6 0 1/8 4/5 3/6 2/7 0 BPP w u v ALGORITMO BPP(G) Para cada vértice u en G.V u.color = BLANCO u.padre = NIL time = 0 Para cada vértice u en G.V Si u.color = BLANCO BPP_Visita(u) ALGORITMO BPP_Visita(u) u.color = GRIS u.distancia = time++ Para cada vértice v en u.Adyacencia Si v.color = BLANCO v.padre = u BPP_Visita(v) u.color = NEGRO u.f = time++ time 8 z x y z u=u(v, x),v(y),y(x),x(v),w(y, z) v=z w u v time 9 z x y z
4/5 1/8 2/7 9/ 4/5 3/6 10/ 2/7 1/8 3/6 9/ 0 BPP w u v ALGORITMO BPP(G) Para cada vértice u en G.V u.color = BLANCO u.padre = NIL time = 0 Para cada vértice u en G.V Si u.color = BLANCO BPP_Visita(u) ALGORITMO BPP_Visita(u) u.color = GRIS u.distancia = time++ Para cada vértice v en u.Adyacencia Si v.color = BLANCO v.padre = u BPP_Visita(v) u.color = NEGRO u.f = time++ time 9 z x y z u=u(v, x),v(y),y(x),x(v),w(y, z),z(w,z) v=z w u v time 10 x y z
4/5 1/8 2/7 9/ 4/5 3/6 10/11 2/7 1/8 3/6 9/ 0 BPP w u v ALGORITMO BPP(G) Para cada vértice u en G.V u.color = BLANCO u.padre = NIL time = 0 Para cada vértice u en G.V Si u.color = BLANCO BPP_Visita(u) ALGORITMO BPP_Visita(u) u.color = GRIS u.distancia = time++ Para cada vértice v en u.Adyacencia Si v.color = BLANCO v.padre = u BPP_Visita(v) u.color = NEGRO u.f = time++ time 10 z x y z u=u(v, x),v(y),y(x),x(v),w(y, z),z(w,z) v=z w u v time 11 x y z
9/ 1/8 2/7 9/12 4/5 3/6 10/11 1/8 4/5 2/7 3/6 10/11 BPP w u v ALGORITMO BPP(G) Para cada vértice u en G.V u.color = BLANCO u.padre = NIL time = 0 Para cada vértice u en G.V Si u.color = BLANCO BPP_Visita(u) ALGORITMO BPP_Visita(u) u.color = GRIS u.distancia = time++ Para cada vértice v en u.Adyacencia Si v.color = BLANCO v.padre = u BPP_Visita(v) u.color = NEGRO u.f = time++ time 11 x y z u=u(v, x),v(y),y(x),x(v),w(y, z),z(w,z) v=z w u v time 12 x y z
1/8 2/7 9/12 4/5 3/6 10/11 BPP w u v x y z u w v z y x 1 2 3 4 5 6 7 8 9 10 11 12