Vous êtes sur la page 1sur 22

Tema 8- El rbol Binario de Bsqueda

Duracin: 2 semanas aprox. ndice general: 1. El problema de la Bsqueda sobre una Coleccin de Datos: soluciones y costes sobre diferentes Representaciones 2. rbol Binario de Bsqueda (ABB): definicin, Representacin, Equilibrio y coste de sus operaciones 3. Implementacin en Java del ABB: la clase ArbolBinarioBusqueda 4. Implementacin de las EDA Diccionario y Cola de Prioridad segn un ABB: las clases ABBDiccionario y ABBColaPrioridad 5. El problema de la Seleccin, otra vez

Bibliografa bsica:

Weiss, M.A. Estructuras de datos en Java. Adisson-Wesley, 2000. Captulo 18, apartados del 1 al 3, ambos inclusive. Wiener, R., Pinson, L.J. Fundamentals of OOP and Data Structures in Java. Cambridge University Press. 2000. Captulo 15, apartados 3, 4 y 9

El Problema de la Bsqueda de un Dato x en una Coleccin de numDatos


Sobre una Representacin Lineal de la Coleccin: en el Peor de los Casos es proporcional a numDatos casos es proporcional a numDatos

Si los Datos NO estn ordenados, en el Peor de los Si los Datos estn ordenados, la Bsqueda Dicotmica
Bsqueda Esttica

permite en el Peor de los Casos una cota logartmica, pero la insercin se encarece (es lineal)

y si la Aplicacin/Modelo se basa en la Bsqueda 4?

El Problema de la Bsqueda de un Dato x en una Coleccin de numDatos


La operacin bsica de una Aplicacin/Modelo Orientado a la Bsqueda es buscar un Dato x dado. Para hacerla eficiente, la Representacin de la Coleccin de Datos que manipula debe mantenerse ordenada de alguna forma 1. insertar(x) y eliminar(x) slo difieren de buscar(x) en la Resolucin de la Bsqueda 2. buscar(x), insertar(x) y eliminar (x) son operaciones del ncleo del Modelo que NO difieren en coste Bsqueda Dinmica
5

Aplicaciones Orientadas a la Bsqueda: Modelo Diccionario


La operacin bsica del Diccionario es buscar en una Coleccin de Entradas una dada x:
buscar(x) consiste en realidad en buscar la Clave de x para devolver su Valor Bsqueda Por Nombre o Clave insertar(x) throws ElementoRepetido

La Bsqueda en un Diccionario es Dinmica Una Implementacin adecuada del Diccionario consigue que sus operaciones se ejecuten en un tiempo independiente de su nmero de Entradas
6

Aplicaciones Orientadas a la Bsqueda: Modelo Cola de Prioridad


La operacin bsica de la Cola de Prioridad es buscar el Dato Mnimo, con menor Prioridad, de una Coleccin
buscarMin() y eliminarMin() no requieren un requisito de Ordenacin de los Datos tan fuerte como el de buscar(x) y eliminar(x) Al insertar(x) puede estar repetido

La Bsqueda en una Cola de Prioridad es Dinmica Una Implementacin adecuada de la Cola de Prioridad consigue que excepto eliminarMin() las dems operaciones se ejecuten en un tiempo promedio constante
7

El Problema de la Bsqueda sobre una Coleccin de Datos: soluciones y costes sobre diferentes Representaciones
Coste medio Representacin

buscar(x)

insertar(x)

buscarMin()

eliminarMin()

LEI LEIOrdenada ArbolBinario MonticuloBinario

(N) (N) (N) (N)

(1) (N) -(1)

(N) (1) (N) (1)

(N) (1) (N) (log N)

Para ser ms eficiente . Qu caractersticas tendra que tener la Representacin de la EDA Orientada a la Bsqueda?
8

Para ser ms eficiente . Qu caractersticas tendra que tener la Representacin de una EDA Orientada a la Bsqueda?
1. La nica Estructura de Datos que puede proporcionar cotas de tiempo logartmicas es el rbol Binario Equilibrado PROPIEDAD ESTRUCTURAL 2. Si un rbol Binario Equilibrado cumple la propiedad de la Bsqueda Ordenada, buscar(x) es logartmica, al igual que el resto de operaciones PROPIEDAD DE ORDENACIN

rbol Binario de Bsqueda (ABB)


9

Definicin de rbol Binario Equilibrado


rbol Binario en el que la diferencia de Alturas de los Hijos Derecho e Izquierdo es como mximo 1
12 8 4 2 6 1 10 14 2 16 4 6

insertar(new Integer(1)) ;
8 10

12 16 14

rbol Binario Equilibrado

rbol Binario
10

El rbol Binario de Bsqueda (ABB) como Representacin de una EDA Orientada a la Bsqueda
Un rbol Binario es de Bsqueda (o cumple la propiedad de Bsqueda Ordenada) si: 1. 2. 3. todos que el todos que el
7 2 1 3 5 9 2

los Datos de su subrbol Izquierdo son menores que ocupa su Raz los Datos de su subrbol Derecho son mayores que ocupa su Raz
7 9 5 3 8
11

los subrboles Izquierdo y Derecho tambin son ABB

rbol Binario de Bsqueda

rbol Binario

Propiedades del rbol Binario de Bsqueda (ABB)


7 2 1 3 5 9

Si se imprime en InOrden .....

123579

resulta una Secuencia Ordenada El Dato mnimo se encuentra en ..... el ltimo Nodo Izquierdo de su primera Rama El Dato mximo se encuentra en ..... el ltimo Nodo Derecho de su ltima Rama

12

Cuestiones propuestas:
A partir de las definiciones y propiedades anteriores, respndanse las siguientes cuestiones: 1. dnde se encuentra el sucesor de un Dato dado x de un ABB? 2. y el predecesor de x? Responder a las cuestiones planteadas sobre los siguientes ejemplos puede resultar til:
7 2 1 3 5

dnde se encuentra el sucesor del 2 en este ABB? 9 y su predecesor? dnde se encuentra el sucesor del 9 en este ABB? y su predecesor? SIGUE 13

15 6 3 2 4 9 7 13 17 18 20

dnde se encuentra el sucesor del 15 en este ABB? y su predecesor? dnde se encuentra el sucesor del 13 en este ABB? y su predecesor? dnde se encuentra el sucesor del 9 en este ABB? y su predecesor?

Operaciones sobre un ABB y su coste: buscar(x) Bsqueda del Nodo del ABB que contiene a x
Tbuscar (N) O(H) =4 buscar(x) = 3
7 2 1 3 5 9 1 3 2 5

buscar(x) = 9
7 9

4 Comparaciones

2 Comparaciones

esfuerzo de Comparacin(x) = 1+Nivel de x

15

Operaciones sobre un ABB y su coste: TeMC (N) (N) eMC()


7 2 1 3 5 9

esfuerzo Medio de Comparacin (eMC) ? eMC = Nivel=0..H (n Nodos de Nivel) (1+ Nivel) _________________________________ N
16

Operaciones sobre un ABB y su coste: insertar(x) 1. Bsqueda del lugar de insercin de x en el ABB
Tinsertar (N) O(H) insertar(x) = 10
7 2 1 3 5 9
10

2. Resolucin de la Bsqueda: insertar en tal lugar el nuevo Nodo que contiene a x

insertar(x) = 6
7 2 1 3 5 9

Se puede calcular el esfuerzo Medio de Comparacin conforme se van insertando los Datos ?

Operaciones sobre un ABB y su coste: buscarMin() y buscarMax()


Recorrido de una determinada Rama del ABB

TbuscarMin/Max (N) (H)

buscarMin()
7 2 1 3 5 9 1

buscarMax()
7 2 5 3 9

Operaciones sobre un ABB y su coste: eliminar(x) 1. Bsqueda del Nodo que contiene a x
2. Resolucin de la Bsqueda: eliminarlo

Teliminar (N) O(H)


eliminar(x) = 1
7 2
null 1

eliminar(x) = 5
7 2 1 3 5 9 1

eliminar(x) = 2
7 3 2 9

9 5

buscarMin()
5

null 3

o Caso 3: eliminar un o Caso 1: eliminar un o Caso 2: eliminar Nodo n con 0 Hijos un Nodo n con 1 Hijo Nodo n con 2 Hijos n = null

Caso(n.izq != null)n.dato=buscarMin(n.der).dato; n = nico: ? n.izq: n.der; n.der = eliminarMin(n.der);

n = ( n.izq != null ) ? n.izq: n.der;

Operaciones sobre un ABB y su coste: eliminarMin() y eliminarMax()


Recorrido de una determinada Rama del ABB para borrar su ltimo Nodo

TeliminarMin/Max (N) (H)


7 2 1 3 5 9

Equilibrado, Altura y eMC de un ABB


Ejemplo: inicializar un rbol Binario de Bsqueda con la secuencia 7, 2, 9, 1, 5, 3 5, 7, 2, 9, 1, 3 1, 2, 3, 5, 7, 9
7 2 1 3 5 9 1 2 3 5 7 9 1 2 3 5 7 9
21

cuanto ms Equilibrado el ABB menor ser su Altura, su eMC y el coste de sus operaciones !!!

10

Equilibrado, Altura y eMC de un ABB: talla, instancias significativas y coste


En un ABB Equilibrado de altura H y tamao N H log N

Toperacion(N) (log N) Toperacion(N) (N)

En un ABB desEquilibrado de altura H y tamao N H=N-1

SOLUCIN : ABBs Bien Equilibrados ABBs a los que se aade una Condicin de Equilibrio tal que H log N Ello obliga a realizar modificaciones en: la estructura de la clase correspondiente (atributos) las operaciones de insercin y eliminacin
22

El Problema de la Bsqueda sobre una Coleccin de Datos: soluciones y costes sobre diferentes Representaciones
Coste medio buscar(x) Representacin LEI LEI Ordenada Arbol Binario Monticulo Binario ABB insertar(x) buscarMin() eliminarMin()

(N) (N) (N) (N) (log N)

(1) (N) -(1) (log N)

(N) (1) (N) (1) (log N)

(N) (1) (N) (log N) (log N)

23

11

El Problema de la Bsqueda sobre una Coleccin de Datos: soluciones y costes sobre diferentes Representaciones
Coste peor buscar(x) Representacin LEI LEI Ordenada Arbol Binario Monticulo Binario ABB insertar(x) buscarMin() eliminarMin()

(N) (N) (N) (N) (N)

(1) (N) -(log N) (N)

(N) (1) (N) (1) (N)

(N) (1) (N) (log N) (N)

24

Representacin de un ABB
rbol Binario, donde un Nodo define al rbol del que es Raz un rbol Binario TIENE UN Nodo Binario Raz un rbol Binario TIENE UN numTotalInserciones y numTotalComparaciones tal que: eMC = numTotalComparaciones / numTotalInserciones

25

12

Ejemplo propuesto

Si se busca el nmero 363 en un ABB que contiene nmeros del 1 al 1000 cul de las siguientes secuencias no puede ser la secuencia de Nodos examinada? 2,252,401,398,330,344,397,363 924,220,911,244,898,258,362,363 925,202,911,240,912,245,363 2,399,387,219,266,382,381,278,363 935,278,347,621,299,392,358,363

26

Ejemplo propuesto: a partir de ArbolBinarioBusqueda, disear las clases ABBDiccionario y ABBColaPrioridad para que implementen,
respectivamente, Diccionario y ColaPrioridad mediante un ABB

13

Ejemplo propuesto: a partir de ArbolBinarioBusqueda, disear las clases ABBDiccionario y ABBColaPrioridad para que implementen,
respectivamente, Diccionario y ColaPrioridad mediante un ABB
ArbolBinarioBusqueda NO implementa ninguna interfaz. Sus mtodos son: los public comunes a cualquier rbol Binario, que por tanto lanzan sus homnimos de NodoBinario los protected sobre un Nodo Binario de Bsqueda, que sern lanzados (re-utilizados) por los mtodos public de clases que implementan Modelos especficos, como 1. ABBDiccionario, extends ArbolBinarioBusqueda implements Diccionario 2. ABBColaPrioridad, extends ArbolBinarioBusqueda implements ColaPrioridad

Cuestiones: 1. Cul de los dos mtodos de insercin de ArbolBinarioBusqueda se lanza en ABBDiccionario ? y enABBColaPrioridad ? 2. Desde una aplicacin que utiliza un Diccionario, es correcto ejecutar Diccionario d = new ArbolBinarioBusqueda()? Por qu ?

La clase ArbolBinarioBusqueda: atributos y mtodos pblicos sobre this ABB


package jerarquicos; import excepciones.*; public class ArbolBinarioBusqueda{ protected NodoBinario raiz; protected long numTotalInserciones, numTotalComparaciones; public ArbolBinarioBusqueda() { raiz = null; numTotalInserciones = numTotalComparaciones = 0; } public boolean esVacio() { return (raiz == null);} public double eMC(){ return ((double)numTotalComparaciones)/numTotalInserciones; } public int tamao(){ return NodoBinario.tamao(this.raiz); } public int altura(){ return NodoBinario.altura(this.raiz); } public String toString(){ if ( raiz != null ) return raiz.imprimirInOrden(); else return "*"; } public String imprimirPorNiveles(){ if ( raiz != null ) return raiz.imprimirPorNiveles(); else return "*";}

14

La clase ArbolBinarioBusqueda: mtodos protected, para la Herencia, sobre la Raz de this ABB, i.e. sobre un Nodo Binario de Bsqueda
protected NodoBinario buscar(Object x, NodoBinario n) throws ElementoNoEncontrado {....} protected NodoBinario insertar(Object x, NodoBinario n) throws ElementoDuplicado {....} protected NodoBinario insertarTodos(Object x, NodoBinario n) {....} protected NodoBinario buscarMin(NodoBinario n) {....} protected NodoBinario buscarMax(NodoBinario n) {....} protected NodoBinario eliminarMin(NodoBinario n) {....} protected NodoBinario eliminarMax(NodoBinario n) {....} protected NodoBinario eliminar(Object x, NodoBinario n) throws ElementoNoEncontrado {....} ...
30

La clase ArbolBinarioBusqueda: diseo Recursivo del mtodo protected buscar


protected NodoBinario buscar(Object clave, NodoBinario n) throws ElementoNoEncontrado { /** Bsqueda Recursiva de clave en un Nodo Binario de Bsqueda * Bsqueda Recursiva Binaria */ casoBase(talla(n)) new ElementoNoEncontrado(al if ( n == null ) throw ) return solucinBase(talla(n)); buscar +clave); else { int resC = ((Comparable)n.dato).compareTo(clave); if ( mejorCaso()== 0 ) return n; ( resC ) return solucinMejorCaso(); else { ( resC > 0 ) return buscar(clave, n.izq) ; if // Llamadas recursivas else return buscar(clave, n.der); return solucinPeorCaso(); } Ejercicio propuesto: diseo Iterativo del mtodo }

protected buscar

15

La clase ArbolBinarioBusqueda: diseo Recursivo del mtodo protected insertar


protected NodoBinario insertar(Object clave, NodoBinario n) throws ElementoNoEncontrado { /** 1.- Bsqueda Binaria con xito del lugar de insercin de clave en n; * 2.- Resolucin: insertar all el nuevo Nodo que contiene a clave */ if ( n == null ) return ) return solucinBase(talla(n)); casoBase(talla(n)) new NodoBinario(clave); else { int resC = ((Comparable)n.dato).compareTo(clave); if ( mejorCaso()== 0 ) throw new ElementoDuplicado(al ...); ( resC ) return solucinMejorCaso(); else { if ( resC > 0 ) n.izq = insertar(clave, n.izq) ; else // Llamadas recursivas insertar(clave, n.der); n.der = return n; return solucinPeorCaso(); } }

diseo Iterativo del mtodo protected insertar diseo Recursivo del mtodo insertarTodos

Ejercicios propuestos:

La clase ArbolBinarioBusqueda: diseo Recursivo del mtodo protected eliminar


protected NodoBinario eliminar(Object clave, NodoBinario n) throws ElementoNoEncontrado{ if ( n == null ) throw new ElementoNoEncontrado(al eliminar ..); int resC = ((Comparable)n.dato).compareTo(clave) ; if ( resC < 0 ) else if ( resC > 0 ) n.der = eliminar(clave, n.der); n.izq = eliminar(clave, n.izq);

else { if ( n.izq != null && n.der != null ) { /** clave encontrada en Nodo n: eliminarlo */ n.dato = buscarMin(n.der).dato; n.der = eliminarMin(n.der); } else n = ( n.izq != null ) ? n.izq: n.der;

} return n; }

16

La clase ArbolBinarioBusqueda: diseo de los mtodo protected buscarMin y eliminarMin


/**SII esVacio() */ protected NodoBinario buscarMin(NodoBinario n) { if (n.izq != null ) n.izq = buscarMin(n.izq) ; return n; } /**SII esVacio() */ protected NodoBinario eliminarMin( NodoBinario n ) { if (n.izq != null ) n.izq = eliminarMin(n.izq) ; else n = n.der; return n; }

eliminarMin diseo Recursivo e Iterativo de buscarMax y eliminarMax

diseo Iterativo de los mtodos protected buscarMin y

Ejercicios propuestos:

Ejemplos propuestos en la Prctica 4

Aadir a la clase ArbolBinarioBusqueda dos mtodos que dado un Objeto x encuentren, respectivamente, el sucesor y predecesor de x en el ABB Cmo tiene que ser el Objeto x?

35

17

El Problema de la Seleccin, otra vez


Clculo del k-simo Dato ms pequeo de una Coleccin a) si N, 1kN de tallala Coleccin se representa sobre un array Ejemplo: 7,2,9,1,5,3, k = 3 y N = 6
7 2 9 1 5 3 /** Solucin 1 */ TseleccionDirectaKmedio(N) O(k*N)

public static void seleccionDirectaK(Object v[], int k){ for ( int i = 0; i < k; i++ ) { int j = posMin(v,i,N-1); intercambiar(v,i, j); } }

/** k-simo Mnimo de la Coleccin en v[k-1] */ 1 2 3 7 5 9

El Problema de la Seleccin, otra vez


Clculo del k-simo Dato ms pequeo de una Coleccin a) si N, 1kN de tallala Coleccin se representa sobre un array Ejemplo: 7,2,9,1,5,3, k = 3 y N = 6

/** Solucin 2 */
.... }

TquickSortmedio(N) O(N*logN)

public static void quickSort(Object v[]){ heapSort(Object v[]){

/** k-simo Mnimo de la Coleccin en v[k-1] */ 1 2 3 7 5 9

18

El Problema de la Seleccin, otra vez


Clculo del k-simo Dato ms pequeo de una Coleccin a) si N, 1kN de tallala Coleccin se representa sobre un array Ejemplo: 7,2,9,1,5,3, k = 3 y N = 6
7 /** Solucin 3 */ 2 9 1 5 3 TseleccionRapidamedio(N) O(N)

public static void seleccionRapida(Object v[], int k, int izq, int der){ if ( izq < der ){ int indP = particion(v, izq, der); if ( k-1 < indP ) seleccionRapida(v, k, izq, indP-1); else if ( k-1 > indP ) seleccionRapida(v, k,indP+1, der); } }

/** k-simo Mnimo de la Coleccin en v[k-1] */ 1 2 3 7 5 9

El Problema de la Seleccin, otra vez

Clculo del k-simo Dato ms pequeo de una Coleccin b) si la Coleccin se representa sobre un ABB de talla N, 1kN Ejemplo: 7,2,9,1,5,3, k = 3 y N = 6
n 7
2 9 5

tamaoNIzq = 4

k=1
3

Si se imprime en InOrden un ABB resulta una Coleccin Ordenada .... pero sigue siendo O(N) Mejor an, dnde se encuentra el mnimo del ABB n ? y su segundo mnimo, k = 2 ? ... hasta que k se encontrar en n.izq ? hasta el 4

19

El Problema de la Seleccin, otra vez


b) si la Coleccin se representa sobre un ABB
k=3 n
2 1 3 5 7 9 1 3

k=5 n
2 5 7 9 1

k = 10 n
2 5 3 7 9

tamaoNIzq = 4
if (k <= tamaoNIzq)

tamaoNIzq = 4

tamaoNIzq = 4

buscarKesimo(k, n.izq) el k-simo es n.dato

if (k == tamaoNIzq + 1) if (k > tamaoNIzq + 1) buscarKesimo(k, n.der) k-tamaoNIzq-1

Ampliacin de la clase ArbolBinarioBusqueda: el mtodo buscarKesimo


protected NodoBinario buscarKesimo(int k, NodoBinario n) throws ElementoNoEncontrado {

TbuscarKesimo(N) (N)

if ( n == null ) throw new ElementoNoEncontrado(al buscar K-simo); int tamaoNIzq = NodoBinario.tamao(n.izq); if ( k == tamaoNIzq + 1 ) return n; else if ( k <= tamaoNIzq ) return buscarKesimo(k, n.izq); else } return buscarKesimo(k-tamaoNIzq-1,n.der);

// Lo lanza el homnimo de una extensin de ArbolBinarioBusqueda public Object buscarKesimo(int k) throws ElementoNoEncontrado { return buscarKesimo(k, raiz).dato; }
41

20

Mejorar la eficiencia de buscarKesimo (hasta O(logN)) es mejorar la de tamao (hasta (1))


Mejorar la complejidad del mtodo tamao supone NO calcularlo a-posteriori, cuando ya se dispone del rbol Binario SINO conforme se crean e insertan sus Nodos

Si un Nodo TIENE UN Tamao, por definicin de Tamao


Al crearlo, su Tamao es 1 Al insertar un nuevo Dato, cada Nodo del Camino de insercin incrementa Tamao igual a 1+Tamao Al borrar un Nodo, cada Nodo del Camino de borrado TIENE UN Tamao igual a 1-Tamao
42

Modificaciones en la clase NodoBinario


final class NodoBinario { Object dato; NodoBinario izq, der; int tamanyo; NodoBinario(Object x, NodoBinario izq, NodoBinario der) { dato = x; this.izq = izq; this.der = der; tamanyo = 1; } static int tamanyo(NodoBinario actual) { int tamanyo() { if ( actual == null return tamanyo; ) return 0; else return 1 + tamanyo(actual.izq) + tamanyo(actual.der); } } ...... }

21

Modificaciones en la clase ArbolBinarioBusqueda


protected NodoBinario insertar(Object clave, NodoBinario n) throws ElementoDuplicado { if ( n == null ) return new NodoBinario(clave); else { int resC = ((Comparable)n.dato).compareTo(clave) ; numTotalComparaciones++; if ( resC == 0 ) throw new ElementoDuplicado(...); n.tamanyo++; if ( resC > 0 ) n.izq = insertar(clave, n.izq); else return n; } }
44

n.der = insertar(clave, n.izq);

Ejercicio propuesto: adems de insertar, indquese


qu mtodos de ArbolBinarioBusqueda se ven afectados por la introduccin en NodoBinario del nuevo atributo tamanyo y realcense las modificaciones oportunas en su cdigo Vara el coste de alguno de ellos?

45

22

Vous aimerez peut-être aussi