Académique Documents
Professionnel Documents
Culture Documents
Bibliografía básica:
1
El Problema de la Búsqueda de un Dato x
en una Colección de numDatos
Búsqueda Estática
Búsqueda Dinámica
2
Aplicaciones Orientadas a la Búsqueda:
Modelo Diccionario
3
El Problema de la Búsqueda sobre una Colección
de Datos: soluciones y costes sobre diferentes
Representaciones
4
Definición de Árbol Binario Equilibrado
12 insertar(new Integer(1)) ; 12
8 16 8 16
4 10 14 4 10 14
2 6 2 6
10
2 9 2 9
5
Propiedades del Árbol Binario de Búsqueda (ABB)
7
• Si se imprime en InOrden ..... 123579
2 9
resulta una Secuencia Ordenada
• El Dato mínimo se encuentra en ..... 1 5
12
Cuestiones propuestas:
1 5
¿dónde se encuentra el sucesor del 9 en este ABB?
3 ¿y su predecesor?
⇒ SIGUE 13
6
15
6 18
3 7 17 20
2 4 13
9
¿dónde se encuentra el sucesor del 15 en este ABB?
¿y su predecesor?
buscar(x) =
=34 buscar(x) = 9
7 7
2 9 2 9
1 5 1 5
3 3
4 Comparaciones 2 Comparaciones
esfuerzo de Comparación(x)
= 1+Nivel de x
15
7
Operaciones sobre un ABB y su coste:
eMC() TeMC (N)∈ Θ(N)
2 9
1 5
16
insertar(x) = 10 insertar(x) = 6
7 7
2 9 2 9
1 5 1 5
10
3 3
8
Operaciones sobre un ABB y su coste:
buscarMin() y buscarMax()
Recorrido de una determinada Rama del ABB
buscarMin() buscarMax()
7 7
2 9 2 9
1 5 1 5
3 3
3 3 3
null
9
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)
2 9
1 5
7 5 1
2 9 2
2 7
1 5 3
1 3 9
5
3
10
Equilibrado, Altura y eMC de un ABB:
talla, instancias significativas y coste
En un ABB Equilibrado de altura H y tamaño N
23
11
El Problema de la Búsqueda sobre una Colección
de Datos: soluciones y costes sobre diferentes
Representaciones
24
Representación de un ABB
25
12
Ejemplo propuesto
26
13
Ejemplo propuesto: a partir de ArbolBinarioBusqueda, diseñar las
clases ABBDiccionario y ABBColaPrioridad para que implementen,
respectivamente, Diccionario y ColaPrioridad mediante un ABB
Cuestiones:
1. ¿ Cuál de los dos métodos de inserción de ArbolBinarioBusqueda
se lanza en ABBDiccionario ? ¿ y enABBColaPrioridad ?
2. Desde una aplicación que utiliza un Diccionario, ¿es correcto
ejecutar Diccionario d = new ArbolBinarioBusqueda()? ¿ Por qué ?
14
La clase ArbolBinarioBusqueda: métodos protected,
para la Herencia, sobre la Raíz de this ABB, i.e.
sobre un Nodo Binario de Búsqueda
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:
diseño Recursivo del método protected buscar
protected NodoBinario buscar(Object clave, NodoBinario n)
throws ElementoNoEncontrado {
/** Búsqueda Recursiva de clave en un Nodo Binario de Búsqueda ⇒
* Búsqueda Recursiva Binaria */
casoBase(talla(n))
if ( n == null ) throw )new
return soluciónBase(talla(n)); buscar ”+clave);
ElementoNoEncontrado(“al
else { int resC = ((Comparable)n.dato).compareTo(clave);
if ( mejorCaso()
( resC == 0 ) return
) return n;
soluciónMejorCaso();
else {if ( resC > 0 ) return buscar(clave, n.izq) ;
// Llamadas recursivas
else soluciónPeorCaso();
return return buscar(clave, n.der);
}
Ejercicio
} propuesto: diseño Iterativo del método
protected buscar
15
La clase ArbolBinarioBusqueda:
diseño Recursivo del método protected insertar
protected NodoBinario insertar(Object clave, NodoBinario n)
throws ElementoNoEncontrado {
/** 1.- Búsqueda Binaria con éxito del lugar de inserción de clave en n;
* 2.- Resolución: insertar allí el nuevo Nodo que contiene a clave */
if ( n == null ) return )new
casoBase(talla(n)) NodoBinario(clave);
return soluciónBase(talla(n));
else { int resC = ((Comparable)n.dato).compareTo(clave);
if ( mejorCaso()
( resC == 0 ) throw
) return new ElementoDuplicado(“al ...”);
soluciónMejorCaso();
else {
if ( resC > 0 ) n.izq = insertar(clave, n.izq) ;
n.der = insertar(clave, n.der);
else // Llamadas recursivas
return n;
return soluciónPeorCaso();
}
} Ejercicios propuestos:
• diseño Iterativo del método protected insertar
• diseño Recursivo del método insertarTodos
La clase ArbolBinarioBusqueda:
diseño Recursivo del método protected eliminar
return n;
}
16
La clase ArbolBinarioBusqueda: diseño de los método
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;
}
Ejercicios propuestos:
• diseño Iterativo de los métodos protected buscarMin y
eliminarMin
• diseño Recursivo e Iterativo de buscarMax y eliminarMax
35
17
El Problema de la Selección, otra vez
Cálculo del k-ésimo Dato más pequeño de una Colección
dea)talla
si laN,Colección
1≤k≤N se representa sobre un array
Ejemplo: 7,2,9,1,5,3, k = 3 y N = 6
7 2 9 1 5 3
/** Solución 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 Mínimo de la Colección en v[k-1] */
1 2 3 7 5 9
7 2 9 1 5 3
/** Solución 2 */ TquickSortmedio(N) ∈ O(N*logN)
public static void quickSort(Object
heapSort(Objectv[]){
v[]){
....
}
/** k-ésimo Mínimo de la Colección en v[k-1] */
1 2 3 7 5 9
18
El Problema de la Selección, otra vez
Cálculo del k-ésimo Dato más pequeño de una Colección
dea)talla
si laN,Colección
1≤k≤N se representa sobre un array
Ejemplo: 7,2,9,1,5,3, k = 3 y N = 6
7 2 9 1 5 3
/** Solución 3 */ TseleccionRapidamedio(N) ∈ O(N)
public static void seleccionRapida(Object v[], int k, int izq, int der){
1 5
k=1
tamañoNIzq = 4 3
• Si se imprime en InOrden un ABB resulta una Colección
Ordenada .... pero sigue siendo O(N)
• Mejor aún, ¿ dónde se encuentra el mínimo del ABB n ?
¿ y su segundo mínimo, k = 2 ?
...
¿ hasta que k se encontrará en n.izq ? hasta el 4º
19
El Problema de la Selección, otra vez
b) si la Colección se representa sobre un ABB
k=3 k=5 k = 10
n→ n→ n→
7 7 7
2 9 2 9 2 9
1 5 1 5 1 5
3 3 3
tamañoNIzq = 4 tamañoNIzq = 4 tamañoNIzq = 4
20
Mejorar la eficiencia de buscarKesimo (hasta
O(logN)) es mejorar la de tamaño (hasta Θ(1))
21
Modificaciones en la clase ArbolBinarioBusqueda
45
22