Arboles Monticulos

También podría gustarte

Está en la página 1de 27

Arboles binarios de busqueda Mont culos

Estructuras de datos: Arboles binarios de busqueda, Mont culos


Algoritmos
- Fac. de Informatica Dep. de Computacion Universidad de A Coruna

Santiago Jorge sjorge@udc.es

Algoritmos

Arboles binarios de busqueda, Mont culos

Arboles binarios de busqueda Mont culos

Table of Contents

Arboles binarios de busqueda

Mont culos

Algoritmos

Arboles binarios de busqueda, Mont culos

Arboles binarios de busqueda Mont culos

Referencias bibliogracas

M. A. Weiss. Arboles. En Estructuras de datos y algoritmos, cap tulo 4, paginas 93154. Addison-Wesley Iberoamericana, 1995. M. A. Weiss. Colas de prioridad (mont culos). En Estructuras de datos y algoritmos, cap tulo 6, paginas 181220. Addison-Wesley Iberoamericana, 1995. Mar de estructuras de datos. En R. Pena . Implementacion de Programas. Formalismo y abstraccion , cap Diseno tulo 7, 1998. paginas 257290. Prentice Hall, segunda edicion, G. Brassard y T. Bratley. Estructura de datos. En Fundamentos de algoritmia, cap tulo 5, paginas 167210. Prentice Hall, 1997.

Algoritmos

Arboles binarios de busqueda, Mont culos

Arboles binarios de busqueda Mont culos

Pseudocodigo

Table of Contents

Arboles binarios de busqueda

Mont culos

Algoritmos

Arboles binarios de busqueda, Mont culos

Arboles binarios de busqueda Mont culos

Pseudocodigo

Preliminares

El camino de un nodo n1 a otro nk es la secuencia de nodos n1 , n2 , . . . , nk tal que ni es el padre de ni +1 . La profundidad de un nodo n es la longitud del camino entre la ra z y n.
La ra z tiene profundidad cero.

Para un arbol binario de busqueda, el valor medio de la profundidad es O (log n).


en un ABB no es aleatoria, Si la insercion el tiempo computacional aumenta.
Para mantener el equilibrio: Arboles AVL, Splay Trees, . . .

largo de n a una hoja. La altura de n es el camino mas


La altura de un arbol es la altura de la ra z.

Algoritmos

Arboles binarios de busqueda, Mont culos

Arboles binarios de busqueda Mont culos

Pseudocodigo

Operaciones basicas

del nodo con la clave x. Buscar: devuelve la posicion

Insertar: coloca la clave x. Si ya estuviese, no se hace nada (o se actualiza algo). Eliminar: borra la clave x.
en una hoja, se elimina de inmediato. Si x esta Si el nodo tiene un hijo, se ajusta un apuntador antes de eliminarlo. Si el nodo tiene dos hijos, se sustituye x por la clave pequena, w, del subarbol mas derecho.
se elimina en el subarbol A continuacion derecho el nodo con w (que no tiene hijo izquierdo)

Algoritmos

Arboles binarios de busqueda, Mont culos

Arboles binarios de busqueda Mont culos

Pseudocodigo

perezosa Eliminacion

Si se espera que el numero de eliminaciones sea pequeno, perezosa es una buena estrategia. la eliminacion
Al eliminar un elemento, se deja en el arbol marcandolo como eliminado. Habiendo claves duplicadas, es posible decrementar el campo con la frecuencia de apariciones. Si una clave eliminada se vuelve a insertar, se evita la sobrecarga de asignar un nodo nuevo.

Si el numero de nodos reales en el arbol es igual al numero de nodos eliminados, se espera que la profundidad del arbol solo aumente en uno (por que?).
de tiempo es pequena. La penalizacion

Algoritmos

Arboles binarios de busqueda, Mont culos

Arboles binarios de busqueda Mont culos

Pseudocodigo

de arboles Implementacion binarios de busqueda (i)

tipo PNodo = Nodo Nodo = registro Elemento : TipoElemento Izquierdo, Derecho : PNodo fin registro ABB = PNodo procedimiento CrearABB (var A) A := nil fin procedimiento

Algoritmos

Arboles binarios de busqueda, Mont culos

Arboles binarios de busqueda Mont culos

Pseudocodigo

de arboles Implementacion binarios de busqueda (ii)


funci on Buscar (x, A) : PNodo si A = nil entonces devolver nil sino si x = A.Elemento entonces devolver A sino si x < A.Elemento entonces devolver Buscar (x, A.Izquierdo) sino devolver Buscar (x, A.Derecho) fin funci on funci on BuscarMin (A) : PNodo si A = nil entonces devolver nil sino si A.Izquierdo = nil entonces devolver A sino devolver BuscarMin (A.Izquierdo) fin funci on

Algoritmos

Arboles binarios de busqueda, Mont culos

Arboles binarios de busqueda Mont culos

Pseudocodigo

de arboles Implementacion binarios de busqueda (iii)


procedimiento Insertar (x, var A) si A = nil entonces nuevo (A); si A = nil entonces error sin memoria sino A.Elemento := x; A.Izquierdo := nil; A.Derecho := nil sino si x < A.Elemento entonces Insertar (x, A.Izquierdo) sino si x > A.Elemento entonces Insertar (x, A.Derecho) { si x = A.Elemento : nada } fin procedimiento
Algoritmos Arboles binarios de busqueda, Mont culos

Arboles binarios de busqueda Mont culos

Pseudocodigo

de arboles Implementacion binarios de busqueda (iv)


procedimiento Eliminar (x, var A) si A = nil entonces error no encontrado sino si x < A.Elemento entonces Eliminar (x, A.Izquierdo) sino si x > A.Elemento entonces Eliminar (x, A.Derecho) sino { x = A.Elemento } si A.Izquierdo = nil entonces tmp := A; A := A.Derecho; liberar (tmp) sino si A.Derecho = nil entonces tmp := A; A := A.Izquierdo; liberar (tmp) sino tmp := BuscarMin (A.Derecho); A.Elemento := tmp.Elemento; Eliminar (A.Elemento, A.Derecho) fin procedimiento
Algoritmos Arboles binarios de busqueda, Mont culos

Arboles binarios de busqueda Mont culos

Pseudocodigo

Recorridos de un arbol (i)


En orden: Se procesa el subarbol izquierdo, el nodo actual y, por ultimo, el subarbol derecho. O (n)

procedimiento Visualizar (A) si A <> nil entonces Visualizar (A.Izquierdo); Escribir (A.Elemento); Visualizar (A.Derecho) fin procedimiento
Post-orden: Ambos subarboles primero. O (n)

funci on Altura (A) : n umero si A = nil entonces devolver -1 sino devolver 1 + max (Altura (A.Izquierdo), Altura (A.Derecho)) fin funci on
Algoritmos Arboles binarios de busqueda, Mont culos

Arboles binarios de busqueda Mont culos

Pseudocodigo

Recorridos de un arbol (ii)

que Pre-orden: El nodo se procesa antes. Ej: una funcion marcase cada nodo con su profundidad. O (n) Orden de nivel: Todos los nodos con profundidad p se procesan antes que cualquier nodo con profundidad p + 1. O (n) Se usa una cola en vez de la pila impl cita en la recursion.

Algoritmos

Arboles binarios de busqueda, Mont culos

Arboles binarios de busqueda Mont culos

Pseudocodigo

Codigo C: arboles.h
typedef int tipo_elemento; struct nodo { tipo_elemento elem; struct nodo *izq, *der; }; typedef struct nodo *pnodo; typedef pnodo abb; void crear_abb(abb *); pnodo buscar(tipo_elemento, abb); pnodo buscar_min(abb); void insertar(tipo_elemento, abb *); void eliminar(tipo_elemento, abb *); /* ERRORES: eliminar un elemento que no esta en el arbol */
Algoritmos Arboles binarios de busqueda, Mont culos

Arboles binarios de busqueda Mont culos

Pseudocodigo

Codigo C: arboles.c (i)


#include <stdlib.h> #include <stdio.h> #include "arboles.h" void crear_abb(abb *a){ *a = NULL; } pnodo buscar(tipo_elemento x, abb a){ if (a == NULL) return NULL; else if (x == a->elem) return a; else if (x < a->elem) return buscar(x, a->izq); else return buscar(x, a->der); } pnodo buscar_min(abb a){ if (a == NULL) return NULL; else if (a->izq == NULL) return a; else return buscar_min(a->izq); }
Algoritmos Arboles binarios de busqueda, Mont culos

Arboles binarios de busqueda Mont culos

Pseudocodigo

Codigo C: arboles.c (ii)


void insertar(tipo_elemento x, abb *a){ if (*a == NULL) { *a = (pnodo) malloc(sizeof(struct nodo)); if (*a == NULL) { printf("memoria agotada\n"); exit(EXIT_FAILURE); } else { (*a)->elem = x; (*a)->izq = NULL; (*a)->der = NULL; } } else if (x < (*a)->elem) insertar(x, &((*a)->izq)); else if (x > (*a)->elem) insertar(x, &((*a)->der)); }
Algoritmos Arboles binarios de busqueda, Mont culos

Arboles binarios de busqueda Mont culos

Pseudocodigo

Codigo C: arboles.c (iii)


void eliminar(tipo_elemento x, abb *a){ pnodo tmp; if (*a == NULL) exit(EXIT_FAILURE); else if (x < (*a)->elem) eliminar(x, &((*a)->izq)); else if (x > (*a)->elem) eliminar(x, &((*a)->der)); else if ((*a)->izq == NULL) { /* x==(*a)->elem */ tmp = *a; *a = (*a)->der; free(tmp); } else if ((*a)->der == NULL) { tmp = *a; *a = (*a)->izq; free(tmp); } else { tmp = buscar_min((*a)->der); (*a)->elem = tmp->elem; eliminar((*a)->elem, &((*a)->der)); } } Algoritmos Arboles binarios de busqueda, Mont culos

Arboles binarios de busqueda Mont culos

Pseudocodigo

Table of Contents

Arboles binarios de busqueda

Mont culos

Algoritmos

Arboles binarios de busqueda, Mont culos

Arboles binarios de busqueda Mont culos

Pseudocodigo

Colas de prioridad
Permiten unicamente el acceso al m nimo (o maximo) elemento. Operaciones basicas: insertar, eliminarMin (eliminarMax). Implementaciones simples:
Listas enlazadas efectuando inserciones al frente, O (1), y recorriendo la lista, O (n), para elminiar el m nimo (maximo). Listas ordenadas: inserciones costosas, O (n), eliminaciones ecientes, O (1). medio Arboles binarios de busqueda: tiempo de ejecucion O (log n) para ambas operaciones.
A pesar de que las eliminaciones no son aleatorias. Se eliminan repetidamente nodos de un subarbol. No obstante, el otro subarbol es aleatorio y tendr a a lo sumo el doble de incrementa en uno la elementos de los que deber a. Y esto solo profundidad esperada.

Mont culos: ambas operaciones se realizan en O (log n) para el peor caso. No requieren apuntadores.
Algoritmos Arboles binarios de busqueda, Mont culos

Arboles binarios de busqueda Mont culos

Pseudocodigo

Propiedades estructurales de los mont culos

Un mont culo es un arbol binario completo: todos los niveles llenos con la posible excepcion del nivel mas bajo, que se estan llena de izquierda a derecha. Un arbol binario completo de altura h tiene entre 2h y 2h+1 1 nodos.
Su altura es la parte entera de log2 n.

mediante un vector. Esta regularidad facilita su representacion i del vector, el hijo Para cualquier elemento en la posicion en la posicion 2i , el hijo derecho en 2i + 1, y el izquierdo esta padre en i 2.

Algoritmos

Arboles binarios de busqueda, Mont culos

Arboles binarios de busqueda Mont culos

Pseudocodigo

Propiedades de orden de los mont culos

en la ra El m nimo (o maximo) esta z. un mont Y como todo subarbol es tambien culo, todo nodo debe ser menor (mayor) o igual que todos sus descendientes.

Algoritmos

Arboles binarios de busqueda, Mont culos

Arboles binarios de busqueda Mont culos

Pseudocodigo

Ejemplo de mont culo de maximos


15

13

12

15
1

13
2

12
3

8
4

9
5

5
6

8
7

7
8

5
9

3
10

4
11

5
12

Algoritmos

Arboles binarios de busqueda, Mont culos

Arboles binarios de busqueda Mont culos

Pseudocodigo

de mont Implementacion culos (i)


tipo Mont culo = registro Tama no monticulo : 0..Tama no m aximo culo : vector [1..Tama no m aximo] Vector mont de Tipo elemento fin registro procedimiento Inicializar Mont culo ( M ) M.Tama no monticulo := 0 fin procedimiento funci on Mont culo Vac o ( M ) : test return M.Tama no monticulo = 0 fin funci on

Algoritmos

Arboles binarios de busqueda, Mont culos

Arboles binarios de busqueda Mont culos

Pseudocodigo

de mont Implementacion culos (ii)


procedimiento Flotar ( M, i ) { privado } mientras i > 1 y M.Vector mont culo[i div 2] < M.Vector mont culo[i] culo[i div 2] y hacer intercambiar M.Vector mont M.Vector mont culo[i]; i := i div 2 fin mientras fin procedimiento procedimiento Insertar ( x, M ) si M.Tama no monticulo = Tama no m aximo entonces error Monticulo lleno no monticulo + 1; sino M.Tama no monticulo := M.Tama M.Vector monticulo[M.Tama no monticulo] := x; Flotar ( M, M.Tama no monticulo ) fin procedimiento
Algoritmos Arboles binarios de busqueda, Mont culos

Arboles binarios de busqueda Mont culos

Pseudocodigo

de mont Implementacion culos (iii)


procedimiento Hundir ( M, i ) { privado } repetir HijoIzq := 2*i; HijoDer := 2*i+1; j := i; si HijoDer <= M.Tama no monticulo y M.Vector mont culo[HijoDer] > M.Vector mont culo[i] entonces i := HijoDer; si HijoIzq <= M.Tama no monticulo y M.Vector mont culo[HijoIzq] > M.Vector mont culo[i] entonces i := HijoIzq; culo[j] y intercambiar M.Vector mont M.Vector mont culo[i]; hasta j=i {Si j=i el nodo alcanz o su posici on final} fin procedimiento
Algoritmos Arboles binarios de busqueda, Mont culos

Arboles binarios de busqueda Mont culos

Pseudocodigo

de mont Implementacion culos (iv)


funci on EliminarMax ( M ) : Tipo elemento si Mont culo Vac o ( M ) entonces error Monticulo vac o sino culo[1]; x := M.Vector mont M.Vector mont culo[1] := M.Vector mont culo[M.Tama no monticulo]; no monticulo - 1; M.Tama no monticulo := M.Tama si M.Tama no monticulo > 0 entonces Hundir ( M, 1); devolver x fin funci on

Algoritmos

Arboles binarios de busqueda, Mont culos

Arboles binarios de busqueda Mont culos

Pseudocodigo

de mont Implementacion culos (v)


de mont Creacion culos en tiempo lineal, O (n):

procedimiento Crear Mont culo ( V[1..n], M ) Copiar V en M.Vector mont culo; M.Tama no mont culo := n; para i := M.Tama no mont culo div 2 hasta 1 paso -1 Hundir(M, i); fin para fin procedimiento
acotado El numero de intercambios esta por la suma de las alturas de los nodos. Se demuestra mediante un argumento de marcado del arbol.
Para cada nodo con altura h, marcamos h aristas:
solo por aristas bajamos por la arista izquierda y despues derechas. As una arista nunca se marca 2 veces.
Algoritmos Arboles binarios de busqueda, Mont culos

También podría gustarte