Versión Iterativa de recuperar en un. Soluciones Ejercicios Tema 11. protected NodoABB<E> recuperarmax(nodoabb<e> n) { while (n.der!= null) n = n.

Documentos relacionados
Versión Iterativa de recuperar en un. Ejercicios Tema 11. Implementa una versión del método recuperar iterativa con la siguiente especificación:

1. Árbol Binario de Búsqueda: Las clases Java NodoABB y ABB. 1. Definición y representación en Java 2. Operaciones y su coste estimado

Soluciones Ejercicios Tema 7. Cambio de Signo Pila (3/3) if (!p.esvacia()) { d i l cambiasignopila(p); this.apilar(new Integer(-dato));

Soluciones Ejercicios Tema 8

Mostrar Números Ascendentemente. Soluciones Ejercicios Tema 5. tostring Recursivo de LEG. Suma Recursiva de un Vector (1/3)

Estructuras de Datos Clase 14 Árboles binarios de búsqueda

TEMA 3. Árboles. Objetivos. Contenidos. Bibliografía. Básica

Programación II Arboles Binarios(AB)

Tema 4- Representación Enlazada

Implementar rehashing en TablaHash. Soluciones Ejercicios Tema 13. Implementar toarray en TablaHash. Radares de Tráfico (I)

Programación de sistemas Árboles

Árbol ABB equilibrado. Lección: Árboles. Algorítmica II (Tema 4) Lenguajes y Sistemas Informáticos, Universidad Pablo de Olavide 1/ 58

Programación II Árboles binarios de búsqueda (ABB)

Tema 8- El Árbol Binario de Búsqueda

Estructuras de Datos. 14 de junio de Apellidos

Estructura de Datos. Temario Unidad VI. Árboles Árboles Binarios

Tema 12- Implementación de Cola de Prioridad y Ordenación Rápida según un Montículo Binario

Propiedades (1/2) Soluciones Ejercicios Tema 14. Representación de Grafo (I) Propiedades (2/2) Grado del grafo: 6 V = 7 E = 12

Informe Tarea II. Estructura de Datos VPT (Vintage Point Tree)

Algoritmos y Estructuras de Datos. Guillermo Román Díez

Programación Estructuras Arborescentes

Árboles. Árboles. Árboles binarios de búsqueda. Árboles. Inserción en un árbol. Árbol binario de búsqueda

Ejercicios Tema 7. que tenga los mismos datos que la Pila original pero. Diséñese un método que invierta recursivamente una Cola dada.

INGENIERIA DE SISTEMAS 19 ESTRUCTURAS DE DATOS (Listas simples) ARBOLES

Tema 7- Modelo y Aplicación de Pila, Cola y. Tema 7- Modelo y Aplicación de. Lista Con Punto de Interés

Estructuras de datos Solemne 2

Tema 5- Diseño Recursivo y Eficiente. Tema 5- Diseño Recursivo y. Descomposición recursiva ascendente de un vector. Etapas del diseño recursivo

Estructura de datos y de la información Boletín de problemas - Tema 10

Estructuras de Datos y Algoritmos. Curso 2004/05 Tema 6. Árboles y Árboles Binarios

Colas Implementación con gestión estática de memoria

Unidad Didáctica 2. Elementos básicos del lenguaje Java Tipos, declaraciones, expresiones y asignaciones

Algoritmos y Estructuras de Datos Tema 2: Diseño de Algoritmos

Grados Ing. Inf. y Mat. Inf. Noviembre 2011 Algoritmos y Estructura de Datos Página 1 de 6

Propiedades. Ejercicios Tema 14. Representación de Grafo. Grado de Grafo (Matriz de Adyacencia)

PROGRAMA EDUCATIVO INFORMATICA ADMINISTRATIVA

Descubrir los árboles como paradigma de los tipos Recursivos de Datos

Algoritmos y Estructuras de Datos: Introducción a la Recursión de Programas. Guillermo Román Díez

CLAVE EXAMEN: a cd. c u r s o r = c u r s o r. g e t S i g u i e n t e ( ) ; p o s i c i o n ++;

ÁRBOLES BINARIOS DE BÚSQUEDA (ABB)

/** * Raíz del árbol de contactos presentes en el directorio */ private. /** * Número de contactos en el directorio */ private int numcontactos;

Temario. Tema 5. Estructuras de Datos no Lineales. 5.1 Árboles Binarios 5.2 Árboles n-arios

El método main de la clase PruebaArbol, empieza creando una instancia de un objeto Árbol vacío y asigna su referencia a la variable árbol

Tema 10: Árbol binario de búsqueda

Estructura de Datos. Árboles Binarios de Búsqueda ABB. Primer Semestre, 2010

NIVEL 15: ESTRUCTURAS RECURSIVAS BINARIAS

UNIVERSIDAD NACIONAL AUTÓNOMA DE MÉXICO

Programación de sistemas

TEMA 4. Árboles CONSIDERACIONES GENERALES.

Definición de árbol. Árboles

Soluciones Ejercicios Tema 3

Algoritmos y Estructuras de Datos Iteradores. Guillermo Román Díez

Contenido PARTE II: ESTRUCTURAS DE DATOS AVANZADAS

Tema 7: Árboles ESTRUCTURAS DE DATOS 1

Estructura de Datos Unidad 6: ARBOLES

Estructuras de datos y algoritmos

IMPLEMENTACIÓN DE PILAS CON LISTAS EN C++

Para la resolución de los ejercicios, se dispone de una implementación de árbol binario a través de la clase BinTree con la siguiente especificación.

Titulación: Ingeniero Técnico en Informática de Gestión Curso: 2º Nombre y apellidos: Nota:

Tema 5- Diseño Recursivo y. Objetivos Principales. Bibliografía Básica

A) PREORDEN B) INORDEN C) POSTORDEN D) NIVELES

Estructuras de Datos ARBOLES Y GRAFOS

dit UPM Tema 2: Algoritmos /ordenación /java Análisis y diseño de software José A. Mañas

Estructuras de Datos Clase 10 Árboles binarios

Depto. Ingeniería de Sistemas Telemáticos Universidad Politécnica de Madrid ETSI Telecomunicación Fundamentos de Programación 15 de diciembre de 2011

Representaciones de árboles

Segundo parcial de Programación 2

Agradecimientos. Nota de los autores. 1 Problemas, algoritmos y programas 1

1. Leer el primer número y almacenarlo en la raíz del árbol. 2. Repetir hasta encontrar un duplicado o el árbol esté vacío.

Programación II - TP1 1er Cuatrimestre 2018

Tema 5- Diseño Recursivo y. Ordenación Vectorial: Inserción Directa (II) Ordenación Vectorial: Inserción Directa. Tema 5- Diseño Recursivo y Eficiente

Titulación: Ingeniero Técnico en Informática de Gestión Curso: 2º. Leonardo DaVinci. Piccasso La Tempestad. Mona Lisa

Estructuras de Datos Clase 20 Árboles de búsqueda

Práctica 5. Fecha límite de entrega: viernes, 14 de diciembre

ÁRBOL BINARIO. T der. Árbol binario homogéneo es aquel cuyos nodos tienen grado 0 ó 2(no hay ninguno de grado 1).

ESTRUCTURA DE DATOS Y ALGORITMOS Titulación: Ingeniero Técnico en Informática de Gestión Curso: 2º Nombre y apellidos: Nota:

FUNDAMENTOS DE INFORMÁTICA

Estructuras de Datos y de la Información Ingeniería Técnica en Informática de Gestión. Curso 2007/2008 Ejercicios del Tema 2

Instituto de Computación. Facultad de Ingeniería. Universidad de la República Examen de Programación 2 03 de Agosto de 2006 Generalidades:

ARBOLES BINARIOS ORDENADOS. REPRESENTACIÓN Y OPERACIONES

Tema 6- Estructuras de Datos: Jerarquía de. Tema 6- Estructuras de Datos: Jerarquía de una EDA

Introducción: una simple colección

FUNDAMENTOS DE PROGRAMACIÓN - Septiembre 2010

ADSW Tema 2 Diccionarios

Estructuras de Datos. Clase 20 Árboles de búsqueda. Dr. Sergio A. Gómez.

ESTRUCTURA DE DATOS Y ALGORITMOS Titulación: Ingeniero Técnico en Informática de Gestión Curso: 2º Nombre y apellidos: Nota:

Clase adicional 9. Listas enlazadas. Temas. Listas enlazadas Árboles Problemas de la clase adicional Ejercicios de diseño

Construcciones del Lenguaje Java

<tipo> Tipo de dato de los elementos del vector

ESTRUCTURA DE DATOS Y ALGORITMOS Titulación: Ingeniero Técnico en Informática de Gestión Curso: 2º

Estructuras de datos Solemne 2

Algoritmos Iterativos de Búsqueda y Ordenación y sus tiempos

Listas ordenadas Implementación

Centro Asociado Palma de Mallorca. Antonio Rivero Cuesta

Unidad Didáctica 3. Tipos genéricos. Fundamentos de Programación Departamento de Lenguajes y Sistemas Informáticos

PRIMER EXAMEN PARCIAL. 5 de febrero de SOLUCIONES

Sólo una opción es correcta en cada pregunta. Cada respuesta correcta suma 1 4. puntos. Cada respuesta incorrecta resta 1 12

Estructuras de Datos. Clase 10 Árboles binarios

Tema 8- Implementación de Pila, Cola y. Tema 8- Implementación de Pila, Cola y Lista con Punto de Interés. Representación Eficaz de una EDA

Árboles Binarios Ordenados Árboles AVL

ESTRUCTURA DE DATOS Y ALGORITMOS Titulación: Ingeniero Técnico en Informática de Gestión Curso: 2º Nombre y apellidos: Nota:

Transcripción:

Versión Iterativa de recuperar en un ABB Soluciones Ejercicios Tema 11 Germán Moltó Martínez gmolto@dsic.upv.es Estructuras de Datos y Algoritmos Escuela Técnica Superior de Ingeniería Informática Universidad Politécnica de Valencia protected NodoABB<E> recuperar (E clave, NodoABB<E> n) throws ElementoNoEncontrado{ boolean esta = false; while ( n!= null &&!esta ){ int resc = n.dato.compareto(clave); if (resc < 0) n = nder; n.der; else if (resc > 0) n = n.izq; else esta = true; if (!esta) throw new ElementoNoEncontrado("El elemento " + clave + " no está"); else return n; 1 2 Versión iterativa de insertarconduplicados protected NodoABB<E> insertarconduplicados(e clave, NodoABB<E> n){ NodoABB<E> aux = n, padreaux = null; int resc = 0; while ( aux!= null ) { resc = aux.dato.compareto(clave); numtotalcomparaciones++; padreaux = aux; if ( resc < 0 ) aux = aux.der; else aux = aux.izq; NodoABB<E> nuevo = new NodoABB<E>(clave); if ( padreaux == null ) n = nuevo; else if ( resc < 0 ) padreaux.der = nuevo; else padreaux.izq = nuevo; numtotalinserciones++; return n; 3 Versiones Alternativas protected NodoABB<E> recuperarmax(nodoabb<e> n) { while (n.der!= null) n = n.der; return n; protected NodoABB<E> recuperarmin(nodoabb<e> n){ if (n.izq!= null ) return recuperarmin(n.izq); else return n; 4

Número de Hojas de ABB (1/3) public class ABB<E extends Comparable<E>>{ public int numerohojas(){ return numerohojas(raiz); protected int numerohojas(nodoabb<e> n){ if ( n == null) return 0; else if (n.izq == null && n.der == null) return 1; else return numerohojas(n.izq) + numerohojas(n.der); 5 Número de Hojas de ABB (2/3) Notación: numhojas(i) significa la invocación al método numhojas pasándole como argumento la referencia al NodoABB<E> que contiene el objeto i. Órden en el que se producen las llamadas recursivas: numhojas(10) numhojas(5) numhojas(4) numhojas(6) numhojas(11) numhojas(null) numhojas(15) Órden en el que finalizan las llamadas recursivas: numhojas(4) numhojas(6) numhojas(5) numhojas(null) numhojas(15) numhojas(11) numhojas(10) 6 Número de Hojas de ABB (3/3) Estilo de implementación alternativo, donde el caso base es tener una hoja. public int numerohojas(){ if (raiz!= null) return numerohojas(raiz); else return 0; protected int numerohojas(nodoabb<e> n){ int nhojas = 0; if (n.izq == null && n.der == null) nhojas = 1; else { if (n.izq!= null) nhojas += numerohojas(n.izq); if (n.der!= null) nhojas += numerohojas(n.der); ( d ) return nhojas; 7 Borrar Hojas de ABB public class ABB<E extends Comparable<E>>{ public void borrarhojas(){ if ( this.raiz!= null ) this.raiz = borrarhojas(this.raiz); 8 protected NodoABB<E> borrarhojas(nodoabb<e> n){ NodoABB<E> res = n; if ( n.izq == null && n.der == null ) res = null; else{ if ( n.izq!= null ) n.izq = borrarhojas(n.izq); if ( n.der!= null ) n.der = borrarhojas(n.der); (

Esfuerzo Medio de Comparación Óptimo public double emcoptimo(){ 9 double res = Double.NaN; if (!sehaeliminado ){ double log2tamanyo = Math.log(this.tamanyo())/Math.log(2); ()) ); long alturaoptima = Math.round(Math.floor(log2Tamanyo)); long valor = 1, aux = 1, numnodos=1; for (int i = 1; i <= alturaoptima ; i++){ aux = aux*2; numnodos += aux; valor += aux * (i+1); res = ((double)valor)/numnodos; ; Mostrar los Nodos de un Cierto Nivel //SII 0 <= k <=altura(): public String tostringnivel(int t k){ if ( this.raiz!= null ) return tostringnivel(k, this.raiz); else return "*"; protected String tostringnivel(int k, NodoABB<E> n){ String res = ""; if ( k == 0 ) res += n.dato.tostring()+" "; // Caso base else { if( n.izq!= null ) res += tostringnivel(k-1, n.izq); if( n.der!= null ) res += tostringnivel(k-1, (, n.der); 10 Suma de Elementos Mayores o Igual public class ABBInteger extends ABB<Integer>{ public int sumarmayoroigual(int x) { return sumarmayoroigual(this.raiz, x); protected int sumarmayoroigual(nodoabb<integer> n, int x) { int suma=0; if (n!=null) { int valorraiz= n.dato.intvalue(); if (valorraiz>=x) suma +=valorraiz; if (valorraiz>x) suma += sumarmayoroigual(n.izq, x); suma += sumarmayoroigual(n.der,x); return suma; 11 Construcción ABB Equilibrado Sea N = v.length el número de elementos de v. Al estar ordenados y ser distintos entre sí, su elemento central es mayor que los (N/2) -1 elementos anteriores y menor que los (N/2) 1 elementos posteriores. La propiedad se puede aplicar recursivamente a los subvectores resultantes. private NodoABB<E> seconstruye(e v[], int izq, int der){ NodoABB<E> nuevo = null; if ( izq <= der ){ int centro = (izq+der)/2; nuevo = new NodoABB<E>(v[centro]); nuevo.izq = seconstruye(v, izq, centro-1); nuevo.der = seconstruye(v, centro+1, der); return nuevo; 12

Construcción ABB Equilibrado (II) Complejidad temporal del método seconstruye: Talla del problema: Viene dada por la expresión n = der izq + 1. En la llamada más alta coincide con v.length. Instancias Significativas: NO existen, puesto que se trata de un recorrido recursivo. Siempre se visitarán todas las componentes del vector. Relaciones de recurrencia: T seconstruye (n>0) = 2* T seconstruye (n/2) + k T seconstruye (n=0) = k Acotando con el Teorema 3 (a = 2, c = 2): T seconstruye ЄΘ(v.length) Cálculo del Sucesor protected NodoABB<E> sucesor(e clave,nodoabb<e> n) throws ElementoNoEncontrado { NodoABB<E> ascender=null; boolean encontradaclave=false; while ( n!=null &&!encontradaclave){ int resc = n.dato.compareto(clave); if (resc<0) {n=n.der; else if (resc>0) {ascender = n; n = n.izq; else encontradaclave=true; if (!encontradaclave ) throw new ElementoNoEncontrado( No esta"); else if (n.der!=null) return recuperarmin(n.der); else return ascender; 13 14 tostring en ABBColaPrioridad Aprovechamos el conocimiento de que un recorrido en inorden de un Árbol Binario de Búsqueda obtiene los elementos en orden ascendente. public String tostring(){ return tostringinorden(); 15 Cambia Signo Árbol Binario de Búsqueda public class ABBInteger extends ABB<Integer>{ public void cambiarsigno() { cambiarsigno(raiz); protected void cambiarsigno(nodoabb<integer> n) { if (n!= null) { int dato = n.dato.intvalue(); n.dato = new Integer(-dato); NodoABB<Integer> aux = n.izq; nizq; n.izq = n.der; n.der = aux; cambiarsigno(n.izq); ( i ) cambiarsigno(n.der); 16

Padre de un Nodo en un ABB public NodoABB<E> padre(e x, NodoABB<E> n){ NodoABB<E> p = null; boolean esta = false; while (n!= null &&!esta){ int resc = n.dato.compareto(x); if (resc>0) {p = n; n = n.izq; else if (resc<0) {p = n; n = n.der; else esta=true; if (esta) return p; else return null; ; Fuera de Intervalo (1/2) public int fueraderango(e x, E y) { return fueraderango(x,y, this.raiz); 17 18 Fuera de Intervalo (2/2) protected int fueraderango(e x, E y, NodoABB<E> actual) { int res = 0; if (actual!=null) { if ( actual.dato.compareto(y)>0 compareto(y)>0 ) res+= 1+ tamanyo(actual.der)+ fueraderango(x,y,actual.izq); else if ( actual.dato.compareto(x)<0 ) res+= 1+ tamanyo(actual.izq)+ fueraderango(x,y,actual.der); else res+= fueraderango(x,y,actual.izq) + fueraderango(x,y,actual.der); actual 19 Coste Temporal de Contar Mayores (I) Talla del Problema en función de los argumentos: Talla = actual.tamanyo (o tamanyo(actual)) Instancias Significativas? No las hay, es un problema de recorrido que tiene que procesar todos los nodos del ABB. Relaciones de recurrencia para un ABB equilibrado: T contarmayoresque (x = 0) = k2 T contarmayoresque (x > 0) = 2 * T contarmayoresque (x/2) + k3 Relaciones de recurrencia para un ABB degenerado: T contarmayoresque (x = 0) = k2 T contarmayoresque( (x > 0) = 1 * T comparar( (x-1) + k3 20

Coste Temporal de Contar Mayores (II) Coste temporal asintótico: Si actual es un nodo de un ABB completamente degenerado: por Teorema 1 con a = c =1 y sobrecarga constante: T contarmayoresque (x) (x) Si actual es un nodo de un ABB equilibrado: por Teorema 3 con a = c = 2 y sobrecarga constante: T contarmayoresque (x) (x) Se obtienen las mismas cotas porque es un problema de recorrido y, al final, hay que procesar todos los nodos. Solución Eficiente a Contar Mayores protected int contarmayoresque(e x, NodoABB<E> actual) { int res =0; if ( actual!= null ){ int resc = actual.dato.compareto(x); if ( resc == 0 ) res += tamanyo(actual.der); else if ( resc > 0 ) res += 1 + tamanyo(actual.der) + contarmayoresque(x, actual.izq); else res += contarmayoresque(x, actual.der); 21 22 tostring Ordenado Ascendentemente public String tostringoamayoresque(e e) throws ElementoNoEncontrado{ String res=tostringoamayoresque(e, this.raiz); if ( res.equals("") ) throw new ElementoNoEncontrado("No existe ); protected String tostringoamayoresque (E e, NodoABB<E> actual){ String res = ""; if ( actual!= null ){ if ( actual.dato.compareto(e) > 0 ){ res+=tostringoamayoresque (e, actual.izq) + actual.dato.tostring(); res+=tostringoamayoresque(e, actual.der); 23 Mediana en ABB public boolean esmediana(e x) { NodoABB<E> aux = this.raiz; int mayores = 0, int menores = 0; boolean fin = false; while ( aux!=null &&!fin ) { int resc = aux.dato.compareto(x); if (resc < 0) { menores += 1 + tamanyo(aux.izq); aux = aux.der; ; else if (resc > 0) { mayores += 1 + tamanyo(aux.der); aux = aux.izq; else { menores += tamanyo(aux.izq); mayores += tamanyo(aux.der); fin = true; return (mayores == menores); 24

Altura de Equilibrado public int alturadeequilibrado() throws ABBNoEquilibrado { return alturadeequilibrado(this.raiz); protected int alturadeequilibrado(nodoabb<e> actual) throws ABBNoEquilibrado{ if ( actual == null) return -1; else{ int alturaizq = alturadeequilibrado(actual.izq); 25 int alturader = alturadeequilibrado(actual.der); int diff = Math.abs(alturaIzq - alturader); if ( diff > 1 ) throw new ABBNoEquilibrado( Nodo Nodo Desequilibrado "); return 1+Math.max(alturaIzq, alturader); tostring en Rango (I) 1. Ecuaciones de Recurrencia si es un Nodo Equilibrado TtoStringRango(x = 0) = k2 TtoStringRango(x > 0) = 2 * TtoStringRango (x/2) + k3 2. Relaciones de Recurrencia si es Nodo degenerado T tostringrango g (x = 0) = k2 T tostringrango (x > 0) = 1 * T tostringrango (x-1) + k3 3. Cotas de Complejidad Temporal Asintótica 26 En ambos casos: T tostringrango (x) (x) Se trata de un problema de recorrido, no hay instancias significativas y el coste es lineal con el número de elementos. tostring en Rango (II) protected String tostringenrango(nodoabb<e> actual, E inf, E sup){ String res = ; if ( actual!= null ) { int rinf = actual.dato.compareto(inf); compareto(inf); int rsup = actual.dato.compareto(sup); if ( rinf < 0 ) res += tostringenrango(actual.der, g (, inf, sup); else if ( rsup > 0 ) res += tostringenrango(actual.izq, inf, sup); else { // inf <= dato <= sup res += tostringenrango(actual.izq, inf, sup); res += actual.dato.tostring()+"\n"; res += tostringenrango(actual.der, inf, sup); 27