Estrategias de Programación & Estructuras de Datos
-
Upload
javier-velez-reyes -
Category
Education
-
view
204 -
download
8
Transcript of Estrategias de Programación & Estructuras de Datos
JavierVé[email protected]
DepartamentodeLenguajesYSistemasInformáAcosUNED
EstrategiasdeprogramaciónyestructurasdedatosGradoenIngenieríaInformá8ca
Gradoentecnologíasdelainformación
DepartamentodeLenguajesySistemasinformáAcosUniversidadNacionaldeEducaciónaDistancia
1er Curso
JavierVé[email protected]áAcosUNED
Estrategiasd
eprogramaciónyestructurasd
eda
tos
Grado
enIngenieríaIn
form
á8ca.Grado
entecnologíasd
elainform
ación
Departam
entodeLenguajesy
Sistem
asinform
á6cos
ParteIIntroducción
EstrategiasdeprogramaciónyestructurasdedatosGradoenIngenieríaInformá8ca
GradoenTecnologíasdelaInformaciónDepartamentodeLenguajesySistemasinformá6cos
JavierVélezReyes [email protected]
DepartamentodeLenguajesYSistemasInformáAcosUNED
0PresentaciónEstrategiasdeprogramaciónyestructurasdedatos
Presentación
Javier Vélez Reyes [email protected] 0 - 2
Estrategiasdeprogramaciónyestructurasdedatos
Títulodelaasignatura
Código
Númerodecréditos
Tipo
Curso
Estrategiasdeprogramaciónyestructurasdedatos
71901043
6–ECTS(150horas)
TroncalAnual
1º
Julio Gonzalo Arroyo (Coordinador) e-mail : [email protected] Lugar: ETSI Informática – UNED Horario de tutorías: Jueves 16:00 a 20:00 José Ignacio Mayorga Toledano (profesor) e-mail : [email protected] Lugar: ETSI Informática – UNED Horario de tutorías: Jueves 16:00 a 20:00
I.Datosdelaasignatura
II.EquipodocenteFernando López Ostenero (Profesor) e-mail : [email protected] Lugar: ETSI Informática – UNED Horario de tutorías: Jueves 16:00 a 20:00 Tutor de Apoyo en Red e-mail : [email protected] Foros de la asignatura
Presentación
Javier Vélez Reyes [email protected] 0 - 3
III.Atenciónalalumno
› Entorno virtual - http://virtual.uned.es - Material didáctico - Foros de atención al alumno ›Páginaoficialdelaasignatura-hOp://www.lsi.uned.es/eped-Transparencias-Consultadenotas›Equipodocenteensedecentral-Porcorreo-Porteléfono-Presencialmenteenhorariodeguardias
Estrategiasdeprogramaciónyestructurasdedatos
Presentación
Javier Vélez Reyes [email protected] 0 - 4
Estrategiasdeprogramaciónyestructurasdedatos
IV.Obje8vosgeneralesdelaasignatura
› Obtener un conocimiento de los principales tipos de datos
› Adquirir la capacidad de usar esos tipos en contextos realistas de aplicación
› Aprender algoritmos típicamente aplicados sobre estos tipos de datos
› Adquirir soltura en la aplicación de estrategias algorítmicas de carácter recursivo
› Adquirir soltura en la aplicación de estrategias algorítmicas de carácter iterativo
› Obtener capacidad para analizar y comparar la eficiencia de los algoritmos
› Aprender a diseñar, formalizar e implementar los tipos de datos
› Adquirir una actitud crítica del uso de tipos de datos en la orientación a objetos
Presentación
Javier Vélez Reyes [email protected] 0 - 5
Estrategiasdeprogramaciónyestructurasdedatos
V.ContenidosdelaasignaturaParte I. Introducción
1. Las Estructuras de datos desde la OOP
2. Estrategias de programación
3. Análisis de la eficiencia de algoritmos
4. Tipos Abstractos de Datos
Parte II. Tipos lineales de datos
5. Listas
6. Pilas
7. Colas
Parte III. Tipos jerárquicas de datos
8. Árboles generales
9. Árboles binarios
10. Árboles binarios de búsqueda
Presentación
Javier Vélez Reyes [email protected] 0 - 6
Estrategiasdeprogramaciónyestructurasdedatos
VI.Trabajoarealizar
› 1 prueba presencial
› Preguntas de teoría
› Ejercicios prácticos
› Práctica
› Carácter individual y obligatorio
› Diseño e implementación de un problema de tipos de datos orientados a objetos
› 1 sesión de control en el Centro Asociado de asistencia obligatoria
22
VII.Normasdeevaluación
0.8NE+0.2NP>=5.0› 2 convocatorias anuales (Junio y septiembre)
› Notas
› NE = Nota Examen
› NP = Nota Práctica
JavierVé[email protected]
DepartamentodeLenguajesYSistemasInformáAcosUNED
EstrategiasdeprogramaciónyestructurasdedatosGradoenIngenieríaInformá8ca
GradoenTecnologíasdelaInformaciónDepartamentodeLenguajesySistemasinformá6cos
1IntroducciónLasestructurasdedatosdesdelaorientaciónaobjetos
Introducción
Javier Vélez Reyes [email protected] 1 - 2
Índice
Índice
› Introducción
› Programación orientada a objetos
› ¿Qué es la programación orientada a objetos?
› Mecanismos de la programación orientada a objetos
› Fundamentos de la programación orientada a objetos
› Anatomía de Clases
› Bibliografía
Introducción
Javier Vélez Reyes [email protected] 1 - 3
Obje6vosgenerales
Obje8vos
› Obtener una visión histórica de la evolución de la programación
› Entender el papel que juega la orientación a objetos dentro de la programación
› Entender las principales características de la programación estructurada
› Entender las principales características de la programación orientada a objetos
› Apreciar los factores diferenciales entre ambos paradigmas
› Adquirir habilidades de análisis acerca de cuándo conviene usar uno y otro
› Valorar las capacidades de la orientación a objetos en el marco de los TADS
› Valorar el avance conceptual que supone trabajar con TADS dentro de objetos
› Obtener una actitud critica para valorar el uso y diseño de en OOP
Introducción
Javier Vélez Reyes [email protected] 1 - 4
Introducción
Introducción
Programación estructurada
Programación orientada a objetos
Tipos abstractos de datos
I. Programación estructurada Elparadigmadeprogramaciónestructuradacentralaconstruccióndeso@wareenlacreacióndeabstraccionesfuncionalesorganizadas deformacomposi6vadeacuerdoaunaestructurajerárquica
El programa principal se descompone funcionalmente en subproblemas que a su vez se descomponen funcionales en abstracciones más sencillas hasta llegar a operaciones atómicas El problema de esta aproximación es que se asume, irrealistamente, que la especificación del problema no cambia a lo largo del tiempo de desarrollo del proyecto. Además la reutilización de cada descomposición está confinada al contexto funcional donde aparece implicado
} Garaje
Diagnos6co Reparación
Eléctrica Mecánica
Vehículo
Introducción
Javier Vélez Reyes [email protected] 1 - 5
Introducción
Introducción
Programación estructurada
Programación orientada a objetos
Tipos abstractos de datos
II. Tipos abstractos de datos Con el ánimo de fomentar la reu6lización de código se buscanartefactosmás estables dentro de la evolución del desarrollo de losproductos de so@ware. Las abstracciones de datos, que organizandatosdeacuerdoadeterminadalógicaestructuralsonloscandidatosidóneos
Vehículo
} Garaje
Diagnos6co Reparación
Eléctrica Mecánica
usa
Si b ien e l p roceso de construcción de software sigue estando basado en abstracciones funcionales, ahora se realizan abstrac-c i o n e s d e d a t o s q u e representan entidades del dominio del problema que se van transformando a lo largo del árbol de descomposición
Introducción
Javier Vélez Reyes [email protected] 1 - 6
Introducción
Introducción
Programación estructurada
Programación orientada a objetos
Tipos abstractos de datos
III. Programación orientada a objetos El programación orientada a objetos proporciona los mecanismosnecesarios de los que adolece el paradigma estructurado paraar6cular soluciones completamente centradas en abstracciones dedatos
Vehículo
+arrancar()+parar()
Garaje
+Reparar(Vehículov)
usa
} Ahora toda la arquitectura software de la solución se articula en términos de un ecosistema de abstracciones de datos (objetos) que colaboran entre si por medio del envío de mensajes (invocaciones de operaciones) La ventaja de esta aproximación es que permite central preliminarmente el desarrollo en la construcción de las abstracciones y postergar el cuerpo funcional para las últimas fases del proyecto, que se expresa como un algoritmo distribuido entre objetos
Introducción
Javier Vélez Reyes [email protected] 1 - 7
Programaciónorientadaaobjetos
¿Quéeslaprogramaciónorientadaaobjetos?Laconstruccióndeso@wareorientadoaobjetoseselmétododedesarrolloso@warequebasalaarquitecturadeunsistemaso@wareenartefactosdeducidosdelos6posdeobjetosque éstemanipula en lugar de basarse en la función o funciones a las cuales el sistemadeberesponder
Programación estructurada
Programación orientada a objetos
Descomposición funcional descendente
Ecosistema de colaboración entre objetos
A
B C
D E
a:A b:B
c:C
Desarrollo centrado en
abstracciones funcionales
Desarrollo centrado en
abstracciones de datos
– Nivel de reutilización +
Introducción
Javier Vélez Reyes [email protected] 1 - 8
Programaciónorientadaaobjetos
MecanismosbásicosdelaprogramaciónorientadaaobjetosElparadigmadeprogramaciónorientadaaobjetossear6cula,esencialmente,atravésdecuatromecanismosfundamentales:Clases,métodos,objetosymensajes.Deellos losdosprimeros6enenlugarenfasedediseño,mientrasquelossegundoscorrespondenalafasedeejecución
I.Clases
Una clase es una especificación formal y computable que seu6liza para construir objetos de un mismo 6po en fase deejecución. Internamente está descrita en términos de unacoleccióndeatributosyunaseriedeoperaciones
Fasedediseño
Coche
-marca-modeloII.Métodos
La coleccióndemétodosdeuna clasedefine las capacidadesdelamismayconformauncontratoprogramá6co(API) paraacceder o alterar los atributos de la misma. Los métodosocultan su implementación a resto de clases demanera queéstas se perciben unas a otras como artefactos concapacidadesdesencillainvocación
+getMarca()+getModelo()
clase
métodos
atributos
Introducción
Javier Vélez Reyes [email protected] 1 - 9
Programaciónorientadaaobjetos
MecanismosbásicosdelaprogramaciónorientadaaobjetosElparadigmadeprogramaciónorientadaaobjetossear6cula,esencialmente,atravésdecuatromecanismosfundamentales:Clases,métodos,objetosymensajes.Deellos losdosprimeros6enenlugarenfasedediseño,mientrasquelossegundoscorrespondenalafasedeejecución
III.Objetos
Unobjetoesunejemplardeunaclasequeresideenmemoriadurante cierto 6empo en la fase de ejecución. Está formadopor un estado definido a par6r del valor que toma en cadamomentocadaatributodelaclaseeneseejemplar
Fasedeejecución
IV.Mensajes
El acto de invocación de un métodos sobre un objeto en6empo de ejecución se refiere como envío de mensaje. Enorientación a objetos los algoritmos son colaboración entreobjetos expresadas en términos de mensajes que fluyen deunos a otros. Cada mensaje 6ene como efecto ejecutar elalgoritmodelmétododescritoenlaclase
miCoche:Coche
-‘Renault’-‘Clio’
objeto
estado
Cliente
miCoche.getMarca()‘Renault’
mensaje
respuesta
Introducción
Javier Vélez Reyes [email protected] 1 - 10
Programaciónorientadaaobjetos
Fundamentosdelaprogramaciónorientadaaobjetos
I.Abstracción
Lo que convierte a la programación orientada a objetos en el paradigma idóneo pararealizar diseño de sistemas centrados en abstracciones de datos es el uso de 6caracterís6casfundamentales:abstracciónencapsulación,herencia,polimorfismo,ligaduradinámicaygenericidad
Laabstraccióneselprocesomedianteelcualdescribimosunarealidaddeldominiodelproblema para crear una representación simplificada dentro del dominio de solución.Esta simplificación se basa en la supresión, conversión o adaptación de caracterís6casrealesenatributossistémicosysellamaabstraccióndedatos
Motor
- combustible- nCilindros- fabricante- modelo
Dominio de la solución Dominio del problema
abstracción
Introducción
Javier Vélez Reyes [email protected] 1 - 11
Programaciónorientadaaobjetos
Fundamentosdelaprogramaciónorientadaaobjetos
II.Encapsulación
Lo que convierte a la programación orientada a objetos en el paradigma idóneo pararealizar diseño de sistemas centrados en abstracciones de datos es el uso de 6caracterís6casfundamentales:abstracciónencapsulación,herencia,polimorfismo,ligaduradinámicaygenericidad
La encapsulación es el proceso por el cual la colección demétodos de una clase protege el acceso ilegal al estado de unobjetoporpartedeotrosobjetossegúnla lógicadenegocio.Deestaformalosatributosnosondirectamentealterablessinosóloatravésdelosmétodosdelaclase
Coche
- presión- ...
+getPresión()+setPresión(p)
MecánicosetPresión(6)
Según los requisitos, una presión de 6 es excesiva, por lo tanto la
implementación del método de la clase provoca que el mensaje no
cause ningún efecto
estado
métodos
Introducción
Javier Vélez Reyes [email protected] 1 - 12
Programaciónorientadaaobjetos
Fundamentosdelaprogramaciónorientadaaobjetos
II.Encapsulación
Lo que convierte a la programación orientada a objetos en el paradigma idóneo pararealizar diseño de sistemas centrados en abstracciones de datos es el uso de 6caracterís6casfundamentales:abstracciónencapsulación,herencia,polimorfismo,ligaduradinámicaygenericidad
Al ar6cular la encapsulación es posible definir diferentesmodificadores de acceso a loselementosdeunaclase (atributosymétodos).Estosmodificadoresalteran las reglasdevisibilidaddeloselementosdesdeelexteriordelaclase
Modificadores de visibilidad
de Java
Modificador private
Modificador public
Modificador protected
Un elemento definido como privado sólo esaccesibledesdedentrodelaclasedondesehadeclaradoelelemento
Un elemento definido como público sólo esaccesibleportodoslosobjetosdelsistema
Un elemento protegido es accesible por lapropiaclaseyporcualquier clasehijadeestáasí como cualquier clase perteneciente alpaquetedondeéstaestádefinida
Coche
- Marca- Modelo
+getMarca()+getModelo()#isPlanRenove()
Introducción
Javier Vélez Reyes [email protected] 1 - 13
Programaciónorientadaaobjetos
Fundamentosdelaprogramaciónorientadaaobjetos
III.Herencia
Lo que convierte a la programación orientada a objetos en el paradigma idóneo pararealizar diseño de sistemas centrados en abstracciones de datos es el uso de 6caracterís6casfundamentales:abstracciónencapsulación,herencia,polimorfismo,ligaduradinámicaygenericidad
La herencia es unmecanismoque permite organizarunconjuntodeclasesdeacuerdoauna jerarquía.Larelación que se establece entre ellas es interpretadacomounaespecialización/generalizaciónyseleedela formaAesunB.Mediante laherencia,sepuedencompar6r datos y métodos miembro entre clases ysubclases.Unaclasehijaobtendráaccesoatodoslosatributos públicos o protegidos declarados en susclases antecesoras. Asimismo, adquirirá laimplementaciónde losmétodosmiembropúblicosoprotegidosenellasdeclarados.Porsuparte,lasclaseshijas pueden especializar la funcionalidad de losmétodos heredados del padre por medio de lasobrescritadesuimplementación.
+arrancar()+parar()
Vehículo
Moto
+arrancar()+parar()
+arrancar()+parar()
Camión
-capacidad
#nRuedas
+arrancar()+parar()+llenar()+vaciar()
Coche
Introducción
Javier Vélez Reyes [email protected] 1 - 14
Programaciónorientadaaobjetos
Fundamentosdelaprogramaciónorientadaaobjetos
III.Herencia
Lo que convierte a la programación orientada a objetos en el paradigma idóneo pararealizar diseño de sistemas centrados en abstracciones de datos es el uso de 6caracterís6casfundamentales:abstracciónencapsulación,herencia,polimorfismo,ligaduradinámicaygenericidad
La herencia permite diferir la implementación de losmétodos a alguna de las clases hijas para que haganuna implementación especializada. En este sen6dopodemoshablarde:
A.MétodosabstractosUn método del que se quiere diferir laimplementación debe declarase comoabstracto. Esto permite encontrar diferentesimplementacionesencadaclase
B.ClaseabstractaUn clase con métodos abstractos debedeclararse abstracta y no es directamenteinstanciable
+arrancar()+parar()
Vehículo
Moto
+arrancar()+parar()
+arrancar()+parar()
Camión
-capacidad
#nRuedas
+arrancar()+parar()+llenar()+vaciar()
Coche
Introducción
Javier Vélez Reyes [email protected] 1 - 15
Programaciónorientadaaobjetos
Fundamentosdelaprogramaciónorientadaaobjetos
III.Herencia
Lo que convierte a la programación orientada a objetos en el paradigma idóneo pararealizar diseño de sistemas centrados en abstracciones de datos es el uso de 6caracterís6casfundamentales:abstracciónencapsulación,herencia,polimorfismo,ligaduradinámicaygenericidad
Las jerarquías de herencia prescriben ciertas restricciones con respecto a la forma deaplicarlalógicadeconstruccióndelosobjetos.Elprogramadorpuedealterarestalógicamedianteelusodelosconstructoresimplícitosthisysuper.
A.ConstruccióndelegadaEn la instanciación de objetos, antes deejecutar la lógica de creación del constructorinvocado, se llama al constructor sinargumentos (u). El uso del constructorimplícito this como primera instrucción de lalógica de creación permite alterar estecomportamientoforzandoaqueseu6liceotroconstructor sobrecargado con ciertosparámetrosdeconstrucciónactuales(v)
Vehículo
+Coche()
+Coche(Stringmarca)
+Coche(intruedas)
+Vehiculo()
Coche
Coche (4)
Coche (‘Renault’)
Coche ()
this(
‘ren
ault
’);
this.n
Rued
as=
rue
das;
..
.
v u
v
Introducción
Javier Vélez Reyes [email protected] 1 - 16
Programaciónorientadaaobjetos
Fundamentosdelaprogramaciónorientadaaobjetos
III.Herencia
Lo que convierte a la programación orientada a objetos en el paradigma idóneo pararealizar diseño de sistemas centrados en abstracciones de datos es el uso de 6caracterís6casfundamentales:abstracciónencapsulación,herencia,polimorfismo,ligaduradinámicaygenericidad
Las jerarquías de herencia prescriben ciertas restricciones con respecto a la forma deaplicarlalógicadeconstruccióndelosobjetos.Elprogramadorpuedealterarestalógicamedianteelusodelosconstructoresimplícitosthisysuper.
B.ConstrucciónascendenteencascadaEn la instanciación de objetos, antes deejecutar la lógica de creación del constructorinvocado, se llama al constructor sinargumentos de la clase padre (u). El uso delconstructor implícito super como primerainstrucción de la lógica de creación permitealterarestecomportamientoforzandoaqueseu6lice otro constructor sobrecargado en elpadre con ciertos parámetros de construcciónactuales(v)
Vehículo
+Coche()
+Coche(intruedas)
Coche
+Vehiculo()
+Vehiculo(intruedas)
Coche (4)
Coche () v u
Vehiculo (4)
Vehiculo ()
super
(4);
th
is.m
arca
=‘
Rena
ult’
;..
.
v
Introducción
Javier Vélez Reyes [email protected] 1 - 17
Programaciónorientadaaobjetos
Fundamentosdelaprogramaciónorientadaaobjetos
IV.Polimorfismo
Lo que convierte a la programación orientada a objetos en el paradigma idóneo pararealizar diseño de sistemas centrados en abstracciones de datos es el uso de 6caracterís6casfundamentales:abstracciónencapsulación,herencia,polimorfismo,ligaduradinámicaygenericidad
Laherenciaconfierealasinstanciasdeunaclasemúl6ples6pos.Enconcreto,losobjetosadquiriránel6pode laclasea laquepertenecenyel6podefinidoporcadaunade lasclases padre de las que heredan su comportamiento. A esta propiedad se la llamapolimorfismo
Vehículo
+arrancar()+parar()
Moto
+arrancar()+parar()
+arrancar()+parar()
Camión
+arrancar()+parar()+llenar()
CocheTipo Camión
Los objetos de la clase Camión adquieren el tipo Camión lo que significa que en cualquier colaboración de objetos, los ejemplares de esta clase pueden utilizarse en variables declaradas con el tipo Camión
Tipo Vehículo
Los objetos de las clases Camión – también los de la clase Moto o Coche – adquieren además por herencia el tipo Vehiculo, lo que permite que aparezcan en colaboraciones de objetos con variables tipificadas con el tipo vehículo
Introducción
Javier Vélez Reyes [email protected] 1 - 18
Programaciónorientadaaobjetos
Fundamentosdelaprogramaciónorientadaaobjetos
IV.Polimorfismo
Lo que convierte a la programación orientada a objetos en el paradigma idóneo pararealizar diseño de sistemas centrados en abstracciones de datos es el uso de 6caracterís6casfundamentales:abstracciónencapsulación,herencia,polimorfismo,ligaduradinámicaygenericidad
Laspropiedadespolimórficastambiénseconfierenatravésdelusodeinterfaces.Deestamanera,adicionalmentealoanterior,losobjetosdeunaclasetambiénadquiriránel6podecadaunadelasinterfacesqueimplementen
Moto
+arrancar()+parar()
+arrancar()+parar()
Camión
+arrancar()+parar()+llenar()
CocheTipo Camión
Los objetos de la clase Camión adquieren el tipo Camión lo que significa que en cualquier colaboración de objetos, los ejemplares de esta clase pueden utilizarse en variables declaradas con el tipo Camión
Interfaz
Los objetos de las clases Camión – también los de la clase Moto o Coche – adquieren además por implementación de la interfaz el tipo Vehiculo, lo que permite que aparezcan en colaboraciones de objetos con variables tipificadas con el tipo vehículo
Vehículo
+arrancar()+parar()
Una interfaz es un artefacto especial, similar a una clase, que prescribe un contrato programático estableciendo una colección de signaturas de métodos pero no la implementación de los mismos.
Tipo Vehículo
Introducción
Javier Vélez Reyes [email protected] 1 - 19
Programaciónorientadaaobjetos
Fundamentosdelaprogramaciónorientadaaobjetos
IV.Polimorfismo
Lo que convierte a la programación orientada a objetos en el paradigma idóneo pararealizar diseño de sistemas centrados en abstracciones de datos es el uso de 6caracterís6casfundamentales:abstracciónencapsulación,herencia,polimorfismo,ligaduradinámicaygenericidad
Cada 6po dentro de una estructura polimórfica de herencia iden6fica un nivel deabstracción sobre el que se puede trabajar con los objetos de la herencia. Es posibleconver6runobjetodeun6poaotromedianteupcas6ngsydowncas6ngs
Vehículo
+arrancar()+parar()
Moto
+arrancar()+parar()
+arrancar()+parar()
Camión
+arrancar()+parar()+llenar()
Coche
Tipo Camión
Los objetos Camión son una especialización de Vehículo que disponen de ciertos métodos propios de la abstracción Camión
Tipo Vehículo
Un objeto Camión tipificado como un Vehículo no puede invocar métodos del tipo camión
downcast Vehículov=...Cochec=(Coche)v;
upcast
Cochec=newCoche();Vehículov=(Vehículo)c;
Introducción
Javier Vélez Reyes [email protected] 1 - 20
Programaciónorientadaaobjetos
Fundamentosdelaprogramaciónorientadaaobjetos
IV.Polimorfismo
Lo que convierte a la programación orientada a objetos en el paradigma idóneo pararealizar diseño de sistemas centrados en abstracciones de datos es el uso de 6caracterís6casfundamentales:abstracciónencapsulación,herencia,polimorfismo,ligaduradinámicaygenericidad
Elpolimorfismopermitear6cularunmodelodediseñoso@wareconocidoporelnombredeprogramacióngenérica,segúnelcual laalgoritmiasedescribealniveldeabstraccióndelaclasepadreparanovincularsealarealizaciónprescitaporningunadesushijas
Vehículo
+lavar()
TunelDeLavado
+lavar(Vehículov)
Moto
+lavar() +lavar()
Camión
+lavar()
Coche
return‘Lavandomoto...’
return‘Lavandocoche...’
return‘Lavandocamión...’
v.lavar()
Empleado
lavar(unCoche)
Lavandocoche...
lavar(unaMoto)
Lavandomoto...
lavar(unCamión)
Lavandocamión...
Introducción
Javier Vélez Reyes [email protected] 1 - 21
Programaciónorientadaaobjetos
Fundamentosdelaprogramaciónorientadaaobjetos
V.Ligaduradinámica
Lo que convierte a la programación orientada a objetos en el paradigma idóneo pararealizar diseño de sistemas centrados en abstracciones de datos es el uso de 6caracterís6casfundamentales:abstracciónencapsulación,herencia,polimorfismo,ligaduradinámicaygenericidad
Laligaduradinámicaeslacapacidaddealgunoslenguajesorientadosaobjetosdecambiaren6empodeejecuciónelobjetoreferenciadoporunavariableporotroobjetodedis6nto6popolimórficamentecompa6ble
cola.añadir(v)
ColaDeVehiculos
+encolar(Vehiculov)+lavarTodos()+booleanhayMas()+Vehiculosiguiente()
-cola
Garajegaraje=newGaraje()Vehiculov;while(cola.hayMas()){v=cola.siguiente();garaje.reparar(v);}
usa Garaje
+reparar(Vehículov)
Introducción
Javier Vélez Reyes [email protected] 1 - 22
Programaciónorientadaaobjetos
Fundamentosdelaprogramaciónorientadaaobjetos
VI.Genericidad
Lo que convierte a la programación orientada a objetos en el paradigma idóneo pararealizar diseño de sistemas centrados en abstracciones de datos es el uso de 6caracterís6casfundamentales:abstracción,encapsulación,herencia,polimorfismo,ligaduradinámicaygenericidad
La genericidad permite abstraerse de las los 6pos de objetos con los que trabajainternamenteunaclasepormediode laparametrizaciónde losmismos.Dehechoestacaracterís6casestambiénconocidacomoparametrizaciónde6pos
PilaDeCoches
PilaDeMotos
GenericidadPila<T>
+apilar(Tt)+Tdesapilar()
-Motopila[]
-Cochepila[]
+apilar(Cochep)+Cochedesapilar()
+apilar(Motom)+Motodesapilar()
-Tpila[]
Introducción
Javier Vélez Reyes [email protected] 1 - 23
Tiposabstractosdedatos
AnatomíadeClases
Tiposdeoperaciones
Cualquierclase,dentrodelaprogramaciónorientaaobjetos,estáformadaporelperfildecada una de las operaciones públicas que lo cons6tuyen. Éste indica la forma en que sepuedenexplotar las capacidadesdel6po.Desdeunpuntode vista conceptual esposibledis6nguirentrevarios6posdis6ntosdeoperaciones
Unaoperaciónconstructoracon6enelalógicadeinicializacióndeun6podedatos.Comotal,esinvocadainicialmenteparacrearunnuevo ejemplar vacío del 6po. Su invocación puede requerir elpasodeparámetrosnecesariosparalainicialización
I.Operacionesconstructoras
Una operación constructora por copia realiza un proceso deinicialización similar al anterior. La diferencia estriba en que enestaocasiónlaoperaciónrecibecomoparámetrounejemplardelmismo 6po de datos y copia sus elementos al nuevo ejemplarconstruido
II.Operacionesconstructorasporcopia
Stack<T>
+Stack(intcapacity)...
Stack<T>
+Stack(Stacks)...
Introducción
Javier Vélez Reyes [email protected] 1 - 24
Tiposabstractosdedatos
Las operacionesmodificadoras se u6lizan para alterar de formasegura el estado interno de una abstracción de datos. Si lainvocación es semán6camente valida garan6zan que, tras suejecucióndejanal6poabstractoenunnuevoestadoconsistente
III.Operacionesmodificadoras
Las operaciones consultoras de una abstracción de datos sonaquellas que sirven para consultar de forma segura el estadointerno de la misma. Su invocación 6ene la propiedad de noproducir efectos en el estado por lo que se consideranidempotentes
IV.Operacionesconsultoras
Tiposdeoperaciones
AnatomíadeClases
Stack<T>
+voidpush(Telement)+voidpop()...
Stack<T>
+Tpeek()...
Cualquierclase,dentrodelaprogramaciónorientaaobjetos,estáformadaporelperfildecada una de las operaciones públicas que lo cons6tuyen. Éste indica la forma en que sepuedenexplotar las capacidadesdel6po.Desdeunpuntode vista conceptual esposibledis6nguirentrevarios6posdis6ntosdeoperaciones
Introducción
Javier Vélez Reyes [email protected] 1 - 25
Tiposabstractosdedatos
Un6podeoperacionesconsultorassonlospredicadoslógicosquesirven para realizar comprobaciones seguras sobre el estado enque se encuentra la abstracción de datos con respecto a ciertapropiedadcaracterís6cadelamisma
V.Operacionesconsultoraslógicasopredicados
Las operaciones comparadoras son un 6po de predicadosdedicados a comparar el estado interno de un ejemplar de laabstracción de datos con el de otro u otros ejemplares. El casomásrecurrenteeseldeoperacionesdeigualdadentreejemplaresdelmismo6po
VI.Operacionescomparadoras
Tiposdeoperaciones
AnatomíadeClases
Stack<T>
+booleancontains(Te)+booleanisEmpty()+booleanisFull()...
Stack<T>
+booleanequals(Stacks)+booleancontainsAll(Stacks)...
Cualquierclase,dentrodelaprogramaciónorientaaobjetos,estáformadaporelperfildecada una de las operaciones públicas que lo cons6tuyen. Éste indica la forma en que sepuedenexplotar las capacidadesdel6po.Desdeunpuntode vista conceptual esposibledis6nguirentrevarios6posdis6ntosdeoperaciones
Introducción
Javier Vélez Reyes [email protected] 1 - 26
Tiposabstractosdedatos
Lasoperacionesdehashingofrecenunarepresentaciónnuméricaque representademanera–casi–univocaelestado internodeunaabstraccióndedatos.Seu6lizanparacontrolarlaausenciadeelementosrepe6dosenotrasabstraccionesagregadoras
VII.Operacionesdehashing
Las operaciones transformadoras permiten crear ejemplares deotros 6pos de abstracciones cuyo estado interno proviene delestado de la abstracción original, de acuerdo a cierta lógica detransformación
VIII.Operacionestransformadoras
Tiposdeoperaciones
AnatomíadeClases
Stack<T>
+longhashcode()...
Stack<T>
+StringtoString()+StringtoXML()+ListtoList()+SettoSet()...
Cualquierclase,dentrodelaprogramaciónorientaaobjetos,estáformadaporelperfildecada una de las operaciones públicas que lo cons6tuyen. Éste indica la forma en que sepuedenexplotar las capacidadesdel6po.Desdeunpuntode vista conceptual esposibledis6nguirentrevarios6posdis6ntosdeoperaciones
Introducción
Javier Vélez Reyes [email protected] 1 - 27
Tiposabstractosdedatos
Lasoperacionesdestructorascon6enentoda la lógicaasociadaala liberación de recursos que es necesario invocar cuando undeterminadoejemplardeunaabstraccióndedatosnovaavolveraseru6lizadoalolargodelprograma
IX.Operacionesdestructoras
Las operaciones reinicialidoras son un caso par6cular deoperacionesmodificadorasque restablecenel estado internodela abstracción al original, aquel en que se encontraban cuandofueron construidas. Su lógica interna es similar a la de unaconstructora a excepción que estas operaciones no realizanreservadenuevosrecursos
X.Operacionesreinicializadoras
Tiposdeoperaciones
AnatomíadeClases
Stack<T>
+voiddispose()...
Stack<T>
+voidclear()+voidremoveAll()...
Cualquierclase,dentrodelaprogramaciónorientaaobjetos,estáformadaporelperfildecada una de las operaciones públicas que lo cons6tuyen. Éste indica la forma en que sepuedenexplotar las capacidadesdel6po.Desdeunpuntode vista conceptual esposibledis6nguirentrevarios6posdis6ntosdeoperaciones
Introducción
Javier Vélez Reyes [email protected] 1 - 28
Tiposabstractosdedatos
XI.Operacionesdescriptoras
Tiposdeoperaciones
AnatomíadeClasesCualquierclase,dentrodelaprogramaciónorientaaobjetos,estáformadaporelperfildecada una de las operaciones públicas que lo cons6tuyen. Éste indica la forma en que sepuedenexplotar las capacidadesdel6po.Desdeunpuntode vista conceptual esposibledis6nguirentrevarios6posdis6ntosdeoperaciones
Laimplementacióncompletadeun6poennoterminaconlaimplementacióndecadaunadelasoperacionesdelmismosinoquedebe incluir 3 operaciones canónicas parasu clasificación, comparación y trazado.Estasoperacionesenjavasoncanónicasyaque heredan de la clase raíz (Object) y setratadehashcode(),equals()ytoString()
Stack<T>
hashcode(){return67*elements.hashcode()+capacity;}booleanequals(Objecto){if(!(oinstanceofStack))returnfalse;else{s=(Stack)o;returns.elements.equals(elements)&&s.capacity==capacity;}StringtoString(){returnelements.toString();}
- Listelements- intcapacity
Introducción
Javier Vélez Reyes [email protected] 1 - 29
Bibliogra_a
BibliograTaBibliografía básica
Estructuras de datos en java. Weiss, Mark
Allen. Pearson Addison – Wesley. ISBN
9788478290352
Bibliografía complementaria
Construcción de software orientado a objetos.
Meyer, B. Prentice Hall España. 1998. ISBN
978-84-8322-040-5
JavierVé[email protected]
DepartamentodeLenguajesYSistemasInformáAcosUNED
EstrategiasdeprogramaciónyestructurasdedatosGradoenIngenieríaInformá8ca
GradoenTecnologíasdelaInformaciónDepartamentodeLenguajesySistemasinformá6cos
2EstrategiasdeprogramaciónAlgoritmositeraAvosyrecursivos
Estrategiasdeprogramación
Javier Vélez Reyes [email protected] 2 - 2
Índice
Índice
› Introducción
› Diseño de algoritmos recursivos
› ¿Qué son los algoritmos recursivos?
› Diseño de algoritmos recursivos
› Ejemplos de algoritmos recursivos
› Diseño de algoritmos iterativos
› ¿Qué son los algoritmos iterativos?
› Diseño de algoritmos iterativos
› Ejemplos de algoritmos iterativos
› Traducción de algoritmos recursivos a iterativos
› Catálogo de algoritmos
› Bibliografía
Estrategiasdeprogramación
Javier Vélez Reyes [email protected] 2 - 3
Obje6vosgenerales
Obje8vos
› Entender las principales características del diseño recursivo
› Entender las ventajas y desventajas del diseño recursivo
› Aprender a diseñar algoritmos recursivos
› Advertir su importancia en el contexto de las abstracciones de datos
› Entender las principales características del diseño iterativo
› Entender las ventajas y desventajas del diseño iterativo
› Aprender a diseñar algoritmos iterativos
› Advertir su importancia en el contexto de las abstracciones de datos
› Aprender a transformar algoritmos recursivos en iterativos
Estrategiasdeprogramación
Javier Vélez Reyes [email protected] 2 - 4
Introducción
IntroducciónTodo algoritmo pretende la realización de algún 6po de tarea o cálculo. Lasmás de lasveces, si dicha tarea no es trivial, esto implica repe6r un conjunto de pasos sencillos uncierto número de veces hasta que se cumpla cierta condición, que se conoce comocondición de terminación. Esencialmente, hay dos formas de diseñar algoritmos quedesarrollen tareas repe66vas, que veremos en este tema yaque representan estrategiasdiferentespararesolverelmismoproblema:larecursividadylaiteración
Estrategias de programación
I. Diseño recursivo de algoritmos Elproblemase resuelveporeldiseñode funcionesquerecurrensobresimismasdeformadirectaoindirecta.Suconstrucciónsebasaenlaeleccióndeunafamiliadecasosbase,trivialesderesolveryunacoleccióndecasosrecursivosqueconverjanhacialoscasosbaseyqueensumadencoberturaatodoelespectrodeposiblesparámetrosdeentrada
II. Diseño iterativo de algoritmos Elproblemaseresuelveporaplicacióndesentenciasdecontroldeflujodeprogramasobreestructurasdedatosquerepresentan laentradaosalidadelmismo.Enestecasolallamadaaotrafuncionesdentrodeunafunciónsedebeacriteriosdedescomposiciónmodularynoseaplicarecursividadpararesolverelproblema
Estrategiasdeprogramación
Javier Vélez Reyes [email protected] 2 - 5
Introducción
Introducción
intfactorial(intn){if(n==0)return1;elsereturnn*factorial(n–1);}
I. Diseño recursivo Los algoritmos de diseño recursivo permiten resolver un problemainvocando dentro del cuerpo de una función – directa oindirectamente–nuevamentea lapropia funciónsobreunconjuntodeparámetrosactualesdiferentes.Undiseñoadecuadodeeste6podealgoritmosdebegaran6zarquelaejecucióndelafunciónconunosparámetros adecuados converja a la solución de manera que segaran6celafinalizacióndelmismo
}
Para resolver la función fac tor ia l se vue lve a i nvoca r a l a f unc i ón factorial con valor n – 1 y se devuelve el resultado de multiplicar el valor devuelto de esta invocación por n
Factorial(5)=5*factorial(4)=5*4*factorial(3)=5*4*3factorial(2)=5*4*3*2*factorial(1)=5*4*3*2*1*factorial(0)=5*4*3*2*1*1=120
Diseño iterativo
Diseño recursivo
Estrategiasdeprogramación
Javier Vélez Reyes [email protected] 2 - 6
Introducción
IntroducciónI. Diseño iterativo
Los algoritmos itera6vos son aquellos que se construyen a par6r deuna secuencia ordenada de instrucciones de alto nivel. Unsubconjunto de estas instrucciones permiten alterar el flujo deejecución.Enconcretosedis6ngueninstruccionesdecontroldeflujocondicional–queseleccionanuncaminodeejecucióndeentrevariosposibles – e itera6vo – que repiten la ejecución de un bloque deinstrucciónmientrassesa6sfaganciertascondicionesambientales.Undiseño adecuado de este 6po de algoritmos debe garan6zar laterminacióndelmismo
intfactorial(intn){intindex=1;intresult=1;while(index<=n){result=result*index;index++;}}
}
Para resolver la función factorial se procede i te ra t i vamente acumulando en la variable result el producto del contador index de cada iteración por el resultado acumulado anterior
Factorial(5)
index12345
result12624120
Diseño iterativo
Diseño recursivo
Estrategiasdeprogramación
Javier Vélez Reyes [email protected] 2 - 7
Diseñodealgoritmosrecursivos
¿Quésonlosalgoritmosrecursivos?
Eldiseñorequierela
definicióndeunacoleccióndecasosque
dencoberturaatodaentradalegí6madeparámetros
Esquemageneraldeunalgoritmorecursivo
Trfunción(Txx){if(esCasoBase1(x))return<<resolucióninmediata1>>...if(esCasoBaseN(x))return<<resolucióninmediataN>>if(esCasoRecursivo1(x))return<<resoluciónrecursivaconvergente1>>...if(esCasoRecursivoM(x))return<<resoluciónrecursivaconvergenteM>>}
Función recursiva
Casos
Guarda La guarda del caso refleja las condicionesambientales que deben sa6sfacerse paraejecutar el caso. Están expresadas en términosdelosparámetrosydebenserdisjuntasentresí
Resolución La resolucióndeun caso indica las accionesquedebenefectuarsepararesolverelcaso.Siesbaselaresoluciónes inmediatasies recursivaconsisteen laaplicacióndeunacomposicióndellamadasrecursivas
Casos base
Casos recursivos
Unalgoritmorecursivoesaquelqueseinvocaasimismodentrodesupropiocuerpoconunosparámetrosactualesdis6ntos. Estructuralmente cada funciónestá formadaporunacoleccióndealterna6vasdisjuntasllamadascasosconguardasexpresadasentérminosdelos parámetros del problema. Los casos base resuelven el problema de forma inmediatamientrasquelosotrosrecurrencomposi6vamentesobrelafunción
Estrategiasdeprogramación
Javier Vélez Reyes [email protected] 2 - 8
Diseñodealgoritmosrecursivos
Diseñodealgoritmosrecursivos
Diseñodecasosbase
Comohemosvisto,latareadediseñodeunafunciónrecursivaconsisteenladefinicióndelacoleccióndecasosbaseycasosrecursivosqueresuelvansa6sfactoriamenteelproblema.Acon6nuacióndiscu6moselcorrectodiseñodecada6podecaso
Uncasobase representaelfinaldeuna tarea, yaqueno requieredenuevas llamadasrecursivasparasuresolucióndebidoasusencillez.Cuandodiseñamosloscasosbasedeun algoritmo recursivo debemos asegurarnos de que las guardas de todos ellos sondisjuntas entre sí y de que en suma dan cobertura a todas las posibles invocacionesprovenientesdealgúncasorecursivo
intfactorial(intn){
if(n==0)return1;
elsereturnn*factorial(n–1);
}
Toda invocación recursiva terminapor aplicacióndelúnico casobasecon guarda n==0. A veces esposible balancear los casos de undiseño recursivo entre los base ylos propiamente recursivos sinimpacto en la solución. Considereque otra solución hubiera sidodefinir el caso base con la guardan<2
Caso base
Estrategiasdeprogramación
Javier Vélez Reyes [email protected] 2 - 9
Diseñodealgoritmosrecursivos
Diseñodealgoritmosrecursivos
Diseñodecasosrecursivos
Comohemosvisto,latareadediseñodeunafunciónrecursivaconsisteenladefinicióndelacoleccióndecasosbaseycasosrecursivosqueresuelvansa6sfactoriamenteelproblema.Acon6nuacióndiscu6moselcorrectodiseñodecada6podecaso
Un caso recursivo consta de tres elementos: una división del problema en uno omássubproblemas,unainvocacionesrecursivapararesolvercadaunodeestossubproblemasyunacombinacióndelosresultadosdelossubproblemasparaobtener,alavueltadelasinvocaciones recursivas,el resultadodelproblemaoriginal. Esteesquema termina si ladivisióndelproblemaconvergehaciaalgunodeloscasosbasedelafunción
intfactorial(intn){
if(n==0)return1;
elsereturnn*factorial(n–1);
}
Aquí el único caso recursivo esaquelconguarda implícitan>0.Suresoluciónconsisteenunadivisiónconvergente hacia n==0 debido ala expresión de división delproblema
Caso recursivo
División La función de divisióngenera a cada paso derecursión un subproblemade tamaño una unidadmenorqueconvergea0
Recursión La recursión se aplica pararesolver el subproblema detamañon-1
Combinación La función de combinación en este casoquepermiteresolverelproblemaapar6rde los resultados parciales de cadasubproblemaeslaoperaciónproducto
Estrategiasdeprogramación
Javier Vélez Reyes [email protected] 2 - 10
Diseñodealgoritmosrecursivos
Diseñodealgoritmosrecursivos
Diseñodecasosrecursivos
Comohemosvisto,latareadediseñodeunafunciónrecursivaconsisteenladefinicióndelacoleccióndecasosbaseycasosrecursivosqueresuelvansa6sfactoriamenteelproblema.Acon6nuacióndiscu6moselcorrectodiseñodecada6podecaso
Un caso recursivo consta de tres elementos: una división del problema en uno omássubproblemas, una invocaciones recursiva para resolver cada uno de ellos y unacombinación de los resultados de los subproblemas para obtener, a la vuelta de lasinvocacionesrecursivas,elresultadodelproblemaoriginal.
Clasificaciones de recursividad
I. Por la forma de recursión
II. Por la forma de partición
III. Por la forma de combinación
Elnúmerode invocaciones realizadasen cada caso recursivo marca uncriteriodeclasificación
La forma de dividir el problema ensubproblemas es otro criterio declasificación
La forma de combinar los resultadosparciales de la resolución de cadasubproblemaeseltercercriterio
Recursividad simple
Recursividad múltiple
Partición por substracción
Partición por división
Recursividad final
Recursividad no final
returnn*f(n-1)
returnf(n-1)+…+f(n-k)
returnn*f(n-1)
returnf(n/2)
returnf(n/2)
returnn*f(n-1)
Estrategiasdeprogramación
Javier Vélez Reyes [email protected] 2 - 11
Diseñodealgoritmosrecursivos
Diseñodealgoritmosrecursivos
Diseñoderecursividadporinmersión
Comohemosvisto,latareadediseñodeunafunciónrecursivaconsisteenladefinicióndelacoleccióndecasosbaseycasosrecursivosqueresuelvansa6sfactoriamenteelproblema.Acon6nuacióndiscu6moselcorrectodiseñodecada6podecaso
Aveceseldiseñodeunafunciónrecursivaseexpresacomounainvocaciónconcretadeunafunciónmásgeneralqueincluyeparámetrosadicionales.Estatécnica,conocidaporelnombredediseñoporinmersión,seaplicapordis6ntascues6onesquediscu6remosacon6nuación
La inmersión es una estrategia de diseño mediante la cual
una función se expresa como una invocación particular de
otra función más general con parámetros adiciones
intsumaTodos(intv[]){
returnsumaDesde(v,0);
}
intsumaDesde(intv[],intindex){...}
Función inmersora La func ión inmersorasumergealaoriginalpuestoque,alsermásgeneral,conunainvocaciónpar6culardeésta se da cobertura alproblema
Función sumergida La función sumergidase expresa como unainvocaciónconcretadela función inmersoramásgeneral
Estrategiasdeprogramación
Javier Vélez Reyes [email protected] 2 - 12
Diseñodealgoritmosrecursivos
Diseñodealgoritmosrecursivos
Diseñoderecursividadporinmersión
Comohemosvisto,latareadediseñodeunafunciónrecursivaconsisteenladefinicióndelacoleccióndecasosbaseycasosrecursivosqueresuelvansa6sfactoriamenteelproblema.Acon6nuacióndiscu6moselcorrectodiseñodecada6podecaso
Aveceseldiseñodeunafunciónrecursivaseexpresacomounainvocaciónconcretadeunafunciónmásgeneralqueincluyeparámetrosadicionales.Estatécnica,conocidaporelnombredediseñoporinmersión,seaplicapordis6ntascues6onesquediscu6remosacon6nuación
Táctica de inmersión
I. Inmersión de parámetros
II. Inmersión de resultados
La inmersión de parámetros se refiere a laaplicaciónde la técnica de inmersión sobrelos parámetros de entrada de la misma.Existen26posdentrodeestacategoría
La inmersión de resultados consiste en laaplicacióndelatécnicadelainmersiónparaacumular en parámetros el resultado delproblemaenllamadarecursiva
I.I. Parámetros de recorrido Se incluyen parámetros en la función deinmersoraquecontrolanel recorridode loselementosdeunaestructuradedatos
I.II. Parámetros acumuladores Se incluyen parámetros en la función deinmersora que acumulan resultados inter-medios
Estrategiasdeprogramación
Javier Vélez Reyes [email protected] 2 - 13
Diseñodealgoritmosrecursivos
Diseñodealgoritmosrecursivos
Diseñoderecursividadporinmersión
Comohemosvisto,latareadediseñodeunafunciónrecursivaconsisteenladefinicióndelacoleccióndecasosbaseycasosrecursivosqueresuelvansa6sfactoriamenteelproblema.Acon6nuacióndiscu6moselcorrectodiseñodecada6podecaso
Aveceseldiseñodeunafunciónrecursivaseexpresacomounainvocaciónconcretadeunafunciónmásgeneralqueincluyeparámetrosadicionales.Estatécnica,conocidaporelnombredediseñoporinmersión,seaplicapordis6ntascues6onesquediscu6remosacon6nuación
Objetivos de inmersión
I. Inmersión por diseño
III. Inmersión por recursión final
Se aplican técnicas de inmersión con el objeto de definirunarecursiónquedeotromodonoseríaposiblear6cular
Se aplican técnicas de inmersión con el fin de conseguirunaejecuciónmáseficientede la funciónen laresolucióndelproblema
Se aplican técnicas de inmersión con el ánimo detransformarlarecursividadenrecursiónfinal
II. Inmersión por eficiencia
Estrategiasdeprogramación
Javier Vélez Reyes [email protected] 2 - 14
Diseñodealgoritmosrecursivos
Diseñodealgoritmosrecursivos
Diseñoderecursividadporinmersión
Comohemosvisto,latareadediseñodeunafunciónrecursivaconsisteenladefinicióndelacoleccióndecasosbaseycasosrecursivosqueresuelvansa6sfactoriamenteelproblema.Acon6nuacióndiscu6moselcorrectodiseñodecada6podecaso
Aveceseldiseñodeunafunciónrecursivaseexpresacomounainvocaciónconcretadeunafunciónmásgeneralqueincluyeparámetrosadicionales.Estatécnica,conocidaporelnombredediseñoporinmersión,seaplicapordis6ntascues6onesquediscu6remosacon6nuación
Obj
etiv
os
Recorrido
Táctica
Diseño
Eficiencia
R. Final
Acumulación Resultados S e a p l i c a p a r a o b t e n e rrecurrencias con estructuras dedatos está6cas o parámetrosconstantesdurantelaejecución
-
-
-
-
-
Esta tác6cade inmersiónseaplicapara precalcular y acumular unvalordeentradademaneraqueseahorreen6empoomemoria
Se inc luyen parámetros deacumulaciónparaevitar tenerquecombinar tras la ejecución de lasrecursionesdecadasubproblema
Esta tác6cade inmersiónseaplicaparacalcularyu6lizarunresultadoparcial, que viene de una llamadaposteriorenlacadenarecursiva
Estrategiasdeprogramación
Javier Vélez Reyes [email protected] 2 - 15
Diseñodealgoritmosrecursivos
Diseñodealgoritmosrecursivos
Ejercicios
Comohemosvisto,latareadediseñodeunafunciónrecursivaconsisteenladefinicióndelacoleccióndecasosbaseycasosrecursivosqueresuelvansa6sfactoriamenteelproblema.Acon6nuacióndiscu6moselcorrectodiseñodecada6podecaso
Diseñe una función que calcule elfactorialdeunnúmero.Determineel6po de recursividad de que se tratasegúnlas3clasificacionesanteriores
I. Función factorial Cadavalordelaseriedefibonacciseob6eneapar6rdelasumadelosdosanter iores. Los dos pr imeroselementosdelaserieson1
II. Serie de fibonacci Calcule la n-esima potencia de unnúmero mediante el diseño de unafunciónrecursiva.Clasifiqueeldiseñoconrespectoaloscriteriosanteriores
III. Potencia de un número
Diseñe una función recursiva quecalcule la suma de los n primerosnúmeros naturales. ¿Es recursivasimple?¿esfinal?
IV. Suma de N naturales Diseñe una función recursiva quecalcule la suma de los n primeroselementos de un vector de enteros.Clasifiquelafunción
V. Suma de un vector Diseñe una función recursiva quecalcule el producto escalar de dosvectores de enteros. Clasifique lafunción
VI. Producto escalar
Diseñe una función recursiva quebusque un elemento dentro de unvector de enteros. Clasifique lafunción
VII. Búsqueda en vector Diseñe un predicado recursivo quedetermine si un vector de enteroscon6ene o no algún elementorepe6do
VIII. Elementos repetidos Diseñe una función recursiva quecalcule el máximo común divisiorentre dos enteros por aplicación delalgoritmodeEuclides
IX. Máximo común divisor
Estrategiasdeprogramación
Javier Vélez Reyes [email protected] 2 - 16
Diseñodealgoritmositera6vos
¿Quésonlosalgoritmositera8vos?En los algoritmos itera6vos los problemas se resuelven mediante la escritura de unacolecciónde instruccionesdepropósito específicoque se ejecutandemanera secuencialsegúnel ordenenque sehanescrito.Algunasde estas instruccionespermiten alterar elcontrol secuencial de la ejecución para ar6cular flujos itera6vos o condicionales deejecución
Esquemageneraldeunalgoritmoitera8vo
intestá(T[]v,Te){
intindex=0;
booleanfound=false;
while(!found&&index<v.length){
found=(v[index]==e);
if(!found)index++;
}
if(found)returnindex;
elsereturn-1;
}
La inicial ización es el pasopreliminar para proceder con eldiseñoitera6vodealgoritmos
Inicialización
Iteración Los algoritmos itera6vos basan sufuncionamiento en iteraciones debloques de código generalmenteaplicadas sobre elementos deestructurasdedatos
Bifurcación Las instrucciones de control deflujocondicionalpermitenejecutarsentencias solobajodeterminadascondicionesambientales
Secuenciamiento La caracterís6ca esencial del diseño itera6vo radica en elconceptodesecuenciadeinstruccionesejecutadasenordenyenelusodevariablesparaacumularestadosparciales
Estrategiasdeprogramación
Javier Vélez Reyes [email protected] 2 - 17
Diseñodealgoritmositera6vos
Diseñodealgoritmositera8vosEl diseño itera6vou6liza instruccionesqueprescriben cómo realizar los cálculoso tareasnecesariaspara llegar al resultadobuscado. Estas instrucciones seejecutandeacuerdoaflujosdeejecución,quepuedensersecuenciales,bifurca6voseitera6vos.Lau6lizacióndevariablesylasentenciadeasignaciónjueganunpapelpreponderante
Elementosdeunalgoritmoitera88vo
Elem
ento
s de
los
algo
ritm
os
itera
tivos
I. Sentencias de asignación
II. Sentencias de control de flujo
A. Encadenamiento secuencial
B. Control de flujo condicional
C. Control de flujo iterativo
Lasentenciadeasignaciónjueganunpapelpreponderanteeneldiseñoitera6voyaquepermiteacumularcálculosparcialesquerepresentanelestadodelalgoritmoenesepunto
La ejecución de instruccionespuede ar6cularse en secuencia,bifurca6vamente o en iteración.Existen sentencias que permitendeterminarelcontroldeflujo
Las instrucciones se encadenan secuencialmenteparaqueseejecutenunadetrásdeotra
Las instrucciones se agrupan endos bloques quese ejecutan alterna6vamente si se sa6sface unacondición
Lasinstruccionesseagrupanenunbloquequeseejecuta itera6vamente mientras se sa6sface unacondición
Estrategiasdeprogramación
Javier Vélez Reyes [email protected] 2 - 18
Diseñodealgoritmositera6vos
Diseñodealgoritmositera8vosEl diseño itera6vou6liza instruccionesqueprescriben cómo realizar los cálculoso tareasnecesariaspara llegar al resultadobuscado. Estas instrucciones seejecutandeacuerdoaflujosdeejecución,quepuedensersecuenciales,bifurca6voseitera6vos.Lau6lizacióndevariablesylasentenciadeasignaciónjueganunpapelpreponderante
Sentenciadeasignación
Sentencia;
variable=expresión;
Sentencia;
En el diseño itera6vo las variables representan almacenes de datos enmemoria quecon6enen el valor resultante del cómputo de una expresión. Este valor representaparcialmente el estado del algoritmo en 6empo de ejecución en función de loselementosdeentrada
Asignación Adiferenciadecómoocurreenalgoritmosrecursivoslassentenciasdeasignaciónpermitenapoyarseenvariablesparaqueseanreferidasposteriormentedesdeotrospuntosdelalgoritmo
Estado Cadasentencia
suponeuncambiopotencialenel
estadodelamáquina.La
asignaciónpermiterecogerlo
parcialmenteenelvalordelavariable
Expresión y variable Lavariableesunareferencia
simbólicaaunespecioreservadoenmemoria.Laexpresiónuna
fórmulaquepermitecalcularunvalorenfuncióndeotrasvariables
yconstantes
Estrategiasdeprogramación
Javier Vélez Reyes [email protected] 2 - 19
Diseñodealgoritmositera6vos
Diseñodealgoritmositera8vosEl diseño itera6vou6liza instruccionesqueprescriben cómo realizar los cálculoso tareasnecesariaspara llegar al resultadobuscado. Estas instrucciones seejecutandeacuerdoaflujosdeejecución,quepuedensersecuenciales,bifurca6voseitera6vos.Lau6lizacióndevariablesylasentenciadeasignaciónjueganunpapelpreponderante
Encadenamientosecuencial
Sentencia;
Sentencia;
Sentencia;
El modelo de ejecución por defecto es la ejecución secuencial. Según éste, lasinstrucciones son lanzadas a ejecución de acuerdo al orden en que aparecencorrela6vamenteescritasenelalgoritmo
Encadenamiento secuencial El delimitador de sentencias separa unasentencia de la siguiente dentro de un bloquede instrucciones secuencial y puede serconsiderado como el operador que ar6cula elencadenamientosecuencial
Ejecución en secuencia La ejecución en secuencia se alinea con la idea de quecada sentencia realiza un paso del algoritmo hacia laobtención del resultado final y con la descomposiciónfuncionaldescendentedelparadigmaestructurado
Estrategiasdeprogramación
Javier Vélez Reyes [email protected] 2 - 20
Diseñodealgoritmositera6vos
Diseñodealgoritmositera8vosEl diseño itera6vou6liza instruccionesqueprescriben cómo realizar los cálculoso tareasnecesariaspara llegar al resultadobuscado. Estas instrucciones seejecutandeacuerdoaflujosdeejecución,quepuedensersecuenciales,bifurca6voseitera6vos.Lau6lizacióndevariablesylasentenciadeasignaciónjueganunpapelpreponderante
Controldeflujocondicional
if(expresión-lógica){
<<bloque-sentencias>>
}else{
<<bloque-sentencias>>
}
Lassentenciasdecontroldeflujocondicionalalteranlaejecuciónnormal–secuencial–deunalgoritmoparagenerardis6ntasbifurcacionesejecutablesenfuncióndeciertascondicionesambientales
If – Then – Else
Se evalúa la expresión lógica. Si el resultado esciertoseejecutaelprimerbloquedesentencias.Si es falso se ejecuta el segundo bloque desentencias
switch(expresión){
casecte-1:<<bloque-sentencias>>break;
casecte-2:<<bloque-sentencias>>break;
...
default:<<bloque-sentencias>>
}Switch - Case
Se evalúa la expresión. Si coincide con laconstante del caso i se ejecuta el bloque desentenciasadjunto.Sinoseajustaaningúncasoseejecutaelbloquedesentenciasdefault
Estrategiasdeprogramación
Javier Vélez Reyes [email protected] 2 - 21
Diseñodealgoritmositera6vos
Diseñodealgoritmositera8vosEl diseño itera6vou6liza instruccionesqueprescriben cómo realizar los cálculoso tareasnecesariaspara llegar al resultadobuscado. Estas instrucciones seejecutandeacuerdoaflujosdeejecución,quepuedensersecuenciales,bifurca6voseitera6vos.Lau6lizacióndevariablesylasentenciadeasignaciónjueganunpapelpreponderante
Controldeflujoitera8vo
for(asignación-índice;
expresión-límite;
expresión-incremento){
<<bloque-sentencias>>
}
Lassentenciasdecontroldeflujoitera6voalteranlaejecuciónnormal–secuencial–deun algoritmo para generar dis6ntas iteraciones sobre un cuerpo de sentencias. Elnúmerodeiteracionesdependedecondicionesambientales
For Iteración de bloque de sentenciascontrolada por índice. El valorinicial se indica en asignación-índice,el incrementoenexpresión-incremento y termina cuandoexpresión-límitesehacefalso
<<inicialización>>
while(expresión-lógica){
<<bloque-sentencias>>
<<incremento>>
}
While Iteración de bloque se sentenciasmientras expresión-lógica seacierta. Inicialización externa albuc le . Incremento exp l í c i to\picamente al final del bloque desentencias
<<inicialización>>
do{
<<bloque-sentencias>>
<<incremento>>
}while(expresión-lógica);
Do - While Iteración de bloque de sentencias.Inicialización exterior. Incremento\picamente al final del bloque.Comprobación lógica al final decada iteración. Una ejecución almenos
Estrategiasdeprogramación
Javier Vélez Reyes [email protected] 2 - 22
Diseñodealgoritmositera6vos
Diseñodealgoritmositera8vosEl diseño itera6vou6liza instruccionesqueprescriben cómo realizar los cálculoso tareasnecesariaspara llegar al resultadobuscado. Estas instrucciones seejecutandeacuerdoaflujosdeejecución,quepuedensersecuenciales,bifurca6voseitera6vos.Lau6lizacióndevariablesylasentenciadeasignaciónjueganunpapelpreponderante
EjerciciosEncuentre una solución itera6va paracada uno de los problemas que sepresentaronconanterioridad
I. Función factorial
II. Serie de fibonacci
III. Potencia de un número
IV. Suma de N naturales
V. Suma de un vector
VI. Producto escalar
VII. Búsqueda en vector
VIII. Elementos repetidos
IX. Máximo común divisor
//Pre:-1<j<=length
publicintsumaV(int[]v){
intj=0;
ints=0;
while(j<v.length){
s=s+v[j];
j++;
}
returns;
}
//Post:s=Σv[i]i=0
length
Estrategiasdeprogramación
Javier Vélez Reyes [email protected] 2 - 23
Traduccióndealgoritmosrecursivosaitera6vos
Traduccióndealgoritmosrecursivosaitera8vosLosalgoritmosrecursivosaunqueelegantesyeficaceshanpresentadoproblemashistóricosdecomputabilidadyaqueelsoporteporpartedeloscompiladoresalainvocaciónrecursivade programas es rela6vamente reciente. Merece la pena discu6r procedimientos detransformacióndealgoritmosrecursivosaitera6vos
Traduccióndealgoritmosconrecursividadfinal
publicintsumaV(int[]v,intj,intw){
if(j>=n)returnw
elsereturnsumaV(v,j+1,v[j]+w)}
publicintsumaVit(int[n]v){
intj=0;
intw=0;
while(j<n){
w=w+v[j];
j=j+1;
}
returnw;
}
Los parámetros de entrada se subs6tuyen porvariables localesconelvalorquerecibiríanen lallamada inicial (j). El parámetro acumulador (w)juegaelpapeldelresultadoparcialinicialmente0.
Dentrodelbuclesecalculaelvalor,en cada paso, de las variables deresultadoparcialwyderecorridoj
Estrategiasdeprogramación
Javier Vélez Reyes [email protected] 2 - 24
Traduccióndealgoritmosrecursivosaitera6vos
Traduccióndealgoritmosrecursivosaitera8vosLosalgoritmosrecursivosaunqueelegantesyeficaceshanpresentadoproblemashistóricosdecomputabilidadyaqueelsoporteporpartedeloscompiladoresalainvocaciónrecursivade programas es rela6vamente reciente. Merece la pena discu6r procedimientos detransformacióndealgoritmosrecursivosaitera6vos
Traduccióndealgoritmosconrecursividadnofinal
publicintfactorial(intn){
if(n==0)return1;
elsereturnn*factorial(n-1);
}
publicintfactIt(intn){
inti=n;
while(i>0){
i=i-1
}
intr=1;
while(i<n){
r=r*i;
i++;
}
returnr}
Buscar en i el final de la cadena de llamadasdescendente.Seaplicaencadavueltaelsucesorde los parámetros (n-1) hasta encontrar elequivalentealtamañodelcasotrivial(0).
Seusarparaacumularelresultado.Seinicializaal resultado del caso base. Se usa la variable icomo objeto de comparación del segundobucle.Secomputaelresultadoparcialaplicandola función de combinación (*) por el valor delparámetro.Alfinalsedevuelveelresultado
Estrategiasdeprogramación
Javier Vélez Reyes [email protected] 2 - 25
Traduccióndealgoritmosrecursivosaitera6vos
Traduccióndealgoritmosrecursivosaitera8vosLosalgoritmosrecursivosaunqueelegantesyeficaceshanpresentadoproblemashistóricosdecomputabilidadyaqueelsoporteporpartedeloscompiladoresalainvocaciónrecursivade programas es rela6vamente reciente. Merece la pena discu6r procedimientos detransformacióndealgoritmosrecursivosaitera6vos
Traduccióndealgoritmosmedianteelusodeunapila
intinvertir(intn,intr){
if(n==0)returnr;
returninvertir((n/10),r*10+n%10);
}
intinvertirIt(intn){
intj=n;
Stack<int>p=newStack<int>();
while(j>10){
p.push(j);
n=n/10;
}
intk=j;
while(!p.isEmpty()){
j=p.top();
p.pop();
k=k+(j%10);
}
returnk}
Inicializacióndejcomovariablelocalquerepresentaelvalorinicialdelparámetroydepcomopilavacíadetrabajo
Apilamoselvalorencursodejpararecuperarloalavueltaycalculamoselsucesos(n/10)
Hemosterminadolacadenadescendentedellamadas.Ahorapreparamoslacadena
ascendentedevuelta.kllevaráelresultado,quepartedelvalordejcuandoterminael
bucledeida
Estrategiasdeprogramación
Javier Vélez Reyes [email protected] 2 - 26
Catálogodealgoritmos
CatálogodealgoritmosAunqueencontraruncatálogodealgoritmoscanónicosyrecurrentesescomplejodadosugrandiversidad,sirelacionamoseldiseñodealgoritmosconlosprincipales6posabstractosde datos que se presentaron en el tema anterior, es posible encontrar 3 categoríasgeneralesenlaqueéstoscaenprincipalmentedeacuerdoasupropósito
Catálogodealgoritmos
I.Algoritmosderecorrido
II.Algoritmosdebúsqueda
III.Algoritmosdeordenación
Elpropósitodelosalgoritmosderecorridoesencontrarunaexpresiónlinealdelos elementos almacenados en la estructura de datos. Dependiendo de éstapuede haber varias estrategias de recorrido alterna6vas. El resultado es unacolecciónordenadadeloselementosdelaestructura
Elpropósitodelosalgoritmosdebúsquedaesencontrarunaelementodeentretodos los elementos almacenados en la estructuradedatos.Dependiendodeéstaexistendis6ntasestrategiasconcomplejidadviceversa.Elresultadoesunvalordeverdadindicadosiseencuentraelelementoouníndicedeposición
Elpropósitodelosalgoritmosdeordenaciónesreorganizarloselementosdelaestructura de datos para disponerlos de acuerdo a cierto criterio de orden.Para poder ar6cular una ordenación sobre una estructura de datos loselementosdebensercomparablesylaestructuraprestarsealcriteriodeorden
Estrategiasdeprogramación
Javier Vélez Reyes [email protected] 2 - 27
Catálogodealgoritmos
CatálogodealgoritmosLanaturalezaitera6vaorecursivadelosalgoritmosquedefrecuentementeinducidaporlaformaenqueelperfilde lasoperacionesdaaccesoa losdatos.A lo largodeeste cursorepasaremos los principales 6pos de algoritmos – recorrido, búsqueda y ordenación –aplicablessobrecadaunodelos6posabstractosdedatosqueestudiaremos
Recorrido Búsqueda Ordenación
Listas*
Pilas
Colas
Arboles
RecorridodirectoRecorridoinverso
Búsquedasecuencial
InserciónMergesort
Recorridodesdelacima
Búsquedasecuencial
-
Recorridohaciaelfinal
Búsquedasecuencial
-
Preorden,inorden,postorden
Recorridoenanchura
Búsquedabinaria
Ordenación
*Serefierealistas,listasdoblementeenlazadasylistascirculares
Estrategiasdeprogramación
Javier Vélez Reyes [email protected] 2 - 28
Bibliograha
BibliograOaBibliografía básica
Estructuras de datos en java. Weiss, Mark
Allen. Pearson Addison – Wesley. ISBN
9788478290352
Estrategiasdeprogramación
Javier Vélez Reyes [email protected] 2 - 29
Bibliograha
BibliograOaBibliografía complementaria
Programación metódica. BALCÁZAR, J. L.
McGraw-Hill, 1993. ISBN 8448119576
Diseño de programas. Formalismo y
abstracción. Ricardo Peña Marí. Pearson -
Prentice Hall. ISBN 13: 9788420541914
JavierVé[email protected]
DepartamentodeLenguajesYSistemasInformáAcosUNED
EstrategiasdeprogramaciónyestructurasdedatosGradoenIngenieríaInformá8ca
GradoenTecnologíasdelaInformaciónDepartamentodeLenguajesySistemasinformá6cos
3AnálisisdelaeficienciadelosalgoritmosCosteasintóAcotemporal
Análisisdelaeficienciadelosalgoritmos
Javier Vélez Reyes [email protected] 3 - 2
Índice
Índice
› Introducción
› ¿Qué es la eficiencia de los algoritmos?
› Criterios de clasificación del análisis de la eficiencia
› Métricas de análisis de la eficiencia de los algoritmos
› Medida de la eficiencia de los algoritmos
› ¿Cómo se mide la eficiencia de los algoritmos?
› Medida asintótica de la eficiencia
› Órdenes de complejidad
› Bibliografía
Análisisdelaeficienciadelosalgoritmos
Javier Vélez Reyes [email protected] 3 - 3
Obje6vosgenerales
Obje8vos
› Aprender qué es la eficiencia de los algoritmos
› Aprender los criterios en torno a los cuales se puede clasificar la eficiencia
› Conocer las principales métricas de medida de la eficiencia
› Aprender cómo se puede calcular el coste de un algoritmo bajo 3 supuestos
› Medida del tiempo de ejecución
› Medida asintótica O
› Hipótesis de caso peor
› Aprender cómo se mide la eficiencia algorítmica de
› Algoritmos recursivos
› Algoritmos iterativos
› Adquirir una visión crítica sobre la complejidad algorítmica
› Adquirir herramientas para seleccionar el mejor algoritmo para un problema
› Adquirir herramientas para seleccionar la estructura más eficiente para un problema
Análisisdelaeficienciadelosalgoritmos
Javier Vélez Reyes [email protected] 3 - 4
Introducción
¿Quéeslaeficienciadelosalgoritmos?El análisis de la eficiencia de los algoritmos permite establecer criterios compara6vos yclasificatoriosentrealgoritmosqueayudanaentendercómosecomportanyescalanéstosen cuanto a la consumición de recursos – 6empo y memoria fundamentalmente – conrespectoalamagnituddesusparámetrosdeentrada
Definición
Elanálisisdelaeficienciadelosalgoritmosesunestudioteórico,formal,compara6voe
independientedelaimplementaciónque6eneporobjetoclasificaralosalgoritmosen
familiasdecomplejidaddeacuerdoacómosecomportansegúncrece lamagnitudde
susparámetrosdeentrada
› Estudio formal
› Teórico
› Comparativo
› Clasificatorio
› De recursos de máquina
› Del lenguaje de programación
› De aspectos constantes
› De aspectos de escala
Estudio teórico Independencia
Análisisdelaeficienciadelosalgoritmos
Javier Vélez Reyes [email protected] 3 - 5
Introducción
¿Quéeslaeficienciadelosalgoritmos?El análisis de la eficiencia de los algoritmos permite establecer criterios compara6vos yclasificatoriosentrealgoritmosqueayudanaentendercómosecomportanyescalanéstosen cuanto a la consumición de recursos – 6empo y memoria fundamentalmente – conrespectoalamagnituddesusparámetrosdeentrada
booleancontiene(T[]v,intp,Te){
inti=p;
booleanfound=false
while(!found&&i<=v.length){
found=(v[i]==e);
i=i+1;
}
returnfound;}
booleanrepetidos(T[]v){
booleanrepetidos=false;
inti=0;
while(!repetidos&&i<v.length)
repetidos=contiene(v,i+1,v[i]);
returnrepetidos;
}
booleanordenar(T[]v){
inttemp;
for(inti=1;i<v.length;i++)
for(intk=v.length-1;k>=i;k--)
if(v[k]<v[k-1]){
temp=v[k];
v[k]=v[k-1];
v[k-1]=temp;
}
}
< tiempo
Análisisdelaeficienciadelosalgoritmos
Javier Vélez Reyes [email protected] 3 - 6
Introducción
¿Quéeslaeficienciadelosalgoritmos?El análisis de la eficiencia de los algoritmos permite establecer criterios compara6vos yclasificatoriosentrealgoritmosqueayudanaentendercómosecomportanyescalanéstosen cuanto a la consumición de recursos – 6empo y memoria fundamentalmente – conrespectoalamagnituddesusparámetrosdeentrada
Criteriosdemedidadelaeficiencia
Crit
erio
s de
med
ida
I. Según el tipo de recurso
II. Según el tipo de comportamiento
II. Según la métrica utilizada
La eficiencia de los algoritmos puede medirse de acuerdo a la consumición de diferentes recursos. La medida de la eficiencia de un algoritmo puede ser distinta según el recurso
Espacial
Temporal
Otros
Se analiza la relación funcional existente entre el tamaño del problema expresado en términos de sus parámetros de entrada y la consumición del recurso memoria
Se analiza la relación funcional existente entre el tamaño del problema expresado en términos de sus parámetros de entrada y la consumición del recurso tiempo de cómputo
Foco de atención
}
Se analiza la relación funcional existente entre el tamaño del problema expresado en términos de sus parámetros de entrada y la consumición de otros recursos como periféricos empleados, ancho de banda, consumo eléctrico, etc.
Fijado un tipo de recurso, la eficiencia de los algoritmos puede medirse bajo distintos supuestos en los que se supone se encuentra el problema medio a analizar
Fijado un tipo de recurso y un determinado supuesto, debe escogerse una métrica comparativa que permita clasificar a los algoritmos en familias con un comportamiento interno similar
Análisisdelaeficienciadelosalgoritmos
Javier Vélez Reyes [email protected] 3 - 7
Introducción
¿Quéeslaeficienciadelosalgoritmos?El análisis de la eficiencia de los algoritmos permite establecer criterios compara6vos yclasificatoriosentrealgoritmosqueayudanaentendercómosecomportanyescalanéstosen cuanto a la consumición de recursos – 6empo y memoria fundamentalmente – conrespectoalamagnituddesusparámetrosdeentrada
Criteriosdemedidadelaeficiencia
Crit
erio
s de
med
ida
I. Según el tipo de recurso
II. Según el tipo de comportamiento
II. Según la métrica utilizada
La eficiencia de los algoritmos puede medirse de acuerdo a la consumición de diferentes recursos. El tipo de recurso establece una partición del espacio de algoritmos distinta
Peor caso
Caso medio
Mejor caso
Se estima la máxima cantidad de recursos que un algoritmo puede necesitar consumir para su ejecución en función de su entrada. Supone una cota superior de estos recursos
Se estima el comportamiento a partir de una hipótesis sobre la distribución estadística de los datos de entrada que se supone más probable. También llamado análisis probabilístico
Foco de atención
}
Se estiman los recursos necesarios para su ejecución en condiciones óptimas en función de la entrada. Esta medida afecta al ejemplar más sencillo del problema
Fijado un tipo de recurso, la eficiencia de los algoritmos puede medirse bajo distintos supuestos en los que se supone se encuentra el problema medio a analizar
Fijado un tipo de recurso y un determinado supuesto, debe escogerse una métrica comparativa que permita clasificar a los algoritmos en familias con un comportamiento interno similar
.
Análisisdelaeficienciadelosalgoritmos
Javier Vélez Reyes [email protected] 3 - 8
Introducción
¿Quéeslaeficienciadelosalgoritmos?El análisis de la eficiencia de los algoritmos permite establecer criterios compara6vos yclasificatoriosentrealgoritmosqueayudanaentendercómosecomportanyescalanéstosen cuanto a la consumición de recursos – 6empo y memoria fundamentalmente – conrespectoalamagnituddesusparámetrosdeentrada
Criteriosdemedidadelaeficiencia
Crit
erio
s de
med
ida
I. Según el tipo de recurso
II. Según el tipo de comportamiento
II. Según la métrica utilizada
La eficiencia de los algoritmos puede medirse de acuerdo a la consumición de diferentes recursos. El tipo de recurso establece una partición del espacio de algoritmos distinta
Cota superior. O
Cota inferior. Ω
Cota exacta. Θ
Se mide el coste asintótico de la ejecución de un algoritmo de acuerdo a una cota superior. Es decir, la ejecución nunca, a partir de cierto valor, sobrepasará la cota de coste establecida
Se mide el coste asintótico de la ejecución de un algoritmo de acuerdo a una cota inferior. Es decir, la ejecución nunca, a partir de cierto valor, será menor que la cota establecida
Foco de atención
}
Se mide el coste asintótico de la ejecución de un algoritmo de acuerdo a una cota resultante de la intersección entre O y Ω. Es decir, la ejecución crece al ritmo de la cota establecida
Fijado un tipo de recurso, la eficiencia de los algoritmos puede medirse bajo distintos supuestos en los que se supone se encuentra el problema medio a analizar
Fijado un tipo de recurso y un determinado supuesto, debe escogerse una métrica comparativa que permita clasificar a los algoritmos en familias con un comportamiento interno similar
.
Análisisdelaeficienciadelosalgoritmos
Javier Vélez Reyes [email protected] 3 - 9
Introducción
¿Quéeslaeficienciadelosalgoritmos?El análisis de la eficiencia de los algoritmos permite establecer criterios compara6vos yclasificatoriosentrealgoritmosqueayudanaentendercómosecomportanyescalanéstosen cuanto a la consumición de recursos – 6empo y memoria fundamentalmente – conrespectoalamagnituddesusparámetrosdeentrada
Métricasdeanálisisdelaeficienciadelosalgoritmos
Cota superior. O Si g(n) es la función de coste de un algoritmo, se dice que g(n) está en O(f(n)) si a partir de un cierto punto crece, a lo sumo, menos rápido que f(n). Es decir, la gráfica de g está por debajo de la de f
.
Cota inferior. Ω Si g(n) es la función de coste de un algoritmo, se dice que g(n) está en Ω(f(n)) si a partir de un cierto punto crece más rápido que f(n). Es decir, la gráfica de g está por encima de la de f)
Cota exacta. Θ Si g(n) es la función de coste de un algoritmo, se dice que g(n) está en Θ(f(n)) si crece de la misma forma (al mismo ritmo) que f(n)
Análisisdelaeficienciadelosalgoritmos
Javier Vélez Reyes [email protected] 3 - 10
Medidadelaeficienciadelosalgoritmos
¿Cómosemidelaeficienciadelosalgoritmos?Lamedida de la eficiencia asintó6ca de algoritmos pretende clasificar cada algoritmo enuna familia de complejidad asintó6ca determinada prescindiendo de consideracionesconstantesodeescala.Ennuestroestudiou6lizaremosmedidatemporal,casopeorycotasuperior
Medidaasintó8cadelaeficiencia
.
Tiempo medido
A*n+B
A*2n+B
A*3n+B
...
A*kn+B
Búsqueda de un elemento en un vector Si hacemos medidas expe-rimentales sobre sucesivasejecuciones de un algorit-mo y en cada ejecuciónduplicamos el tamaño delproblema, observamos queel 6empo de ejecucióntambién se duplica. En esecaso se puede decir que elc o s t e a s i n t ó 6 c o d e lalgoritmoeslineal
Tiempo de ejecución
El tamaño del problema es proporcional al número de elementos que contiene el vector. Sin embargo el tiempo de ejecución no se ve afectado por constantes multiplicativas o sumativas ya que el coste temporal se duplica al duplicar el tamaño del problema
t
2t
3t
...
kt
O (n)
n
2n
3n
...
kn
Tamaño
Análisisdelaeficienciadelosalgoritmos
Javier Vélez Reyes [email protected] 3 - 11
Medidadelaeficienciadelosalgoritmos
¿Cómosemidelaeficienciadelaalgoritmos?Lamedida de la eficiencia asintó6ca de algoritmos pretende clasificar cada algoritmo enuna familia de complejidad asintó6ca determinada prescindiendo de consideracionesconstantesodeescala.Ennuestroestudiou6lizaremosmedidatemporal,casopeorycotasuperior
Ordenesdeeficiencia
.
El análisis asintó6co nos permiteclasificar el espacio de algoritmos endis6ntas familias que se correspondenconórdenesdecomplejidaddiferentes
Constante.O(1)
Logarítmica.O(logn)
Cuadráticainversa.O(√n)Lineal.O(n)
Cuasilineal.O(nlogn)Cuadrática.O(n2)
Cúbica.O(n3)
Polinómicadegradok.O(nk)...
Exponencial.O(2n)...
Exponencialdegradok.O(kn)Factorial.O(n!)
Hiperexponencial.O(nn)
intfactorial(intn){
if(n==0)return1;
elsereturnn*factorial(n-1);
}
Análisisdelaeficienciadelosalgoritmos
Javier Vélez Reyes [email protected] 3 - 12
Medidadelaeficienciadelosalgoritmos
¿Cómosemidelaeficienciadelaalgoritmos?Lamedida de la eficiencia asintó6ca de algoritmos pretende clasificar cada algoritmo enuna familia de complejidad asintó6ca determinada prescindiendo de consideracionesconstantesodeescala.Ennuestroestudiou6lizaremosmedidatemporal,casopeorycotasuperior
Ordenesdeeficiencia
.
C a d a o r d e n d e e fi c i e n c i arepresentaunniveldecrecimientocon respecto al tamaño delproblema. En la gráfica adjuntap u e d e v e r s e l a r e l a c i ó ncompara6va de los niveles decrecimiento de los primerosórdenesdeeficienciaanteriores
Análisisdelaeficienciadelosalgoritmos
Javier Vélez Reyes [email protected] 3 - 13
Medidadelaeficienciadelosalgoritmos
¿Cómosemidelaeficienciadelaalgoritmos?Lamedida de la eficiencia asintó6ca de algoritmos pretende clasificar cada algoritmo enuna familia de complejidad asintó6ca determinada prescindiendo de consideracionesconstantesodeescala.Ennuestroestudiou6lizaremosmedidatemporal,casopeorycotasuperior
Ordenesdeeficiencia
.
C a d a o r d e n d e e fi c i e n c i arepresentaunniveldecrecimientocon respecto al tamaño delproblema. En la gráfica adjuntap u e d e v e r s e l a r e l a c i ó ncompara6va de los niveles decrecimiento de los órdenes deeficienciasiguientesan2
Análisisdelaeficienciadelosalgoritmos
Javier Vélez Reyes [email protected] 3 - 14
Medidadelaeficienciadelosalgoritmos
¿Cómosemidelaeficienciadelosalgoritmos?Lamedida de la eficiencia asintó6ca de algoritmos pretende clasificar cada algoritmo enuna familia de complejidad asintó6ca determinada prescindiendo de consideracionesconstantesodeescala.Ennuestroestudiou6lizaremosmedidatemporal,casopeorycotasuperior
Algoritmosrecursivos
.
Elcálculodelcostetemporaldeunalgoritmorecursivoseexpresaentérminosdelcostede los casos base y los casos de recursión del mismo. Para ilustrar cómo se procedeconsideremos la función del cálculo de un número factorial en su versión recursiva.Entonces, si u6lizamos T(n) para representar el coste de computar la ejecución contamañon…
intfactorial(intn){
if(n==0)return1;
elsereturnn*factorial(n-1);
}
T(n)=
C1sin==0
T(n-1)+C2sin>0
Coste caso base
Coste caso recurrente
Resoluciónparafactorial(5):
T(5)=T(4)+C2=T(3)+C2+C2=T(2)+C2+C2+C2=T(1)+C2+C2+C2+C2
=T(0)+C2+C2+C2+C2+C2=C1+C2+C2+C2+C2+C2=C1+5*C2
≈O(n)
Dado que el coste temporal resulta linealmente propor-cional al tamaño del proble-ma el orden de complejidad es lineal
}
Análisisdelaeficienciadelosalgoritmos
Javier Vélez Reyes [email protected] 3 - 15
Medidadelaeficienciadelosalgoritmos
¿Cómosemidelaeficienciadelosalgoritmos?Lamedida de la eficiencia asintó6ca de algoritmos pretende clasificar cada algoritmo enuna familia de complejidad asintó6ca determinada prescindiendo de consideracionesconstantesodeescala.Ennuestroestudiou6lizaremosmedidatemporal,casopeorycotasuperior
Algoritmosrecursivos
.
Paraevitarencadacasoun razonamientosimilar al anterior, podemos derivar unafórmulageneraldecálculoenfuncióndelaestructuradelafunciónrecursiva,soluciónanalí6ca de la ecuación de recurrenciasadjunta
i:Númeromáximodeinvocacionesrecursivasporcaso
d:Factordedecrecimientodelproblemaenladivisióndelproblema
n<d:Casobase
n>=d:Casorecursivo
c1·nk,c2·nk:Costeasociadosalaspartesnorecursivas
k:Niveldedependenciadelasoperacionesnorecursivasconeltamañodelproblema
0:Constante
1:Lineal
2:Cuadrática
T(n)=
c1·nksin<d
i·T(n±d)+c2·nksin>=d
Análisisdelaeficienciadelosalgoritmos
Javier Vélez Reyes [email protected] 3 - 16
Medidadelaeficienciadelosalgoritmos
¿Cómosemidelaeficienciadelosalgoritmos?Lamedida de la eficiencia asintó6ca de algoritmos pretende clasificar cada algoritmo enuna familia de complejidad asintó6ca determinada prescindiendo de consideracionesconstantesodeescala.Ennuestroestudiou6lizaremosmedidatemporal,casopeorycotasuperior
.
Si±reducciónporsubstracción– Si±reducciónpordivisión/
T(n)≈
O(nk+1)sii==1
O(in/d)sii>1
T(n)≈
O(nk)sii<dk
O(nlogdi)sii>dk
O(nklogn)sii=dk
AlgoritmosrecursivosParaevitarencadacasoun razonamientosimilar al anterior, podemos derivar unafórmulageneraldecálculoenfuncióndelaestructuradelafunciónrecursiva,soluciónanalí6ca de la ecuación de recurrenciasadjunta
T(n)=
c1·nksin<d
i·T(n±d)+c2·nksin>=d
Análisisdelaeficienciadelosalgoritmos
Javier Vélez Reyes [email protected] 3 - 17
Medidadelaeficienciadelosalgoritmos
¿Cómosemidelaeficienciadelosalgoritmos?Lamedida de la eficiencia asintó6ca de algoritmos pretende clasificar cada algoritmo enuna familia de complejidad asintó6ca determinada prescindiendo de consideracionesconstantesodeescala.Ennuestroestudiou6lizaremosmedidatemporal,casopeorycotasuperior
Algoritmositera8vos
.
Elcostetemporaldeunalgoritmoitera6vosecalculaacumula6vamenteapar6rdelcostedecadaunadesusinstruccionescons6tuyentes.Estudiemossucoste
1LasOperacionesbásicasno
dependendeltamañodelproblema
Instrucción
Operacionesbásicas1
-Entrada/salida
-Asignación
-Expresionesescalares
Secuenciassentencias
-s1;s2;s3Sentenciascondicionales
-if(e){b1}else{b2}
-switch(e){
casec1:b1;
casec2:b2;
}
Coste
O(1)
O(1)
O(1)
ΣO(si)=max{O(si)}
max{O(e),O(b1),O(b2)}
max{O(e),O(b1),O(b2)}
Instrucción
Sentenciasiterativas
-for(ini;e;inc){b}
-while(e){b}
-do{b}while(e)
Invocaciónsubprogramas
-f(e1,e2)
Reglasdeproductoysuma
-O(f+g)
-O(f*g)
Coste
max{O(ini),n·max{O(e),O(inc),O(b)}}
n·max{O(e),O(b)}
n·max{O(e),O(b)}
Max{O(e1),O(e2),O(f)}
O(f+g)=max(O(f),O(g))
O(f*g)=O(f)*O(g)
Análisisdelaeficienciadelosalgoritmos
Javier Vélez Reyes [email protected] 3 - 18
Medidadelaeficienciadelosalgoritmos
¿Cómosemidelaeficienciadelosalgoritmos?Lamedida de la eficiencia asintó6ca de algoritmos pretende clasificar cada algoritmo enuna familia de complejidad asintó6ca determinada prescindiendo de consideracionesconstantesodeescala.Ennuestroestudiou6lizaremosmedidatemporal,casopeorycotasuperior
Algoritmositera8vos
.
Apar6rdelosanálisisanterioresdecostede cada instrucción analicemos laeficienciadeunalgoritmoitera6vo
booleanordenar(T[]v){
inttemp;
for(inti=1;i<v.length;i++) O(1)
for(intk=i+1;k<v.length;k++)O(1)
if(v[i]<v[k]){O(1) O(n2)
temp=v[k];O(1)
v[k]=v[i];O(1)O(1)O(1)·(n-i)O(n)·n
v[i]=temp;O(1)
}
}max max max max
Análisisdelaeficienciadelosalgoritmos
Javier Vélez Reyes [email protected] 3 - 19
BibliograWa
BibliograJaBibliografía básica
Estructuras de datos en java. Weiss, Mark
Allen. Pearson Addison – Wesley. ISBN
9788478290352
Análisisdelaeficienciadelosalgoritmos
Javier Vélez Reyes [email protected] 3 - 20
BibliograWa
BibliograJaBibliografía complementaria
Fundamentos de Algoritmia. G. Brassard, P.
Bratley. Prentice Hall. SBN: 84-89660-00-X
1997
Diseño de programas. Formalismo y
abstracción. Ricardo Peña Marí. Pearson -
Prentice Hall. ISBN 13: 9788420541914
JavierVé[email protected]
DepartamentodeLenguajesYSistemasInformáAcosUNED
EstrategiasdeprogramaciónyestructurasdedatosGradoenIngenieríaInformá8ca
GradoenTecnologíasdelaInformaciónDepartamentodeLenguajesySistemasinformá6cos
4TiposAbstractosdeDatosEstructurasdeDatosBásicas
TiposAbstractosdeDatos
Javier Vélez Reyes [email protected] 4 - 2
Índice
Índice
› Introducción
› ¿Qué son los tipos abstractos de datos?
› Especificación de tipos abstractos de datos
› Tipos Abstractos de Datos
› Catálogo de tipos abstractos de datos
› Diseño de tipos abstractos de datos
› Bibliografía
TiposAbstractosdeDatos
Javier Vélez Reyes [email protected] 4 - 3
Obje6vosgenerales
Obje8vos
› Aprender qué son los tipos abstractos de datos
› Aprender cómo se construyen tipos abstractos de datos
› Dentro del paradigma estructurado
› Dentro del paradigma de orientación a objetos
› Conocer los distintos tipos abstractos de datos que existen
› Aprender a aplicar tipos abstractos de datos en problemas reales
› Valorar el avance conceptual que supone trabajar con abstracciones de datos
› Obtener una actitud critica para valorar el uso y diseño de tipos abstractos de datos
› Entender la relación existe entre la naturaleza de los tipos abstractos de datos y
› Las estrategias de implementación recursivas o iterativas que conviene aplicar
› La complejidad algorítmica inherente que supone su implementación
› Entender el valor preponderante de las abstracciones de datos estudiadas
› Aprender a adaptar dichas abstracciones a cada problema particular
TiposAbstractosdeDatos
Javier Vélez Reyes [email protected] 4 - 4
Introducción
¿Quésonlos8posabstractosdedatos?
Definiciones
Lacaracterizaciónformalyprecisadeloqueentenderemosenestecursopor6poabstractode datos parte de una diferenciación previa fundamental entre tres conceptos: 6poabstractodedatos,6podedatosyestructuradedatos
Una estructura de datos es una representación computacional de laorganizacióndeunconjuntodedatosar6culadaentérminosde6posdedatosprimi6vosyotrasestructuraso6posdellenguaje
Un6podedatosesladefinicióndeunaestructuradedatosporpartedelusuarioprogramadorparaincluirlacomounnuevoconceptonominalqueformepartedelasen6dadessemán6casdelproblema
Un6poabstractodedatosesunmodeloformaldeorganizacióndedatoscaracterizadoporciertocomportamientosemán6codefinidoentérminosde una colección de propiedades axiomá6cas y operaciones. Dichomodelo es prescrip6vamente independiente de sus posiblesimplementacionessubyacentesyrespondeaunpatróndeusorecurrente
I.EstructuradeDatos
II.Tipodedatos
III.Tipoabstractodedatos
-Bookelements[]
+voidpush(Bookb){...}+Bookpop(){...}
BookStack
Telements[]
Stack<T>
+voidpush(Te)+Tpop()
TiposAbstractosdeDatos
Javier Vélez Reyes [email protected] 4 - 5
Introducción
Especificaciónde8posabstractosdedatos
Partesdelaespecificaciónde8posabstractosdedatos
Laconstrucciónde6posabstractosdedatoscomienzapor laespecificación formaldeunconjuntodeoperacionesquedefinenelcomportamientodel6po.Cadaoperacióndel6posedefine sintác6camenteporunperfil y semán6camenteporuncontrato. Porextensiónllamaremosperfil y contratodeun6poabstractodedatos al formado, respec6vamente,portodassusoperaciones
El perfil de cada operación describe la sintaxis de lamisma indicando su nombre, 6po y nombre de cadaparámetrodeentraday/osalidayel6poderetornodelamisma
I.Partesintác8ca
II.Partesemán8ca
Especificacióndeun8poabstractodedatos
El contrato de cada operación describe en términosformales abstractos el comportamiento esperado dela misma tras su operación y el conjunto de valoreslegí6mos que es posible aplicar a cada parámetroformalpararealizarlainvocación
TiposAbstractosdeDatos
Javier Vélez Reyes [email protected] 4 - 6
Introducción
Lasoperacionesconsultorasdebengaran6zarquenoprovocaranuncambioenelestadointernodelaabstracciónyaquedenoserasí la semán6ca de las operaciones puede verse comprome6dadesdelaperspec6vadelosusuariosdelaabstracción
I.Separaciónentreoperacionesconsultorasymodificadoras
stack.pop()+stack.pop()!=2*stack.pop()
Losparámetrosquedeberecibirunaoperacióndebensersolode6pooperando. Los parámetrosde configuración – aquellos paralosqueexisteun valorporomisión–deben serproporcionadospreviamente mediante la invocación opcional de otrasoperacionesdeconfiguración
II.Separaciónentreparámetrosdeconfiguraciónyoperandos
Reglasdeespecificación
Laespecificacióndeperfilesdelos6posabstractosdedatosesunalabordelicadaquedebeprestaratenciónaunaseriereglasquevandirigidasaevitarefectoscolateralescuandoseinvocanlasoperacionesdel6poabstractodedatos.Acon6nuaciónresumidoslas4reglasfundamentalesdelaespecificación
Especificaciónde8posabstractosdedatos.ParteSintác8ca
Stack<T>
+voidpush(Telement)+Tpop()...
Impresora
+voidimprimir(Trabajot)+voidsetPapel(intpapel)+voidsetColor(booleanc)+voidset2Caras(booleanc)
L
TiposAbstractosdeDatos
Javier Vélez Reyes [email protected] 4 - 7
Introducción
Elnúmerodeparámetrosformalesquedebecontenerelperfildeuna operación no debe ser mayor de 3. Si la can6dad deinformación que se debe proporcionar es mucha considererealizarabstraccionesqueencapsulenvariosparámetrosenuno
III.Tamañodelasoperaciones
Laespecificacióndelperfildeunaabstraccióndedatosdebeserrealizada demanera que garan6ce que cada operación del 6poresponde a unas responsabilidades que no colisionan con lasresponsabilidades de otra/s operaciones. Asimismo, el nivel degranularidad de las operaciones debe mantenerse homogéneoentreellas
IV.Tamañodelasabstracciones
Reglasdeespecificación
Laespecificacióndeperfilesdelos6posabstractosdedatosesunalabordelicadaquedebeprestaratenciónaunaseriereglasquevandirigidasaevitarefectoscolateralescuandoseinvocanlasoperacionesdel6poabstractodedatos.Acon6nuaciónresumidoslas4reglasfundamentalesdelaespecificación
Especificaciónde8posabstractosdedatos.ParteSintác8ca
Trabajo
-idioma- usuario
- documento- bandeja
ColaDeImpresión<Trabajo>
+voidimprimir(Trabajot)+voidcancelar(trabajot)+voidreset()+booleanstatus()
TiposAbstractosdeDatos
Javier Vélez Reyes [email protected] 4 - 8
Introducción
Partesdeuncontrato
Laespecificacióndeun6poabstractodedatos también incluye ladefinicióndelcontratopara cada una de las operaciones delmismo. Estos contratos describen el efecto de lasoperaciones sobre el estado interno del 6po y prescriben las condiciones de debensa6sfacerlosparámetrosdeentrada
pre:truestack.push(TElemente)post:stack.nElementos==stack’.nElementos+1ANDstack.top()==e
Especificaciónde8posabstractosdedatos.ParteSemán8ca
Lasprecondicionesdeuncontratodeoperacióndescriben las condiciones bajo las cuales puedeinvocarse de forma segura la misma paragaran6zarunfuturoestadoconsistente.Estasseexpresanentérminosde losposiblesvaloresdecadaparámetrodeentradaoentrada/salida
I.Precondiciones
Las postcondiciones de un contrato deoperación describen formalmente los efectosqueprovoca la invocación.Éstassedescribenapar6rde losparámetrosdeentradaysalidadelas operaciones y de las variables internas quereferencian el estado anterior del 6po(U6lizaremoselapostrofeparareferirnosaél)
II.Postcondiciones
TiposAbstractosdeDatos
Javier Vélez Reyes [email protected] 4 - 9
Tiposabstractosdedatos
Catálogode8posabstractosdedatosLos 6pos abstractos de datos canónicos que aparecen recurrentemente dentro de laingenieríadelsoWwaresepuedenclasificarsegúnsucrecientenúmeroderestriccionesenrelacióna laspolí6casdeorganizaciónyusodesusdatos internos.El siguientediagramailustraloexpuesto
Tiposabstractosdedatos
Estructurassinorden
Estructurasjerarquías
Estructurasindexadas
Estructuraslineales
Bolsas
Conjuntos
Listas
Pilas
Cola
Árboles
Grafos
Estructurascirculares
Listascirculares
Enumeración
Matrices
Matricesdispersas
Estructurastabulares
Tablasdedispersión
Diccionarios
+ - Restricciones
TiposAbstractosdeDatos
Javier Vélez Reyes [email protected] 4 - 10
Tiposabstractosdedatos
Catálogode8posabstractosdedatosLos 6pos abstractos de datos canónicos que aparecen recurrentemente dentro de laingenieríadelsoWwaresepuedenclasificarsegúnsucrecientenúmeroderestriccionesenrelacióna laspolí6casdeorganizaciónyusodesusdatos internos.El siguientediagramailustraloexpuesto
Bolsas
EstructurasSinOrden
Conjuntos
-Noexisteordenentreloselementos -Noexisteordenentreloselementos-Nosepuedenrepe6relementosdelmismovalor
1
2 1
2
5 3
4
1
2 6
7
5 3
4
TiposAbstractosdeDatos
Javier Vélez Reyes [email protected] 4 - 11
Tiposabstractosdedatos
Catálogode8posabstractosdedatosLos 6pos abstractos de datos canónicos que aparecen recurrentemente dentro de laingenieríadelsoWwaresepuedenclasificarsegúnsucrecientenúmeroderestriccionesenrelacióna laspolí6casdeorganizaciónyusodesusdatos internos.El siguientediagramailustraloexpuesto
Listas
EstructurasLinealmenteordenadas
Pilas-Existeunordentotalentresuselementos-Existeunúnicopuntodeataque-Noexistedestrucción
3 7 2 4
3 7 2 4 3 7 2 4
3 7 2 4
-Existeunordentotalentresuselementos-Existeunúnicopuntodeataquellamadocima-Cimainmutable
Primero / Siguiente Punto de interés
Doble enlace Acceso por posición
3 7
2
Colas-Existeunordentotalentresuselementos-Unpuntodeataqueparainserciónyotroparaborrado-Cabezainmutable
3 7 2
Pila Cola
Inserción & borrado
Borrado Inserción
TiposAbstractosdeDatos
Javier Vélez Reyes [email protected] 4 - 12
Tiposabstractosdedatos
Catálogode8posabstractosdedatosLos 6pos abstractos de datos canónicos que aparecen recurrentemente dentro de laingenieríadelsoWwaresepuedenclasificarsegúnsucrecientenúmeroderestriccionesenrelacióna laspolí6casdeorganizaciónyusodesusdatos internos.El siguientediagramailustraloexpuesto
Grafos
EstructurasJerárquicas
ÁrbolesBinarios-Unconjuntodenodossinorden-Unconjuntodearistassinorden-Relaciónentrearistas&nodos
-Variantedeárbolgeneral-Cadanodo6enealosumounárbolizquierdoyderecho
ÁrbolesBinariosdeBúsqueda-Variantedeárbolbinario-Loselementossedisponenenordenrespectoacadanodo-Lamáximadiferenciadenivelesdebeser<=2
ArbolesGenerales-Unnodoraízcomopuntodeacceso-Cadanodopuedetenervarioshijos-Cadanodosólo6eneunpadres-Elnodoraízno6enepadre-Nodoshojasonnodossinhijos
3
7
2
3 7
2
5 4 9
4 2
3
9 7
3 7
2
4 9
Árbol de Búsqueda Árbol Binario
TiposAbstractosdeDatos
Javier Vélez Reyes [email protected] 4 - 13
Tiposabstractosdedatos
Diseñode8posabstractosdedatosDesdeunaperspec6vadediseño,podemosconceptualizartodoslos6posabstractosqueseaplican en el marco de la ingeniería del soWware como colecciones generales deinformación. A par6r de ahí cada 6po abstracto de datos puede entenderse como unaespecialización de este concepto. El modelo UML que u6lizaremos en este curso es elsiguiente
<<interface>>
CollectionIF<T>
<<interface>>
SetIF<T> <<interface>>
ListIF<T> <<interface>>
StackIF<T> <<interface>>
QueueIF<T> <<interface>>
TreeIF<T> <<interface>>
BTreeIF<T>
<<interface>>
IteratorIF<T>
<<interface>>
ComparatorIF<T>
Sorter1
1. Es solo un ejemplo de clase con un método de ordenación
TiposAbstractosdeDatos
Javier Vélez Reyes [email protected] 4 - 14
Tiposabstractosdedatos
Diseñode8posabstractosdedatosComopuedeapreciarseeneldiagramaUMLdeclasesanterior,cadaabstraccióndedatosserepresentaporunainterfazqueespecializa lascapacidadesgeneralesdeunacolecciónabstracta. A lo largo de los siguientes capítulos describiremos en detalle los contenidosespecíficos de cada interfaz en relación a cada tema. Ahora presentamos las interfacescomunesdelaasignatura,Collec6onIF,SetIF,IteratorIFyComparatorIF
publicinterfaceCollectionIF<E>{/***Devuelveelnúmerodeelementos.*@returnelnúmerodeelementos.*/publicintsize();/***Determinasilacolecciónestávacía.*@returntruesilacolecciónestávacía*/publicbooleanisEmpty();/***Determinasiunelementoestácontenido.*@paramelelementoacomprobar.*@returntrue,siestácontenido./*publicbooleancontains(Ee);
/***Eliminatodosloselementos.*/publicvoidclear();/***Devuelveuniteradorsobrelacolección.*@returnuniteradorsobrelacolección.*/publicIteratorIF<E>iterator();}
1 7 4
3
1 7 4
false
true
1 7 4
false
1 7 4
true
3,
7,
1 7 4
1 7 4
TiposAbstractosdeDatos
Javier Vélez Reyes [email protected] 4 - 15
Tiposabstractosdedatos
Diseñode8posabstractosdedatosComopuedeapreciarseeneldiagramaUMLdeclasesanterior,cadaabstraccióndedatosserepresentaporunainterfazqueespecializa lascapacidadesgeneralesdeunacolecciónabstracta. A lo largo de los siguientes capítulos describiremos en detalle los contenidosespecíficos de cada interfaz en relación a cada tema. Ahora presentamos las interfacescomunesdelaasignatura,Collec6onIF,SetIF,IteratorIFyComparatorIF
publicinterfaceSetIF<E>extendsCollectionIF<E>{
/***Devuelvelaunióndeconjuntos.*@paramelconjuntoaunir.*@returnelconjuntotraslaunion.*/publicSetIF<E>union(SetIF<E>s);/***Devuelvelainterseccióndeconjuntos.*@paramelconjuntoaintersecar.*@returnelconjuntotraslaintersección.*/publicSetIF<E>intersection(SetIF<E>s);***Devuelveladiferenciadeconjuntos.*@paramelconjuntoadiferenciar.*@returnelconjuntodespuésdeladiferencia.*/publicSetIF<E>difference(SetIF<E>s);
/***Determinasiunconjuntoessubconjunto.*@paramelconjuntoacomprobar.*@returntruesiessubconjunto*/publicbooleanisSubset(SetIF<E>s);/***Borratodosloselementosdeunacolección.*@paramlacolección.*/publicvoidremoveAll(CollectionIF<E>c);
1 7 4
2 4
1 7 42
1 7 4
2 44
1 7 4
2 42
1 7 4
2 4
false
4 7 4
2 42
TiposAbstractosdeDatos
Javier Vélez Reyes [email protected] 4 - 16
Tiposabstractosdedatos
Diseñode8posabstractosdedatosComopuedeapreciarseeneldiagramaUMLdeclasesanterior,cadaabstraccióndedatosserepresentaporunainterfazqueespecializa lascapacidadesgeneralesdeunacolecciónabstracta. A lo largo de los siguientes capítulos describiremos en detalle los contenidosespecíficos de cada interfaz en relación a cada tema. Ahora presentamos las interfacescomunesdelaasignatura,Collec6onIF,SetIF,IteratorIFyComparatorIF
publicinterfaceIteratorIF<T>{/***Devuelveelsiguienteelementodelaiteracion.*@returnelsiguienteelementodelaiteracion.*/publicTgetNext();/***Indicasihaymáselementoenlaiteración.*@returntruesihaymáselementoenlaiteración*/publicbooleanhasNext();/***Restableceeliteradorparavolveralinicio.*/publicvoidreset();}
1 7 42 1
1 7 42true
1 7 42false
1 7 42
TiposAbstractosdeDatos
Javier Vélez Reyes [email protected] 4 - 17
Tiposabstractosdedatos
Diseñode8posabstractosdedatosComopuedeapreciarseeneldiagramaUMLdeclasesanterior,cadaabstraccióndedatosserepresentaporunainterfazqueespecializa lascapacidadesgeneralesdeunacolecciónabstracta. A lo largo de los siguientes capítulos describiremos en detalle los contenidosespecíficos de cada interfaz en relación a cada tema. Ahora presentamos las interfacescomunesdelaasignatura,Collec6onIF,SetIF,IteratorIFyComparatorIF
publicinterfaceComparatorIF<T>{publicstaticintLT=-1;publicstaticintEQ=0;publicstaticintGT=1;/***Comparadoselementosparaindicarsielprimeroes*menor,igualomayorqueelsegundoelemento.*@parame1elprimerelemento.*@parame2elsegundoelemento.*@returnelordendeloselementos.*/publicintcompare(Te1,Te2);/***Indicasiunelementoesmenorqueotro.*@parame1elprimerelemento.*@parame2elsegundoelemento.*@returntruesiunelementoesmenorqueotro.*/publicbooleanlt(Te1,Te2);
/***Indicasiunelementoesigualqueotro.*@parame1elprimerelemento.*@parame2elsegundoelemento.*@returntruesiunelementoesigualqueotro.*/publicbooleaneq(Te1,Te2);/***Indicasiunelementoesmayorqueotro.*@parame1elprimerelemento.*@parame2elsegundoelemento.*@returntruesiunelementoesmayorqueotro.*/publicbooleangt(Te1,Te2);}
TiposAbstractosdeDatos
Javier Vélez Reyes [email protected] 4 - 18
Bibliograga
BibliograVaBibliografía básica
Estructuras de datos en java. Weiss, Mark
Allen. Pearson Addison – Wesley. ISBN
9788478290352
Bibliografía complementaria
Construcción de software orientado a objetos.
Meyer, B. Prentice Hall España. 1998. ISBN
978-84-8322-040-5
JavierVé[email protected]áAcosUNED
Estrategiasd
eprogramaciónyestructurasd
eda
tos
Grado
enIngenieríaIn
form
á8ca.Grado
entecnologíasd
elainform
ación
Departam
entodeLenguajesy
Sistem
asinform
á6cos
ParteIITiposabstractosdedatoslineales
JavierVé[email protected]
DepartamentodeLenguajesYSistemasInformáAcosUNED
EstrategiasdeprogramaciónyestructurasdedatosGradoenIngenieríaInformá8ca
GradoenTecnologíasdelaInformaciónDepartamentodeLenguajesySistemasinformá6cos
5TiposabstractosdedatoslinealesListas
Tiposabstractosdedatoslineales.Listas
Javier Vélez Reyes [email protected] 4 - 2
Índice
Índice
› Introducción
› Tipos abstractos de datos lineales
› El tipo abstracto de datos lista
› Interfaz del tipo abstracto de datos lista
› Implementaciones del tipo abstracto de datos lista
› Implementación dinámica
› Implementación estática
› Algoritmos sobre listas
› Recorrido de los elementos de una lista
› Búsqueda de un elemento sobre una lista
› Ordenación de los elementos de una lista
› Ejercicios
› Bibliografía
Tiposabstractosdedatoslineales.Listas
Javier Vélez Reyes [email protected] 4 - 3
Obje6vosgenerales
Obje8vos
› Comprender que son los tipos abstractos de datos lineales
› Conocer la interfaz del tipo abstracto de datos Lista
› Aprender a implementar el TAD Lista mediante la interfaz ListIF
› En versión estática (con limitación explícita de capacidad máxima)
› En versión dinámica (sin limitación explícita de capacidad máxima)
› Conocer los principales problemas algorítmicos sobre listas
› Recorrido de los elementos de una lista
› Búsqueda de un elemento sobre una lista
› Ordenación de los elementos de una lista
› Practicar el diseño de funciones recursivas sobre listas
Tiposabstractosdedatoslineales.Listas
Javier Vélez Reyes [email protected] 4 - 4
Introducción
TiposabstractosdedatoslinealesLos6posabstractosdedatos lineales representanabstraccionesen lasque losdatos sonorganizadosdeformasecuencial.Acon6nuaciónsemuestranlosdiferentesTADsquecaendentrodeestacategoríayquesediferencian,esencialmente,enlaformaenqueofrecenaccesoasusdatos
Tipos abstractos de datos lineales
I. Listas
II. Pilas
III. Colas
El tipo abstracto de datos Lista representa una estructuras de datos donde los elementos se disponen de forma secuencial y las operaciones de inserción y extracción se aplican por el principio, que puede moverse recursivamente haciendo referencia a otras sublistas
El tipo abstracto de dato Pila representa una estructuras de datos donde los elementos se disponen de forma secuencial y las operaciones de inserción y extracción se aplican por el principio según la política de acceso último en entrar, primero en salir
El tipo abstracto de dato Cola representa una estructuras de datos donde los elementos se disponen de forma secuencial y las operaciones de inserción y extracción se aplican por el final y por el principio respectivamente de acuerdo a la política de primero en entrar, primero en salir
Tema 4 }
Tema 5
}
Tema 6
}
Tiposabstractosdedatoslineales.Listas
Javier Vélez Reyes [email protected] 4 - 5
Introducción
El8poabstractodedatoslistaLaslistassonabstraccionesdedatosqueorganizanunacoleccióndeelementosdemanerasecuencial,dondeacadaelementolesigueunúnicoelementosiguiente.Ladefinicióndel6poestableceunmodeloposicionaldondecadaelementose iden6ficaporun índicequepermitesuaccesodirecto
Unalistaesun6poabstractosdedatosqueorganizaunacoleccióndeelementos
de forma secuencial. Su definición permite acceder a sus elementos de forma
directaatravésdeuníndiceposicional
2 3 4 5 6 7 8 9
elementosCada posición de la lista guarda un valor de tipo genérico
1
posiciónCada elemento dentro de la lista adquiere un índice único que identifica su posición y permite accederlo de forma directa
Tiposabstractosdedatoslineales.Listas
Javier Vélez Reyes [email protected] 4 - 6
Interfazdel6poabstractodedatosLista
Lainterfazdel8poabstractodedatosListaListIF<T>
publicinterfaceListIF<T>extendsCollectionIF<T>{/***Devuelveelelementoenlaposiciónindicada.*@paramposLaposicióndelelemento.*@returnelelementoenlaposiciónindicada.*/publicTget(intpos);/***Sobrescribeelelementoenlaposiciónindicada.*@paramelementElelementosustituto.*@paramposLaposiciónqueocuparáelelemento.*/publicListIF<T>set(intpos,Telement);/***Insertaunnuevoelementoalalista.*@paramelementElelementoaañadir.*@paramposLaposicióndondedebeañadirse.*/publicvoidinsert(Telement,intpos);/***Borraelelementoenlaposiciónindicada.*@paramlaposicióndelelementoaborrar.*/publicvoidremove(intpos);}
Elinterfazdelistasqueu6lizaremosalolargode este curso, ListIF esta compuesto por lasoperacionesquedescribimosacon6nuación
1 7 442
1 7 4
32,
1 7 3
1 7 4
2
1 7
1 7 4
32,
7 3 41
Tiposabstractosdedatoslineales.Listas
Javier Vélez Reyes [email protected] 4 - 7
Implementacióndel6poabstractodedatosLista
Implementacióndel8poabstractodedatosListaListIF<T>ExistenvariasestrategiasparaimplementarlistasquerespondanalinterfazListIFanterior.En general, éstas se dividen en implementaciones dinámicas, que ar6culan listas decapacidad indefinidae implementacionesestá6cas, conunacapacidadmáxima limitadayestablecidacomoparámetro.Aquípresentamosunaconveniente.
ImplementacióndinámicabasadacadenadenodosSegún esta estrategia de implementación, una lista está formada por un atributo querepresenta el elemento en la cabeza y otro que es una referencia a una lista querepresentaelrestodelalista.Deestamaneraunalistaesunacolecciónencadenadadepares(primero,siguiente).
1 2 3 4
PrimeroyrestoInternamente cada objeto Lista contiene un atributo para representar el elemento en cabeza de lista y un atributo del tipo definido ListIF que representa una referencia al resto de elementos tras la cabeza
ListaLa lista es una secuencia de pares (primero, resto) a c a b a d a e n u n p a r fantasma
Tiposabstractosdedatoslineales.Listas
Javier Vélez Reyes [email protected] 4 - 8
Algoritmossobrelistas
AlgoritmossobrelistasEstudiaremos36posdeproblemasrecurrentessobre la interfazde listasListIF: recorridodeloselementosdeunalista,búsquedadeunelementoentreloselementosdeunalistayordenación ascendente de los elementos de una lista. La definición recursiva del 6pocondicionalasestrategiasalgorítmicasquepuedenu6lizarse.
Algoritmos sobre listas
I. Recorrido El recorrido de los elementos de una lista devuelve un iterador que permite procesarlos secuencialmente según aparecen almacenados en la estructura. Como la definición es recursiva solo el recorrido directo será estudiado. El recorrido inverso es fácilmente implementable y se deja como ejercicio
II. Búsqueda La búsqueda de un elemento sobre los elementos de una lista se realiza de forma secuencial dada la definición recursiva del tipo lo que imprime un coste lineal al algoritmo. Se estudiará el predicado de contención dejando como ejercicio la búsqueda del mínimo y el máximo
III. Ordenación La ordenación de los elementos de una lista, reorganiza sus elementos de forma que se dispongan ascendentemente de acuerdo a cierto criterio de comparación que se recibe como parámetro. En este capítulo estudiaremos dos conocidos métodos de ordenación en listas: ordenación por inserción (insert sort) y ordenación por mezcla (merge sort).La ordenación descendente es similar y se deja como ejercicio.
Independencia de la im
plementación
Tiposabstractosdedatoslineales.Listas
Javier Vélez Reyes [email protected] 4 - 9
Algoritmossobrelistas
RecorridodeloselementosdeunalistaParaar6cularelrecorridosecuencialdeloselementosdeunalistadebeimplementarseelinterfaz IteratorIF. Las implementaciones de ListIF anteriores construyen una copia de lalistacomomanejadorparagaran6zarquelaiteraciónnomodifiqueelestadodel6po
classListIterator<T>implementsIteratorIF<T>{privateListIF<T>handler=null;privateintpos;/***ConstructorparaListIterator.*@paramhandlerelmanejadordelistas.*/publicListIterator(ListIF<T>handler){this.handler=handler;this.pos=0;}/***Devuelveelsiguienteelementodelaiteracion.*@returnelsiguienteelementodelaiteracion.*/@OverridepublicTgetNext(){returnthis.handler.get(this.pos++);}
Se mantienen un manejadores de la lista y un índice posicional que indica a la posición del elemento en curso dentro de la iteración
Iteraciónconreset
La operación de avance devuelve el elemento apuntado por el índice posicional y lo actualiza para marcar el recorrido recorrido. Para invocar esta operación con seguridad hay que asegurarse de que el manejador no apunta a la lista vacía
Avance
3 41 2
getNext()
Tiposabstractosdedatoslineales.Listas
Javier Vélez Reyes [email protected] 4 - 10
Algoritmossobrelistas
RecorridodeloselementosdeunalistaParaar6cularelrecorridosecuencialdeloselementosdeunalistadebeimplementarseelinterfaz IteratorIF. Las implementaciones de ListIF anteriores construyen una copia de lalistacomomanejadorparagaran6zarquelaiteraciónnomodifiqueelestadodel6po
/***Devuelveciertosiexistenmaselementosaiterar.*@returnciertosiexistenmaselementosaiterar.*/@OverridepublicbooleanhasNext(){returnthis.pos<this.handler.size();}/***Restableceeliteradorparavolveralinicio.*/@Overridepublicvoidreset(){this.pos=0;}@OverridepublicinthashCode(){...}@Overridepublicbooleanequals(Objecto){...}@OverridepublicStringtoString(){...}}
Para saber si el iterador contiene más elementos y por tanto puede volver a invocarse la operación de avance o no, hay que preguntar si el índice posicional ha alcanzado el final de la lista
Haysiguiente
Una vez que un iterador ha llegado a su fin sólo se puede construir otro iterador, basta con volver a la posición inicial el índice posicional
Reset
3 41 2
reset()
Tiposabstractosdedatoslineales.Listas
Javier Vélez Reyes [email protected] 4 - 11
Algoritmossobrelistas
BúsquedadeunelementosobreunalistaLabúsquedadeundato sobre loselementos contenidosenuna listaesunproblemaderecorridosecuencialqueterminacuandoseencuentraunacabezaquecorrespondeconeldato buscado. En este sen6do puede aplicarse un algoritmo recursivo o aprovechar eliteradoranteriorpararesolverloitera6vamentemediantebúsquedaconcen6nela
Búsquedaitera8vaconcen8nela
/***Devuelveciertosilalistacontieneelelemento.*@paramelementElelementobuscado.*@returnciertosilalistacontieneelelemento.*/@Overridepublicbooleancontains(Telement){IteratorIF<T>listIt=this.iterator();booleanfound=false;while(!found&&listIt.hasNext()){TanElement=listIt.getNext();found=anElement.equals(element);}returnfound;}
En labúsquedaconcen6nelase iterasobrela lista y se u6liza una guarda (cen6nela)para indicar el momento en que se haencontrado el elemento y la búsquedapuedeparar
Búsquedarecursiva
/***Devuelveciertosilalistacontieneelelemento.*@paramelementElelementobuscado.*@returnciertosilalistacontieneelelemento.*/@Overridepublicbooleancontains(Telement){this.contains(element,0);}privatebooleancontains(Te,intpos)returnpos>=this.size()?false:this.get(pos).equals(e)||contains(e,pos+1)}
Enlabúsquedarecursivasecompruebasilacabeza se corresponde con el elementobuscado. Si es así el algoritmo terminadevolviendocierto y si no, se recurre sobreelrestodelalistaparabuscarelelemento
Tiposabstractosdedatoslineales.Listas
Javier Vélez Reyes [email protected] 4 - 12
Algoritmossobrelistas
OrdenacióndeloselementosdeunalistaLosalgoritmosdeordenaciónquepuedenaplicarsesobre listas,sonrela6vamentepocos,encomparaciónconlosquepuedenaplicarsesobreestructurasdeindexación.Enconcretonosotros discu6remos en este capítulo la ordenación por inserción y la ordenación pormezcla
Si la lista es vacía se devuelve ésta. Sino, se ordena el resto de la lista recursivamente y se inserta en ella el primer elemento en la posición adecuada según el criterio de orden
3 25 7 3 7
5
2
Ordenaciónporinserción Ordenaciónporburbuja
Se recorre en doble vuelta los elementos del vector con 2 pivotes anidados i y j. El pivote i avanza en 1..N y j en i+1..N. En cada iteración se comparan los valores en i y j y si es necesario se permutan
3 25 7 3 7
5
2
Ordenaciónpormezcla
Durante la primera fase, el algoritmo divide recursivamente el problema en subproblemas de la mitad de tamaño. Este proceso requiere recorrer la lista y tiene un coste de complejidad lineal
Una vez alcanzado elementos atómicos, la fase de mezcla combina las soluciones ordenando cada subproblema por combinación de sus elementos. De esta forma, se obtiene, al final, el array completamente ordenado
Tiposabstractosdedatoslineales.Listas
Javier Vélez Reyes [email protected] 4 - 13
Ejercicios
EjerciciosDadoelcarácterrecursivodeladefinicióndel6poabstractodedatosListIF,lamayoríadealgoritmossobrelistan6enenunplanteamientorecursivo.Acon6nuaciónsepresentanunacoleccióndeproblemas[picossobrelistasparaqueseresuelvandeestamanera
Diseñe una función recursiva quecalcule el número de elementos quecon6eneunalista
I. Longitud de una lista Diseñe una función recursiva quecompare lexicográficamente 2 listasdecaracteres.
II. Comparar dos listas Diseñe una función que dada unalistadeterminesiunalistaessublistadeotradadademayortamaño
III. Sublista
Diseñe una función recursivaimplemente la ordenación porinserción
IV. Ordenar por inserción Diseñe una función recursiva implemente la ordenación por mezcla
V. Ordenar por mezcla Diseñe una función recursiva quedevuelve la lista resultante deconcatenardoslistas
VI. Concatenar dos listas
Diseñe una función recursiva quedevuelvauna listacon loselementoscolocadosdeformainversaaotra
VII. Lista inversa Diseñe una función recursiva i m p l e m e n t e e l m é t o d o d e ordenación de la burbuja
VIII. Ordenar por burbuja Diseñeunafunciónquedevuelvaunalistadondesehayaneliminadotodaslasaparicionesdeunelemento
IX. Borrar todos
Diseñe una función recursiva quedevuelva una sublista prefijo queprecedeaunelementodado
X. Lista prefijo Diseñe una función recursiva quedevuelva la lista sufijo que sucede aunelementodado
XI. Lista sufijo Diseñe una función recursiva quedevuelva una lista con todos loselementosmayoresaunodado
XII. Lista mayores
Tiposabstractosdedatoslineales.Listas
Javier Vélez Reyes [email protected] 4 - 14
Ejercicios
EjerciciosDadoelcarácterrecursivodeladefinicióndel6poabstractodedatosListIF,lamayoríadealgoritmossobrelistan6enenunplanteamientorecursivo.Acon6nuaciónsepresentanunacoleccióndeproblemas[picossobrelistasparaqueseresuelvandeestamanera
Diseñe una función recursiva quesume1a todo loselementosdeunalistadeenteros
XIII. Sumar 1 Diseñeunafunciónqueindiquesidoselementos pertenecen a una listadada
XIV. Pertenecen 2 Diseñe una función que dadas doslistas que representan 2 conjuntosdevuelvalalistadelconjuntounión
XV. Unión de conjuntos
Diseñe una función que dadas dosl istas devuelva los elementoscomunesaambas
XVI. Intersección de listas Diseñe una función que recibiendounconjuntoenformadelistagenereuna lista de listas con las partes delconjunto
XVII. Partes de un conjunto Diseñe una función recursiva quedada una lista de ceros y unosdevuelvaelcomplementoa1
XVIII. Complemento a 1
Diseñe una función que cuente elnumero de veces que determinadoelementoapareceenunalista
XIX. Contador Diseñe una función que genere unalista con el número de veces queaparececadaelementodeunalista
XX. Lista contador Diseñe una función recursiva quecalcule el producto escalar de dosvectoresexpresadosenlistas
XXI. Producto escalar
Dadas dos listas que representannúmeros naturales, implemente elalgoritmo de suma generando unalistaresultado
XXII. Suma de listas Diseñe una función que dada unalista de dígitos construya el númeronaturalquerepresenta
XXIII. Convertir a número Diseñe una función que dado unnúmero genere una lista de dígitosquelorepresente
XXIV. Convertir a lista
Tiposabstractosdedatoslineales.Listas
Javier Vélez Reyes [email protected] 4 - 15
Bibliogra^a
BibliograMaBibliografía básica
Estructuras de datos en java. Weiss, Mark
Allen. Pearson Addison – Wesley. ISBN
9788478290352
Tiposabstractosdedatoslineales.Listas
Javier Vélez Reyes [email protected] 4 - 16
Bibliogra^a
BibliograMaBibliografía complementaria
Estructura de datos y algoritmos en java. A.
Drozdek. Thomsom. ISBN: 9706866116. 2007
Estructuras de datos con Java. J. Lewis, J.
Chase. Pearson – Addison Wesley. ISBN 13:
9788420541914
EstrategiasdeprogramaciónyestructurasdedatosGradoenIngenieríaInformá8ca
GradoenTecnologíasdelaInformaciónDepartamentodeLenguajesySistemasinformá6cos
JavierVé[email protected]
DepartamentodeLenguajesYSistemasInformáAcosUNED
6TiposabstractosdedatoslinealesPilas
Tiposabstractosdedatoslineales.Pilas
Javier Vélez Reyes [email protected] 5 - 2
Índice
Índice
› Introducción
› Tipos abstractos de datos lineales
› El tipo abstracto de datos Pila
› Interfaz del tipo abstracto de datos Pila
› Implementaciones del tipo abstracto de datos Pila
› Implementación dinámica
› Implementación estática
› Implementación con Lista
› Algoritmos sobre Pilas
› Recorrido de los elementos de una Pila
› Búsqueda de un elemento sobre una Pila
› Problemas y ejercicios
› Bibliografía
Tiposabstractosdedatoslineales.Pilas
Javier Vélez Reyes [email protected] 5 - 3
Obje6vosgenerales
Obje8vos
› Conocer la interfaz del tipo abstracto de datos Pila
› Aprender a implementar el TAD Pila mediante la interfaz StackIF
› En versión estática (con limitación explícita de capacidad máxima)
› En versión dinámica (sin limitación explícita de capacidad máxima)
› Utilizando una lista
› Conocer los principales problemas algorítmicos sobre pilas
› Recorrido de los elementos de una pila
› Búsqueda de un elemento sobre una pila
› Practicar el diseño de funciones recursivas sobre pilas
Tiposabstractosdedatoslineales.Pilas
Javier Vélez Reyes [email protected] 5 - 4
Introducción
TiposabstractosdedatoslinealesLos6posabstractosdedatos lineales representanabstraccionesen lasque losdatos sonorganizadosdeformasecuencial.Acon6nuaciónsemuestranlosdiferentesTADsquecaendentrodeestacategoríayquesediferencian,esencialmente,enlaformaenqueseofrecenaccesoasusdatos
Tipos abstractos de datos lineales
I. Listas
II. Pilas
III. Colas
El tipo abstracto de datos Lista representa una estructuras de datos donde los elementos se disponen de forma secuencial y las operaciones de inserción y extracción se aplican por el principio, que puede moverse recursivamente haciendo referencia a otras sublistas
El tipo abstracto de dato Pila representa una estructuras de datos donde los elementos se disponen de forma secuencial y las operaciones de inserción y extracción se aplican por el principio según la política de acceso último en entrar, primero en salir
El tipo abstracto de dato Cola representa una estructuras de datos donde los elementos se disponen de forma secuencial y las operaciones de inserción y extracción se aplican por el final y por el principio respectivamente de acuerdo a la política de primero en entrar, primero en salir
Tema 4 }
Tema 5
}
Tema 6
}
Tiposabstractosdedatoslineales.Pilas
Javier Vélez Reyes [email protected] 5 - 5
Introducción
El8poabstractodedatosPilaLaspilassonabstraccionesdedatosqueorganizanunacoleccióndeelementosdemanerasecuencial,dondeexisteunúnicopuntodeinterésllamadocimapordondeserealizanlasoperacionesdeacceso.Lapolí6cadeaccesoindicaqueelúl6moelementoenentrarenunapilaeselprimeroensalirdeella(LastInFirstOut,LIFO).
Unapilaesun6poabstractosdedatosqueorganizaunacoleccióndeelementos
de forma secuencial. Las operaciones de acceso se realizan por un extremo
llamadocimaylapolí6cadeaccesoesúl6moenentrarprimeroensalir(LIFO)
CimaLas operaciones de
inserción y extracción se
realizan por un extremo llamado
cima
Una pila puede imaginarse como una estructura de datos que dispone los mismos en secuencia uno encima de otros de manera que siempre el último elemento en apilarse es el único que puede ser directamente accedido
Pila
1
2
3
4
Tiposabstractosdedatoslineales.Pilas
Javier Vélez Reyes [email protected] 5 - 6
Interfazdel6poabstractodedatosPila
Lainterfazdel8poabstractodedatosPilaStackIF<T>
publicinterfaceStackIF<T>extendsCollectionIF<T>{/***Devuelvelacimadelapila.*@returnlacimadelapila.*/publicTgetTop();/***Insertaunelementoalapida.*@paramelementElelementoaserañadido.*@returnlapilaincluyendoelelemento.*/publicStackIF<T>push(Telement);/***Extraedelapilaelelementoenlacima.*@returnlapilaexcluyendolacabeza.*/publicStackIF<T>pop();
El interfaz de Pila que u6lizaremos a lo largo de estecurso,StackIFestácompuestopor lasoperacionesquedescribimosacon6nuación
cimaTodas las operaciones de una pila se atacan por la cima. Este método devuelve el elemento en la cima sin extraerlo
23
11
InsertarLa operación push inserta un elemento encima de la cima de manera que el elemento insertado pasa a ser la nueva cima
23
123
push(1)
ExtraerLa operación pop extrae el elemento en la cima de la pila de manera que el elemento en la cima pasa a ser el de siguiente en la pila
23
123
pop()
Tiposabstractosdedatoslineales.Pilas
Javier Vélez Reyes [email protected] 5 - 7
Implementacióndel6poabstractodedatosPila
Implementacióndel8poabstractodedatosPilaStackIF<T>ExistenvariasestrategiasparaimplementarpilasquerespondenalinterfazStackIFanterior.En general, éstas se dividen en implementaciones dinámicas, que ar6culan pilas decapacidad indefinidae implementacionesestá6cas, conunacapacidadmáxima limitadayestablecidacomoparámetro.Acon6nuaciónpresentamosvariasimplementaciones
ImplementacióndinámicabasadaenelementoysiguienteSegún esta estrategia de implementación, una pila está formada por un atributo querepresentalacimayotroqueesunareferenciaaunapilayrepresentaelrestodelapila.Deestamaneraunapilaesunacolecciónencadenadadepares(elemento,siguiente)
1 2 3 4 - -
CimaysiguienteCada objeto Pila contiene un atributo para representar el elemento en la cima de la pila y un atributo del tipo definido StackIF que representa una referencia al resto de elementos debajo de la cima
Ul8mo,elementofantasmaAunque en otras implementaciones el valor del último objeto se aprovecha para incluir un último elemento aquí el final se marca con un objeto fantasma con ambos atributos a null. Esto evita excepciones de puntero a null y simplifica la algoritmia con la pila a un único caso base isEmpty ()
PilaLa pila es una secuencia de pares (e lemento , siguiente) acabada en un par fantasma
Tiposabstractosdedatoslineales.Pilas
Javier Vélez Reyes [email protected] 5 - 8
Implementacióndel6poabstractodedatosPila
Implementacióndel8poabstractodedatosPilaStackIF<T>ExistenvariasestrategiasparaimplementarpilasquerespondenalinterfazStackIFanterior.En general, éstas se dividen en implementaciones dinámicas, que ar6culan pilas decapacidad indefinidae implementacionesestá6cas, conunacapacidadmáxima limitadayestablecidacomoparámetro.
Implementaciónestá8cabasadaenarraySegún esta estrategia de implementación, una pila está cons6tuida por un array decapacidad limitada y especificadamediante un parámetro y un índice que apunta a lacimadelapila.Lapilaempiezaporlaposición0yavanzahaciaposicionescrecientes
0 00 03 72 31
cimaEste índice apunta siempre a l e l e m e n t o q u e s e encuentra en la cima de la pila. El índice comienza en 0 y llega hasta capacidad–1 para valores de la pila
ExtraerExtraer mueve la cima de la pila una posición hacia atrás con lo que la posición anterior pasa a ser la nueva cima. Cima == 0 indica una pila vacía luego esa posición se desaprovecha
InsertarLas inserciones mueven la cima una posición hacia adelante e insertan el elemento. Si cima llega a valer capacidad - 1 el array está lleno y no se puede insertar
BasuraEl resto de elementos del array que no pertenecen a la pila son basura, resultado del trabajo con el tipo
Capacidad = 10 PilaLa pila está formada por los elementos que van desde la posición 0 hasta cima
Tiposabstractosdedatoslineales.Pilas
Javier Vélez Reyes [email protected] 5 - 9
Implementacióndel6poabstractodedatosPila
Implementacióndel8poabstractodedatosPilaStackIF<T>ExistenvariasestrategiasparaimplementarpilasquerespondenalinterfazStackIFanterior.En general, éstas se dividen en implementaciones dinámicas, que ar6culan pilas decapacidad indefinidae implementacionesestá6cas, conunacapacidadmáxima limitadayestablecidacomoparámetro.
ImplementaciónbasadaenlistaDadoquelasimplementacionesdepilasquehemosvistosonbastantesimilaresalasdelistas, es posible implementar una pila a par6r de una lista. El carácter está6co odinámicodelaimplementacióndependerádel6podeimplementacióndelistau6lizada
1 2 3 4 5 6 7 8 9
PrimeroescimaEl primer elemento
de una lista se corresponde con la
cima de la pila
RestoesrestodepilaEl resto de elementos de la lista corresponde con la subpila que hay debajo de la cima
PilaLa pila se implementa a partir de cualquier implementación del TAD Lista con interfaz ListIF. La operación de insertar se implementa con la inserción en la lista y la de extracción con la operación de obtener resto de la lista
ListIF
Tiposabstractosdedatoslineales.Pilas
Javier Vélez Reyes [email protected] 5 - 10
Algoritmossobrepilas
AlgoritmossobrepilasAdiferenciadeloqueocurríaenelcasodelaslistasdondeestudiamosquelaordenacióneraunodelosproblemasrecurrentes,enelcasodelaspilasseconsidera quetal6podemanipulacionesnosondeinterésyaqueiríanencontradelaesenciaorganiza6vadel6po–manteneraloselementosdispuestosenelordendellegadadeacuerdoaunapolí6caLIFO.Por ello, en esta sección nos centraremos en discu6r el problema del recorrido de loselementosdeunapilaylabúsquedadeunelementodentrodeunapila.
Algoritmos sobre pilas
I. Recorrido El recorrido de los elementos de una pila devuelve un iterador que permite acceder secuencialmente a los mismos según aparecen almacenados en la estructura, en sentido desde la cima hasta la base de la pila. El recorrido en sentido contrario es fácilmente implementable y se deja como ejercicio
II. Búsqueda La búsqueda de un elemento sobre los elementos de una pila se realiza de forma secuencial dada la definición del tipo lo que imprime un coste lineal al algoritmo. Si esta operación no fuese una operación interna del tipo dicha búsqueda sería destructiva o requeriría utilizar un iterador (con copia) o reconstruir la estructura tras el algoritmo. La búsqueda como operación interna permite implementar el algoritmo no destructivamente sobre la estructura interna.
Independencia de la im
plementación
Tiposabstractosdedatoslineales.Pilas
Javier Vélez Reyes [email protected] 5 - 11
Algoritmossobrepilas
RecorridodeloselementosdeunapilaParaar6cularelrecorridosecuencialde loselementosdeunapiladebeimplementarseelinterfazIteratorIF.LasimplementacionesdeStackIFanterioresconstruyenunacopiadelapilacomomanejadorparagaran6zarquelaiteraciónnomodifiqueelestadodel6po
classStackIterator<T>implementsIteratorIF<T>{privateStackIF<T>handler;privateStackIF<T>restart;/***ConstructorparaStackIterator.*@paramhandlerelmanejadordepilas.*/publicStackIterator(StackIF<T>handler){this.handler=handler;this.restart=newStackDynamic<T>(handler);}/***Devuelveelsiguienteelementodelaiteracion.*@returnelsiguienteelementodelaiteracion.*/@OverridepublicTgetNext(){Ttop=handler.getTop();handler.pop();returntop;}
Se mantienen 2 manejadores constantemente, uno para articular el recorrido de la pila. El otro siempre apunta a la cima de la pila y se utiliza para implementar la operación de reset del iterador
Iteraciónconreset
La operación de avance devuelve el elemento en cima de la pila y actualiza el manejador de recorrido extrayendo la cima. Para invocar esta operación con seguridad hay que asegurarse de que el manejador no apunta a la cola vacía…
Avance
21
43
handler
getNext()
restart
Tiposabstractosdedatoslineales.Pilas
Javier Vélez Reyes [email protected] 5 - 12
Algoritmossobrepilas
RecorridodeloselementosdeunapilaParaar6cularelrecorridosecuencialde loselementosdeunapiladebeimplementarseelinterfazIteratorIF.LasimplementacionesdeStackIFanterioresconstruyenunacopiadelapilacomomanejadorparagaran6zarquelaiteraciónnomodifiqueelestadodel6po
/***Devuelveciertosiexistenmaselementosaiterar.*@returnciertosiexistenmaselementosaiterar.*/@OverridepublicbooleanhasNext(){return!handler.isEmpty();}/***Restableceeliteradorparavolveralinicio*/@Overridepublicvoidreset(){handler=newStackDynamic<T>(restart);}@OverridepublicinthashCode(){...}@Overridepublicbooleanequals(Objecto){...}@OverridepublicStringtoString(){...}}
Para saber si el iterador contiene más elementos y por tanto puede volver a invocarse la operación de avance o no, hay que preguntar si el manejador ha alcanzado el final de la pila
Haysiguiente
Una vez que un iterador ha llegado a su fin sólo se puede construir otro iterador, o resetear este a su valor inicial. En este caso sin embargo, la operación de reset requiere una copia con lo que el coste es idéntico al de construir un nuevo iterador.
Reset
21
43
handler
reset()
restarthandler
Tiposabstractosdedatoslineales.Pilas
Javier Vélez Reyes [email protected] 5 - 13
Algoritmossobrepilas
BúsquedadeunelementosobreunapilaLa búsqueda de un dato sobre los elementos contenidos en una pila es un problemaderecorrido secuencial que termina cuando se encuentrauna cimaque corresponde coneldatobuscado.Elproblemaesquelabúsquedasobreel6poesdestruc6vaanoserqueseapliquesobrelaimplementaciónoseu6liceuniterador
Búsquedaitera8vaconcen8nela
/***Devuelveciertosilapilacontieneelelemento.*@paramelementElelementobuscado.*@returnciertosilapilacontieneelelemento.*/@Overridepublicbooleancontains(Telement){IteratorIF<T>stackIt=this.getIterator();booleanfound=false;while(!found&&stackIt.hasNext()){TanElement=stackIt.getNext();found=anElement.equals(element);}returnfound;}
En labúsquedaconcen6nelase iterasobrelapilayseu6lizaunaguarda(cen6nela)paraindicarelmomentoenquesehaencontradoelelementoylabúsquedapuedeparar
Búsquedarecursiva
/***Devuelveciertosilalistacontieneelelemento.*@paramelementElelementobuscado.*@returnciertosilalistacontieneelelemento.*/@Overridepublicbooleancontains(Telement){if(isEmpty())returnfalse;returnthis.element.equals(element)||next.contains(element);}
Enlabúsquedarecursivasecompruebasilacabeza se corresponde con el elementobuscado. Si es así el algoritmo terminadevolviendocierto y si no, se recurre sobreelrestodelapilaparabuscarelelemento
Tiposabstractosdedatoslineales.Pilas
Javier Vélez Reyes [email protected] 5 - 14
Problemasyejercicios
EjerciciosDadoel carácterdestruc6vode lasoperacionessobrepilas–paraavanzarenunapilaesnecesarioextraersucimaconpop–larealizacióndemuchosdesusalgoritmosrequieredeun proceso de protección consistente en hacer una copia de la misma. Ignorando elproblemadedestrucciónresuelvalossiguientesproblemas
Diseñe una función que calcule elnúmero de elementos que con6eneunapila
I. Longitud de una pila Devolveruna lista con loselementosde una pila según aparecen en éstadesdelacimahastalabase
II. Pasar a lista Diseñe una función que dada unalistadeterminesiéstaestácontenidaenunapilacomosubpila
III. Subpila
Diseñe una función que devuelva elelementobasedeunapila
IV. Elemento base Diseñe una función que inserte undato como elemento en la base deunapila
V. Insertar en la base Diseñe una función recursiva quedevuelva la pila resultante deconcatenardospilas
VI. Concatenar dos pilas
Diseñe una función recursiva quedevuelva una pila con los elementoscolocadosdeformainversaaotra
VII. Pila inversa Diseñeunafunciónquedevuelvaunapilaqueelimine laprimeraaparicióndeunelemento
VIII. Borrado de un elemento Diseñeunafunciónquedevuelvaunapiladonde sehayaneliminado todaslasaparicionesdeunelemento
IX. Borrar todos
Diseñeunafunciónquedevuelvaunapilaconloselementos queprecedena (están encima de) un elementodado
X. Pila prefijo Diseñe una función que devuelva lapilaconloselementosquesucedena(estándebajode)unelementodado
XI. Pila sufijo Diseñe una función recursiva quedevuelva una pila con todos loselementosmayoresaunodado
XII. Pila mayores
Tiposabstractosdedatoslineales.Pilas
Javier Vélez Reyes [email protected] 5 - 15
Problemasyejercicios
ProblemasLaspilassonun6poabstractodedatosqueseu6lizarecurrentementeenlosproblemasdecierta complejidad de programación. A con6nuación planteamos algunos ejemplos deproblemasqueseresuelvenconelusodepilas.
El juego,en su formamás tradicional, consisteentresvarillasver6cales.Enunadelasvarillasseapilaunnúmerondediscos.Losdiscosseapilansobreuna varilla en tamaño decreciente. No hay dosdiscos iguales, y todos ellos están apilados demayor a menor radio en una de las varillas,quedandolasotrasdosvarillasvacantes.
Las torres de Hanoi
1. Sólosepuedemoverundiscocadavez.2. Undiscodemayortamañonopuededescansarsobreunomáspequeñoqueélmismo.3. Sólopuedesdesplazareldiscoqueseencuentrearribaencadavarilla.
El juegoconsisteenpasar todos losdiscosde la varillaocupadaaunade lasotras varillasvacantes.Pararealizaresteobje6vo,esnecesarioseguirtressimplesreglas:
Tiposabstractosdedatoslineales.Pilas
Javier Vélez Reyes [email protected] 5 - 16
Problemasyejercicios
ProblemasLaspilassonun6poabstractodedatosqueseu6lizarecurrentementeenlosproblemasdecierta complejidad de programación. A con6nuación planteamos algunos ejemplos deproblemasqueseresuelvenconelusodepilas.
La finalidad del Solitario Carta blanca esmover todas las cartas desde la zona deltablero a las casillas de palo: los cuatrorecuadros situados en la parte superiorderechadeltablero.Paraganar,eljugador6ene que hacer cuatro montones decartasenlascasillas,unoporcadapalo,yamontonarlasenordenascendentedesdeelAShastaelREY.Puedesmoverlascartasde una columna a otra ordenando lascartasdemayoramenoryalternandolos
La carta blanca
coloresdelospalos,asícomou6lizarlascasillaslibresparaapartarcartasdelascolumnasyasíaccederalacartaquehaydebajo.Lapar6dafinalizacuandoeljugadorhamovidotodaslascartasalascasillasdepaloocuandoyanopuederealizarningúnmovimientomás.Sedicequetodaslaspar6dasdeCartablancapuedenganarse.
Tiposabstractosdedatoslineales.Pilas
Javier Vélez Reyes [email protected] 5 - 17
Problemasyejercicios
ProblemasLaspilassonun6poabstractodedatosqueseu6lizarecurrentementeenlosproblemasdecierta complejidad de programación. A con6nuación planteamos algunos ejemplos deproblemasqueseresuelvenconelusodepilas.
Aunque actualmente las calculadores permitenoperar con expresiones en notación infija,tradicionalmente ha sido frecuente encontrarmáquinas que requerían introducir lasexpresionesennotaciónposdija.Estofacilita laformadecalculoyevitaelusodeparen6zaciónparadesambiguar.Deestamanera,2+3*5seexpresa en notación posdija como 2 3 + 5 * ydebeinterpretarsecomoquealosoperandos…
Calculadora en notación postfija
Tiposabstractosdedatoslineales.Pilas
Javier Vélez Reyes [email protected] 5 - 18
Bibliograia
BibliograTaBibliografía básica
Estructuras de datos en java. Weiss, Mark
Allen. Pearson Addison – Wesley. ISBN
9788478290352
Tiposabstractosdedatoslineales.Pilas
Javier Vélez Reyes [email protected] 5 - 19
Bibliograia
BibliograTaBibliografía complementaria
Estructura de datos y algoritmos en java. A.
Drozdek. Thomsom. ISBN: 9706866116. 2007
Estructuras de datos con Java. J. Lewis, J.
Chase. Pearson – Addison Wesley. ISBN 13:
9788420541914
EstrategiasdeprogramaciónyestructurasdedatosGradoenIngenieríaInformá8ca
GradoenTecnologíasdelaInformaciónDepartamentodeLenguajesySistemasinformá6cos
JavierVé[email protected]
DepartamentodeLenguajesYSistemasInformáAcosUNED
7TiposabstractosdedatoslinealesColas
Tiposabstractosdedatoslineales.Colas
Javier Vélez Reyes [email protected] 6 - 2
Índice
Índice
› Introducción
› Tipos abstractos de datos lineales
› El tipo abstracto de datos Cola
› Interfaz del tipo abstracto de datos Cola
› Implementaciones del tipo abstracto de datos Cola
› Implementación dinámica
› Implementación estática
› Implementación con Lista
› Algoritmos sobre Colas
› Recorrido de los elementos de una Cola
› Búsqueda de un elemento sobre una Cola
› Problemas y ejercicios
› Bibliografía
Tiposabstractosdedatoslineales.Colas
Javier Vélez Reyes [email protected] 6 - 3
Obje6vosgenerales
Obje8vos
› Conocer la interfaz del tipo abstracto de datos Cola
› Aprender a implementar el TAD Cola mediante la interfaz QueueIF
› En versión estática (con limitación explícita de capacidad máxima)
› En versión dinámica (sin limitación explícita de capacidad máxima)
› Utilizando una lista
› Conocer los principales problemas algorítmicos sobre colas
› Recorrido de los elementos de una cola
› Búsqueda de un elemento sobre una cola
› Practicar el diseño de funciones recursivas sobre cola
Tiposabstractosdedatoslineales.Colas
Javier Vélez Reyes [email protected] 6 - 4
Introducción
TiposabstractosdedatoslinealesLos6posabstractosdedatos lineales representanabstraccionesen lasque losdatos sonorganizadosdeformasecuencial.Acon6nuaciónsemuestranlosdiferentesTADsquecaendentrodeestacategoríayquesediferencian,esencialmente,enlaformaenqueseofrecenaccesoasusdatos
Tipos abstractos de datos lineales
I. Listas
II. Pilas
III. Colas
El tipo abstracto de datos Lista representa una estructuras de datos donde los elementos se disponen de forma secuencial y las operaciones de inserción y extracción se aplican por el principio, que puede moverse recursivamente haciendo referencia a otras sublistas
El tipo abstracto de dato Pila representa una estructuras de datos donde los elementos se disponen de forma secuencial y las operaciones de inserción y extracción se aplican por el principio según la política de acceso último en entrar, primero en salir
El tipo abstracto de dato Cola representa una estructuras de datos donde los elementos se disponen de forma secuencial y las operaciones de inserción y extracción se aplican por el final y por el principio respectivamente de acuerdo a la política de primero en entrar, primero en salir
Tema 4 }
Tema 5
}
Tema 6
}
Tiposabstractosdedatoslineales.Colas
Javier Vélez Reyes [email protected] 6 - 5
Introducción
El8poabstractodedatosColaLascolassonabstraccionesdedatosqueorganizanunacoleccióndeelementosdemanerasecuencial,dondeexistendospuntosdeinterésllamadoscomienzoyfinal.Porelcomienzose realizan las operaciones de extracción mientras que por el final se realizan lasinserciones.Segúnesto,lapolí6cadeaccesoprescribequeelprimerelementoenentrarenunacolaeselprimeroensalirdeella(FirstInFirstOut,FIFO).
Unacolaesun6poabstractosdedatosqueorganizaunacoleccióndeelementos
deformasecuencial.Lasoperacionesdeextracciónserealizanporelprincipioy
lasdeinserciónporelfinaldeacuerdoalapolí6cadeaccesoFIFOqueprescribe
queelprimeroenentrareselprimeroensalir
PrimeroEl primero marca el
siguiente elemento a extraer. Tras una
extracción, primero avanza al siguiente en
la cola
1 2 3 4 5 6 7 8 9
Ul8moEl último marca el
último elemento que se ha insertado. Tras una
inserción, último apunta al elemento insertado
Tiposabstractosdedatoslineales.Colas
Javier Vélez Reyes [email protected] 6 - 6
Interfazdel6poabstractodedatosCola
Lainterfazdel8poabstractodedatosColaQueueIF<T>
publicinterfaceQueueIF<T>extendsCollectionIF<T>{/***Devuelvelacabezadelacola.*@returnlacabezadelacola.*/publicTgetFirst();/***Insertaunnuevoelementoalacola.*@paramelementElelementoaañadir.*@returnlacolaincluyendoelelemento.*/publicQueueIF<T>enqueue(Telement);/***Borralacabezadelacola.*lacolaexcluyendolacabeza.*/publicQueueIF<T>dequeue();
El interfaz de Cola que u6lizaremos a lo largo de estecurso,QueueIFestácompuestoporlasoperacionesquedescribimosacon6nuación
primeroDevuelve el elemento que se encuentra en la cabeza de la cola sin extraerlo de la misma. Esta es una operación consultora
InsertarLa operación add inserta un elemento detrás del último elemento de la cola de manera que este pasa a ser el nuevo último
borrarLa operación remove extrae el elemento que se encuentra en la cabeza de la cola dejando al siguiente a éste como nueva cabeza
1 2 31
1 2 3 4
1 2 3 4
Tiposabstractosdedatoslineales.Colas
Javier Vélez Reyes [email protected] 6 - 7
Implementacióndel6poabstractodedatosCola
Implementacióndel8poabstractodedatosColaQueueIF<T>Existen varias estrategias para implementar colas que responden al interfaz QueueIFanterior.Engeneral,éstassedividenen implementacionesdinámicas,quear6culancolasdecapacidadindefinidaeimplementacionesestá6cas,conunacapacidadmáximalimitadayestablecidacomoparámetro.Acon6nuaciónpresentamosvariasimplementaciones
Implementacióndinámicabasadaenprimeroyúl8moSegún esta estrategia de implementación, una cola está formada por una cadena denodosenlazadosconreferenciasalsiguienteydosreferenciasqueapuntanalprimeryúl6mo elemento de la cola. La desventaja de esta implementación es que hay quesepararlaabstraccióndelacadenadenodos
1 2 3 4 -
primeroLa referencia al primero se mantiene para saber que elemento extraer en cada paso
Datos Los elementos de la cola se representan mediante una estructura de nodos encadenados por referencias al siguiente
ul8moLa referencia al último se mantiene para saber detrás de quién se debe hacer la siguiente inserción
cola
Tiposabstractosdedatoslineales.Colas
Javier Vélez Reyes [email protected] 6 - 8
Implementacióndel6poabstractodedatosCola
Implementacióndel8poabstractodedatosColaQueueIF<T>Existen varias estrategias para implementar colas que responden al interfaz QueueIFanterior.Engeneral,éstassedividenen implementacionesdinámicas,quear6culancolasdecapacidadindefinidaeimplementacionesestá6cas,conunacapacidadmáximalimitadayestablecidacomoparámetro.Acon6nuaciónpresentamosvariasimplementaciones
Implementaciónestá8cabasadaenarraycircularSegún esta estrategia de implementación, una cola se almacena en un array decapacidad limitadaaccedidocircularmentemediantedos índicesenaritmé6camodularqueapuntanalprimeryul6moelemento
2 30 13 72 34 5
primeroEl índice primero apunta siempre al elemento en cabeza de la cola. Cuando éste llega al índice máximo del array continua modularmente por 0
Insertar
Las inserciones se realizan en la posición último y avanzan el índice último una posición en aritmética modular
Capacidad = 10
úl8moEl índice último apunta siempre al primer hueco libre tras el último elemento de la cola. . Cuando éste llega al índice máximo del array continua modularmente por 0
extraer
Las extracciones avanzan el índice primero una posición en aritmética modular
Tiposabstractosdedatoslineales.Colas
Javier Vélez Reyes [email protected] 6 - 9
Implementacióndel6poabstractodedatosCola
Implementacióndel8poabstractodedatosColaQueueIF<T>Existen varias estrategias para implementar colas que responden al interfaz QueueIFanterior.Engeneral,éstassedividenen implementacionesdinámicas,quear6culancolasdecapacidadindefinidaeimplementacionesestá6cas,conunacapacidadmáximalimitadayestablecidacomoparámetro.Acon6nuaciónpresentamosvariasimplementaciones
ImplementaciónbasadaenlistaDadoquelaimplementacióndinámicadecolasquehemosvistoesbastantesimilaralade listas, es posible implementaruna cola apar6rdeuna lista. El carácter está6coodinámicodelaimplementacióndependerádel6podeimplementacióndelistau6lizada
1 2 3 4 5 6 7 8 9
primeroLa referencia al primero se mantiene para saber que elemento extraer encada paso
ul8moLa referencia al último se mantiene para garantizar una inserción en coste constante
ListIF
cola
Tiposabstractosdedatoslineales.Colas
Javier Vélez Reyes [email protected] 6 - 10
Algoritmossobrecolas
AlgoritmossobrecolasAdiferenciadeloqueocurríaenelcasodelaslistasdondeestudiamosquelaordenacióneraunodelosproblemasrecurrentes,enelcasodelascolasseconsidera quetal6podemanipulacionesnosondeinterésyaqueiríanencontradelaesenciaorganiza6vadel6po–manteneraloselementosdispuestosenelordendellegadadeacuerdoaunapolí6caFIFO.Por ello, en esta sección nos centraremos en discu6r el problema del recorrido de loselementosdeunacolaylabúsquedadeunelementodentrodeunacola.
Algoritmos sobre colas
I. Recorrido El recorrido de los elementos de una cola devuelve un iterador que permite acceder secuencialmente a los mismos según aparecen almacenados en la estructura, desde el primero hasta el último de la cola. El recorrido en sentido contrario es fácilmente implementable y se deja como ejercicio
II. Búsqueda La búsqueda de un elemento sobre los elementos de una cola se realiza de forma secuencial dada la definición del tipo lo que imprime un coste lineal al algoritmo. El problema fundamental en este tipo de algoritmos es que dicha búsqueda es destructiva y requiere o utilizar un iterador (con copia) o reconstruir la estructura tras el algoritmo
Independencia de la im
plementación
Tiposabstractosdedatoslineales.Colas
Javier Vélez Reyes [email protected] 6 - 11
Algoritmossobrecolas
RecorridodeloselementosdeunacolaParaar6cularelrecorridosecuencialdeloselementosdeunacoladebeimplementarseelinterfazIteratorIF.LasimplementacionesdeQueueIFanterioresconstruyenunacopiadelacolacomomanejadorparagaran6zarquelaiteraciónnomodifiqueelestadodel6po
classQueueIterator<T>implementsIteratorIF<T>{privateQueueIF<T>handler;privateQueueIF<T>restart;/***ConstructorparaQueueIterator.*@paramhandlerelmanejadordecolas.*/publicQueueIterator(QueueIF<T>handler){this.handler=handler;this.restart=newQueueDynamic<T>(handler);}/***Devuelveelsiguienteelementodelaiteracion.*@returnelsiguienteelementodelaiteracion.*/@OverridepublicTgetNext(){Telement=handler.getFirst();handler.remove();returnelement;}
Se mantienen 2 manejadores constantemente, uno para articular el recorrido de la cola. El otro siempre apunta a la cabeza de la cola y se utiliza para implementar la operación de reset del iterador
Iteraciónconreset
La operación de avance devuelve el elemento en cabeza de la cola y actualiza el manejador de recorrido extrayendo la cima. Para invocar esta operación con seguridad hay que asegurarse de que el manejador no apunta a la cola vacía…
Avance
3 41 2
handler getNext()
restart
Tiposabstractosdedatoslineales.Colas
Javier Vélez Reyes [email protected] 6 - 12
Algoritmossobrecolas
RecorridodeloselementosdeunacolaParaar6cularelrecorridosecuencialdeloselementosdeunacoladebeimplementarseelinterfazIteratorIF.LasimplementacionesdeQueueIFanterioresconstruyenunacopiadelacolacomomanejadorparagaran6zarquelaiteraciónnomodifiqueelestadodel6po
/***Devuelveciertosiexistenmaselementosaiterar.*@returnciertosiexistenmaselementosaiterar.*/@OverridepublicbooleanhasNext(){return!handler.isEmpty();}/***Restableceeliteradorparavolveriterar.*/@Overridepublicvoidreset(){handler=newQueueDynamic<T>(restart);}}
Para saber si el iterador contiene más elementos y por tanto puede volver a invocarse la operación de avance o no, hay que preguntar si el manejador ha alcanzado el final de la cola
Haysiguiente
Una vez que un iterador ha llegado a su fin sólo se puede construir otro iterador, o resetear éste a su valor inicial. En este caso sin embargo, la operación de reset requiere una copia con lo que el coste es idéntico al de construir un nuevo iterador.
Reset
3 41 2
handlerreset()
restart
handler
Tiposabstractosdedatoslineales.Colas
Javier Vélez Reyes [email protected] 6 - 13
Algoritmossobrecolas
BúsquedadeunelementosobreunacolaLabúsquedadeundato sobre los elementos contenidosenuna colaesunproblemaderecorridosecuencialqueterminacuandoseencuentraunacabezaquecorrespondeconeldatobuscado.Dadoqueel6pono6eneunadefiniciónrecursiva,elproblemadebúsquedano se presta a este 6po de resolución algorítmica. A con6nuación presentamos dosversionesdelabúsquedaitera6vaconcen6nelaqueaprovechanlaestructurainternadelaimplementacióndel6po
BúsquedaenQueueDynamic
@Overridepublicbooleancontains(Telement){booleanfound=false;Node<T>node=first;while(!found&&node!=null){found=node.getElement().equals(element);node=node.getNext();}returnfound;}
Es esta implementación se realiza unabúsqueda con cen6nela sobre la estructuradenodosenlazadosqueimplementarel6pocola
BúsquedaenQueueSta8c
@Overridepublicbooleancontains(Telement){booleanfound=false;intindex=first;while(!found&&Math.abs(last-index)>0){found=elements[index].equals(element);index=next(index);}returnfound;}
En la implementaciónestá6ca losdatossonalmacenados sobreunaestructura vectorialquedebeser recorridacircularmentedesdeel primero hasta el úl6mo elemento, si elcen6nelanoloimpide
Tiposabstractosdedatoslineales.Colas
Javier Vélez Reyes [email protected] 6 - 14
Problemasyejercicios
EjerciciosDadoelcarácterdestruc6vodelasoperacionessobrecolas–paraavanzarenunacolaesnecesario extraer su cabeza con invocando a remove – la realización demuchos de susalgoritmos requiere de un proceso de protección consistente en hacer una copia de lamisma.Ignorandoelproblemadedestrucciónresuelvalossiguientesproblemas
Diseñe una función que calcule elnúmero de elementos que con6eneunacola
I. Longitud de una cola Devolveruna lista con loselementosde una cola según aparecen en éstadesdeelprimeroalúl6mo
II. Pasar a lista Diseñeunafunciónquedadaunacoladeterminesiessubcoladeotradadademayortamaño
III. Subcola
Función que extrae los númerosparesdeunacoladeenteros.Repitael ejercicio para extraer los deposiciónparenlacola
IV. Extraer pares Diseñe una función que inserte enunacoladeenterosloselementosdeformaordenadacrecientemente
V. Insertar en orden Diseñe una función recursiva quedevuelve la cola resultante deconcatenardoscolas
VI. Concatenar dos colas
Diseñe una función recursiva quedevuelvaunacolacon loselementoscolocadosdeformainversaaotra
VII. Cola inversa Diseñeunafunciónquedevuelvaunacolaqueeliminelaprimeraaparicióndeunelemento
VIII. Borrado de un elemento Diseñeunafunciónquedevuelvaunacoladondesehayaneliminadotodaslasaparicionesdeunelemento
IX. Borrar todos
Diseñeunafunciónquedevuelvaunacolaconloselementosqueprecedenaunelementodado
X. Cola prefijo Diseñe una función que devuelva lacolasufijoquesucedeaunelementodado
XI. Cola sufijo Diseñe una función recursiva quedevuelva una cola con todos loselementosmayoresaunodado
XII. Cola mayores
Tiposabstractosdedatoslineales.Colas
Javier Vélez Reyes [email protected] 6 - 15
Problemasyejercicios
ProblemasLascolassonun6poabstractodedatosqueseu6lizarecurrentementeenlosproblemasdecierta complejidad de programación. A con6nuación planteamos algunos ejemplos deproblemasqueseresuelvenconelusodecolas.
Diferentes procesos de un sistema opera6vocompitenenejecuciónporadquirirelusode unaimpresora que esta a su vez conectada a variosequipos dispuestos en una red de área local. Lacola de impresión es una abstracción donde seencolan losprocesosa laesperade ser atendidosporelservidordeimpresión
Competición de procesos por un recurso
Competición de procesos por un recurso
En escenarios concurrentes los procesosproductores deben comunicarse con losconsumidores de información. Dado que el ritmode trabajo de unos y otros no es el mismo seu6lizan colas de almacenamiento de mensajescomomecanismodeamor6guación
Tiposabstractosdedatoslineales.Colas
Javier Vélez Reyes [email protected] 6 - 16
Problemasyejercicios
ProblemasLascolassonun6poabstractodedatosqueseu6lizarecurrentementeenlosproblemasdecierta complejidad de programación. A con6nuación planteamos algunos ejemplos deproblemasqueseresuelvenconelusodecolas.
En las redes de computadoras los disposi6vos deinterconexión u6lizan colas para almacenar lainformación entrante y entregarla a susdes6natarios al ritmo que ellos requieran.Asimismo se u6liza esta técnica para realizanpropagaciónenbroadcastomul6cast
Enrutamiento de paquetes IP
Computación distribuida
Encomputacióndistribuidaseu6lizansistemasdemensajería encargados de mover la información.Encomunicaciónpuntoapuntolascolasseu6lizanparapersis6r losmensajesygaran6zar laentrega.En comunicación de eventos varios procesos seregistran como escuchadores de una cola dondeotros se publican eventos de un determinadotópico
Tiposabstractosdedatoslineales.Colas
Javier Vélez Reyes [email protected] 6 - 17
Bibliograba
BibliograTaBibliografía básica
Estructuras de datos en java. Weiss, Mark
Allen. Pearson Addison – Wesley. ISBN
9788478290352
Tiposabstractosdedatoslineales.Colas
Javier Vélez Reyes [email protected] 6 - 18
Bibliograba
BibliograTaBibliografía complementaria
Estructura de datos y algoritmos en java. A.
Drozdek. Thomsom. ISBN: 9706866116. 2007
Estructuras de datos con Java. J. Lewis, J.
Chase. Pearson – Addison Wesley. ISBN 13:
9788420541914
JavierVé[email protected]áAcosUNED
Estrategiasd
eprogramaciónyestructurasd
eda
tos
Grado
enIngenieríaIn
form
á8ca.Grado
entecnologíasd
elainform
ación
Departam
entodeLenguajesy
Sistem
asinform
á6cos
ParteIIITiposabstractosdedatosjerárquicos
EstrategiasdeprogramaciónyestructurasdedatosGradoenIngenieríaInformá8ca
GradoenTecnologíasdelaInformaciónDepartamentodeLenguajesySistemasinformá6cos
JavierVé[email protected]
DepartamentodeLenguajesYSistemasInformáAcosUNED
8TiposabstractosdedatosjerárquicosÁrbolesgenerales
Tiposabstractosdedatosjerárquicos.Árbolesgenerales
Javier Vélez Reyes [email protected] 7 - 2
Índice
Índice
› Introducción
› Tipos abstractos de datos jerárquicos
› El tipo abstracto de datos Árbol general
› Interfaz del tipo abstracto de datos Árbol general
› Implementaciones del tipo abstracto de datos Árbol general
› Implementación dinámica
› Implementación estática con array de posiciones variables
› Algoritmos sobre Árboles generales
› Recorrido de los elementos de un Árbol general
› Búsqueda de un elemento sobre una Árboles general
› Problemas y ejercicios
› Bibliografía
Tiposabstractosdedatosjerárquicos.Árbolesgenerales
Javier Vélez Reyes [email protected] 7 - 3
Obje6vosgenerales
Obje8vos
› Conocer la interfaz del tipo abstracto de datos Árbol general
› Aprender a implementar el TAD Árbol general mediante la interfaz TreeIF
› En versión estática (con limitación explícita de capacidad máxima)
› En versión dinámica (sin limitación explícita de capacidad máxima)
› Conocer los principales problemas algorítmicos sobre árboles generales
› Recorrido de los elementos de un árboles generales
› Búsqueda de un elemento sobre un árboles generales
› Practicar el diseño de funciones recursivas sobre árboles generales
Tiposabstractosdedatosjerárquicos.Árbolesgenerales
Javier Vélez Reyes [email protected] 7 - 4
Introducción
TiposabstractosdedatosjerárquicosLos6posabstractosdedatosjerárquicosrepresentanabstraccionesenlasquelosdatossedistribuyenatravésderelacionesdeparento-filialidaddondecadaelemento6eneunpadrey varios hijos. En función del número máximo de hijos que puede tener un elementodis6nguiremosentreárbolesbinarios (con2hijos comomáximo)yárbolesgenerales (sinlimitación en el número de hijos). Aunque los segundos pueden considerarse unageneralización de los primeros, ambos presentan implementaciones y escenarios de usodiferentesloquejus6ficasuconsideracióncomo6posdis6ntos
Tipos abstractos de datos lineales
I. Árboles generales
II. Árboles binarios Un árbol binario es un tipo especial de árbol donde cada elemento del mismo puede referenciar a lo sumo a 2 hijos. Este tipo de estructuras se utilizan frecuentemente para representar en computación no sólo conjuntos de datos con una relación de dependencia padre-hijo sino también para articular esquemas de búsqueda eficientes
Los árboles generales pueden considerarse a todos los efectos una generalización de los árboles binarios donde el número de hijos está limitado por una constante k > 2 (o no existe limitación en el número de hijos). Aunque, en principio, es posible expresar todo árbol general como un árbol binario, existen situaciones en computación donde este tipo de abstracciones tiene usos interesantes
Tema 7
}
Tema 8
}
Tiposabstractosdedatosjerárquicos.Árbolesgenerales
Javier Vélez Reyes [email protected] 7 - 5
Introducción
El8poabstractodedatosÁrbolgeneralUnárbolgeneralesunaestructuraqueorganizaunacoleccióndeelementosatravésdeunarelacióndeparento-filialidaddondecadaelementodisponealosumodeunpadreydeunnúmerodehijosnoprefijado.Siunelementono6enepadresellamanodoraíz.Enunárbolgeneralhaysiempreunysólo un elemento raíz. Si un elemento no 6ene hijos se llama elemento hoja. La definicióncomputabledel6poseestablecerecursivamentedelasiguientemanera
Un árbol general es un 6po abstracto de datos que da acceso directo a un
elementollamadoraízy,aunnúmeroindeterminadodesubárbolesquedependen
jerárquicamentedeélcomohijos
Subárboles Los árboles generales pueden tener cualquier número de hijos
0
1 7
2
4
8 9
3
5 6 Elemento hoja Cuando un elemento no tiene hijos se llama hoja
Raíz La raíz es el elemento del que cuelga el resto de nodos
Niveles El número de niveles de un árbol indica la
separación máxima que hay entre la raíz y la
hoja más alejada de ésta
medida en número de
arcos
Tiposabstractosdedatosjerárquicos.Árbolesgenerales
Javier Vélez Reyes [email protected] 7 - 6
Interfazdel6poabstractodedatosÁrbolgeneral
Lainterfazdel8poabstractodedatosÁrbolgeneralTreeIF<T>
publicinterfaceTreeIF<T>{publicintPREORDER=0;publicintPOSTORDER=1;publicintLRBREADTH=2;publicintRLBREADTH=3;/***Devuelveelelementoraizdelarbol.*@returnelelementoraizdelarbol.*/publicTgetRoot();/***Estableceelelementoraiz.*@paramelementElelementoaestablecer.*/publicvoidsetRoot(Telement);/***Devuelveelprimerloshijosdeunarbol.*@returnloshijosdeunarbol.*/publicListIF<TreeIF<T>>getChildren();/***Devuelveelhijoenposiciónpos.*@paramposLaposiciónconbaseen1.*/publicvoidgetChild(intpos);
El interfazdeÁrbolgeneralqueu6lizaremosa lo largode este curso, TreeIF está compuesto por lasoperacionesquedescribimosacon6nuación
RecorridosEstas constantes sirven para identificar en el método getIterator distintas estrategias de recorrido de los elementos del árbol
ObtenerraízDevuelve la raíz del árbol. Este método devuelve un elemento de tipo T distinto de nulo
EstablecerraízEsta operación establece el valor asignado a la raíz de un del árbol. Si el valor es null la operación no tiene efecto
ObtenerhijosEsta operación consultora devuelve la lista de todos los subárboles que son hijos del nodo en curso
1
2 4
1
3
0
2 4
0
3
1
2 43
2 43
ObtenerhijoEsta operación consultora devuelve el subárbol que corresponde con el hijo ubicado en la posición pos
1
2 43
4
Tiposabstractosdedatosjerárquicos.Árbolesgenerales
Javier Vélez Reyes [email protected] 7 - 7
Interfazdel6poabstractodedatosÁrbolgeneral
Lainterfazdel8poabstractodedatosÁrbolgeneralTreeIF<T>
/***Devuelveelelementoraizdelarbol.*@returnelelementoraizdelarbol.*/publicTaddChild(TreeIF<T>child);/***Extraeunsubarbolcomohijo.*@paramindexelindicedelsubarbolconbaseen0.*/publicvoidremoveChild(intindex);/***Devuelceciertosielarbolesunnodohoja.*@returnciertosielarbolesunnodohoja.*/publicbooleanisLeaf();/***Devuelveuniteradorparalalista.*@paramtraversalTypeEltipoderecorrido.*@returnuniteradorparalalista.*/publicIteratorIF<T>getIterator(inttraversalType);
El interfazdeÁrbolgeneralqueu6lizaremosa lo largode este curso, TreeIF está compuesto por lasoperacionesquedescribimosacon6nuación
Añadir nuevo hijo A través de esta operación se puede añadir un nuevo subárbol como hijo más a la derecha en la colección de hijos
1
2 43
4
EliminarhijoA través de esta operación se borra el hijo en la posición indicada por index en la colección
EshojaEsta operación consultora indica si el nodo en curso es un nodo hoja o no lo es
RecorridoEsta operación devuelve un iterador que permite acceder a todos los elementos del árbol
1
2 43
2
1
2 4
false
3true
1
2 4
1,2,3,4
3
Tiposabstractosdedatosjerárquicos.Árbolesgenerales
Javier Vélez Reyes [email protected] 7 - 8
Implementacióndel6poabstractodedatosÁrbolgeneral
Implementacióndel8poabstractodedatosÁrbolgeneralTreeIF<T>Existen varias estrategias de implementación de árboles generales que responden alinterfazTreeIF.Éstassedividenenimplementacionesdinámicas,concapacidadindefinidapara almacenar elementos e implementaciones está6cas, con una capacidad máximalimitadaestablecidaporparámetro.Acon6nuaciónpresentamosvariasimplementaciones
ImplementacióndinámicabasadaencoladehijosSegúnestaestrategiadeimplementación,unárbolesunobjetoquerepresentaelnodoraízdelmismo.Cadanodo6eneunatributoparaalmacenarelvalordelelementoyunacoladeárbolesquecon6enenreferenciasaloshijos
Ul8mo,elementofantasmaAunque en otras implementaciones el valor del último objeto se aprovecha para incluir un último elemento aquí el final se marca con un objeto fantasma con ambos atributos a null. Esto evita excepciones de puntero a null y simplifica la algoritmia con la pila a un único caso base isEmpty ()
ElementoAlmacena el valor
del dato en el nodo
1
2 5e
HijosLista de referencias a subárboles hijo
-
3 - 3 -
8
7 - 9 -
Tiposabstractosdedatosjerárquicos.Árbolesgenerales
Javier Vélez Reyes [email protected] 7 - 9
Implementacióndel6poabstractodedatosÁrbolgeneral
Implementacióndel8poabstractodedatosÁrbolgeneralTreeIF<T>
Implementaciónestá8camediantearraydeposicioneshijasvariablesEn esta implementación un árbol se representa como un array de nodos. El valor delnodoraízseencuentraenlaposición0.Cadanodo6eneelvalordelelementoqueportay la listade índicesque indican lasposicionesdentrodelarraydondeestán losnodoshijos
Ul8mo,elementofantasmaAunque en otras implementaciones el valor del último objeto se aprovecha para incluir un último elemento aquí el final se marca con un objeto fantasma con ambos atributos a null. Esto evita excepciones de puntero a null y simplifica la algoritmia con la pila a un único caso base isEmpty ()
CapacidadmáximaylongitudLa capacidad se expresa en número de nodos 0
1 7
2
4
8 9
3
5 6
8 96 74 52 30 1
Existenvariasestrategiasde implementaciónárbolesgeneralesque respondenal interfazTreeIFanterior.Éstassedividenenimplementacionesdinámicas,concapacidadindefinidapara almacenar elementos e implementaciones está6cas, con una capacidad máximalimitadaestablecidaporparámetro.Acon6nuaciónpresentamosvariasimplementaciones
0
356
1
9
4
47
7
21
8 9 25 6 3
8
Tiposabstractosdedatosjerárquicos.Árbolesgenerales
Javier Vélez Reyes [email protected] 7 - 10
Algoritmossobreárbolesgenerales
AlgoritmossobreárbolesgeneralesComovienesiendofrecuentealolargodeestecurso,lostres6posdealgoritmoscanónicosaplicablesacualquierestructuradedatos sonrecorrido,búsquedayordenación.Enestecaso,laordenacióndebeentendersecomounareorganizacióndelosnodosdelárbolparafavoreceralgúncriterio (^picamente labúsqueda). Sinembargo,noestudiaremosningúnalgoritmodeordenaciónynoscentraremossóloenrecorridosybúsquedas
Algoritmos sobre árboles
generales
I. Recorrido El recorrido de los elementos de un árbol general devuelve un iterador que permite acceder secuencialmente a los mismos según aparecen almacenados en la estructura. Sin embargo, existen distintos criterios de secuenciamiento que pueden aplicarse para construir un recorrido. Aquí estudiaremos los más típicamente aplicados
II. Búsqueda La búsqueda de un elemento sobre los nodos de un árbol general se realiza de forma recursiva dada la definición del tipo lo que imprime un coste lineal al algoritmo en el peor caso. La ventaja de este tipo de algoritmos, con respecto a sus equivalentes en otras estructuras de datos es que el proceso no es destructivo con lo que no se requiere utilizar un iterador (con copia) ni reconstruir la estructura tras la aplicación del algoritmo
Independencia de la im
plementación
Tiposabstractosdedatosjerárquicos.Árbolesgenerales
Javier Vélez Reyes [email protected] 7 - 11
Algoritmossobreárbolesgenerales
RecorridodeloselementosdeunárbolgeneralLos recorridos que pueden aplicarse sobre las estructuras arborescentes son varios enfunciónde la estrategiade secuenciamientoque se aplique sobre los elementosdel6poabstracto de datos. En concreto es posible dis6nguir 4 estrategias organizados de lasiguientemanera
Rec
orrid
os
sobr
e ár
bole
s
I. Recorridos en profundidad Se recorre el árbol recursivamente en profundidad. En función de donde se aloje, relativamente cada nodo con respecto a sus hijos se distinguen 2 recorridos
II. Recorridos en anchura
Preorden
Postorden
Cada nodo se inserta antes de l a c o l e c c i ó n d e n o d o s c o r r e s p o n d i e n t e a s u s descendentes
Cada nodo se inserta detrás de l a c o l e c c i ó n d e n o d o s c o r r e s p o n d i e n t e a s u s descendentes
SACO
CAOS
Se recorre el árbol en anchura colocando pr imero todos los elementos del nivel k antes de pasar a colocar los del nivel k + 1. En función del orden en que se disponen los elementos por niveles se distinguen dos recorridos en anchura
Anchura
Anchura inversa
Se disponen los elementos del árbol por niveles de izquierda a derecha y desde la raíz a las hojas
Se disponen los elementos de forma inversa a como establece un recorrido en anchura
OCAS
SACO
Tiposabstractosdedatosjerárquicos.Árbolesgenerales
Javier Vélez Reyes [email protected] 7 - 12
Algoritmossobreárbolesgenerales
RecorridodeloselementosdeunaárbolgeneralPara implementar el iterador de los árboles generales u6lizaremos una cola donde sealmacenaránenlaconstrucciónloselementosdispuestosadecuadamentesegúnel6poderecorridoseleccionado.Laiteraciónentoncessedelegaráeneliteradordeesacola
publicclassTreeIterator<T>implementsIteratorIF<T>{privateIteratorIF<T>iterator;/***ConstructorparaTreeIterator.*@paramhandlerelmanejadordearboles.*@paramtypeeltipoderecorrido.*/publicTreeIterator(TreeIF<T>handler,inttype){QueueIF<T>traverse=null;switch(type){caseTreeIF.PREORDER:traverse=preorder(handler);break;caseTreeIF.POSTORDER:traverse=postorder(handler);break;caseTreeIF.LRBREADTH:traverse=lrBreadth(handler);break;caseTreeIF.RLBREADTH:traverse=rlBreadth(handler);break;}this.iterator=newQueueIterator<T>(traverse);}/***Devuelveelsiguienteelementodelaiteracion.*@returnelsiguienteelementodelaiteracion.*/@OverridepublicTgetNext(){returniterator.getNext();}
La iteración de los elementos del árbol se delega en el iterador de cola que es construido en el constructor. La función de reset está garantizada
Iteraciónconreset
La función de avance delega en el iterador de cola que se ha construido previamente. Esta aproximación simplifica las operaciones pero penaliza el tiempo de la construcción del iterador
Avance
ConstrucciónEn función del valor del parámetro del tipo de recorrido, el constructor invoca a una u otra función privada que devuelve una cola con los elementos dispuestos en el orden apropiado. Después se construye un iterador sobre la cola resultante
Tiposabstractosdedatosjerárquicos.Árbolesgenerales
Javier Vélez Reyes [email protected] 7 - 13
Algoritmossobreárbolesgenerales
/***Devuelveciertosiexistenmaselementoseneliterador.*@returnciertosiexistenmaselementoseneliterador.*/@OverridepublicbooleanhasNext(){returniterator.hasNext();}/***Restableceeliteradorparavolverarecorrerlaestructura.*/@Overridepublicvoidreset(){iterator.reset();}privateQueueIF<T>preorder(TreeIF<T>tree){QueueIF<T>traverse=newQueueDynamic<T>();Telement=tree.getRoot();traverse.add(element);IteratorIF<TreeIF<T>>childrenIt=tree.getChildren().getIterator();while(childrenIt.hasNext()){TreeIF<T>aChild=childrenIt.getNext();QueueIF<T>aTraverse=preorder(aChild);addAll(traverse,aTraverse);}returntraverse;}
La función de siguiente se delega sobre el iterador de cola. Habrá siguientes elementos que visitar si el iterador de cola aún no ha finalizado
Siguiente
El recorrido en preorden inserta primero en la cola cada nodo y luego construye recursivamente las colas de los subárboles hijos. Mediante el método addAll dichas colas se añaden, en ese orden a la cola principal.
Preorden
ResetLa función de restablecimiento del iterador se delega igualmente sobre el método homónimo del iterador de colas
RecorridodeloselementosdeunaárbolgeneralPara implementar el iterador de los árboles generales u6lizaremos una cola donde sealmacenaránenlaconstrucciónloselementosdispuestosadecuadamentesegúnel6poderecorridoseleccionado.Laiteraciónentoncessedelegaráeneliteradordeesacola
Tiposabstractosdedatosjerárquicos.Árbolesgenerales
Javier Vélez Reyes [email protected] 7 - 14
Algoritmossobreárbolesgenerales
privateQueueIF<T>postorder(TreeIF<T>tree){QueueIF<T>traverse=newQueueDynamic<T>();Telement=tree.getRoot();IteratorIF<TreeIF<T>>childrenIt=tree.getChildren().getIterator();while(childrenIt.hasNext()){TreeIF<T>aChild=childrenIt.getNext();QueueIF<T>aTraverse=postorder(aChild);addAll(traverse,aTraverse);}traverse.add(element);returntraverse;}privateQueueIF<T>lrBreadth(TreeIF<T>tree){QueueIF<T>traverse=newQueueDynamic<T>();QueueIF<TreeIF<T>>aux=newQueueDynamic<TreeIF<T>>();aux.add(tree);while(!aux.isEmpty()){TreeIF<T>aTree=aux.getFirst();Telement=aTree.getRoot();IteratorIF<TreeIF<T>>childrenIt=aTree.getChildren().getIterator();while(childrenIt.hasNext()){TreeIF<T>aChild=childrenIt.getNext();aux.add(aChild);}traverse.add(element);aux.remove();}returntraverse;}
El recorrido en postorden inserta primero los elementos de los subárboles hijos y después anexa el nodo en curso.
Postorden
El recorrido en anchura utiliza dos colas para su construcción. En una se van insertando los elementos resultantes del recorrido. La otra es una cola auxiliar que sirve para almacenar los subárboles pendientes de ser procesados en cada paso
Anchura
RecorridodeloselementosdeunaárbolgeneralPara implementar el iterador de los árboles generales u6lizaremos una cola donde sealmacenaránenlaconstrucciónloselementosdispuestosadecuadamentesegúnel6poderecorridoseleccionado.Laiteraciónentoncessedelegaráeneliteradordeesacola
Tiposabstractosdedatosjerárquicos.Árbolesgenerales
Javier Vélez Reyes [email protected] 7 - 15
Algoritmossobreárbolesgenerales
privateQueueIF<T>rlBreadth(TreeIF<T>tree){QueueIF<T>traverse=lrBreadth(tree);StackIF<T>aux=newStackDynamic<T>();while(!traverse.isEmpty()){Telement=traverse.getFirst();aux.push(element);traverse.remove();}while(!aux.isEmpty()){Telement=aux.getTop();traverse.add(element);aux.pop();}returntraverse;}privatevoidaddAll(QueueIF<T>q,QueueIF<T>p){while(!p.isEmpty()){Telement=p.getFirst();q.add(element);p.remove();}}}
La anchura inversa es el recorrido inverso al anterior por tanto la implementación más sencilla consiste en generar un recorrido en anchura e invertirlo posteriormente. Para ello se utiliza una pila. Primero se mueven los elementos de la cola resultante a una pila. Después se extraen de la cola para insertarlos en una pilla. Finalmente se extraen de la pila para insertarlos nuevamente en la cola
Anchurainversa
La función addAll inserta en una cola todos los elementos de una segunda cola
Encolartodos
RecorridodeloselementosdeunaárbolgeneralPara implementar el iterador de los árboles generales u6lizaremos una cola donde sealmacenaránenlaconstrucciónloselementosdispuestosadecuadamentesegúnel6poderecorridoseleccionado.Laiteraciónentoncessedelegaráeneliteradordeesacola
Tiposabstractosdedatosjerárquicos.Árbolesgenerales
Javier Vélez Reyes [email protected] 7 - 16
Algoritmossobreárbolesgenerales
BúsquedadeunelementosobreunárbolgeneralLa búsqueda de un dato sobre los elementos contenidos en un árbol general es unproblemaderecorridoqueterminacuandoseencuentraelelementobuscadodentrodelaestructuradedatos.Dadoquesetratadeun6pocondefiniciónrecursivaelalgoritmoseráesencialmenteiterarsobrecadahijoparaaplicarsobreélrecursivamenteelalgoritmo
Búsquedarecursivaiterada
publicbooleancontains(Telement){if(this.element.equals(element))returntrue;else{IteratorIF<TreeIF<T>>childrenIt=children.getIterator();booleanfound=false;while(!found&&childrenIt.hasNext()){TreeIF<T>aChild=childrenIt.getNext();found=aChild.contains(element);}returnfound;}}
Comopuedeapreciarseestealgoritmoesagnós6code laestructurade implementaciónsubyacente ya que se apoya en operaciones definidas en el interfaz de árbol generalTreeIF.Enprimerlugar,secompruebasielnodoraizcoincideconelelementobuscado.Siesasí,hemosterminado.Sino,debemositerarsobrecadaunodeloshijosrealizandounabúsquedaconcen6nelaenlacoleccióndehijosperorecursivaencadahijo
Tiposabstractosdedatosjerárquicos.Árbolesgenerales
Javier Vélez Reyes [email protected] 7 - 17
Problemasyejercicios
EjerciciosPueden encontrarsemul6tud de situaciones donde es necesariomanipular la estructurainterna de los elementos de un árbol general. A con6nuación presentamos algunosejerciciosquevienenaejemplificartalessituaciones
Diseñe una función devuelva elnúmero de elementos que con6eneunárbolgeneral
I. Contar elementos Diseñe una función que devuelve lasuma de todos los elementos de unárbolgeneraldeenteros
II. Sumar elementos Diseñe una función recursiva quedevuelva una lista con todos loselementos pares de un árbol deenteros
III. Encontrar pares
Diseñe una función recursiva quedado un árbol de enteros devuelvaotro árbol solamente con loselementospares
IV. Eliminar impares Diseñeunafuncióndadounárboldeenteros mul6plique el valor en cadanodoporsualtura
V. Alturas Diseñe una función recursiva quedetermine si dos árboles generalessonestructuralmenteidén6cos
VI. Comparación de árboles
Diseñe una función recursiva queindique si dos árboles son la imagenespecularelunodelotro
VII. Imagen especular Diseñe una función que dado unárbol generaldeenterossus6tuyaelvalor en cada nodo por el valoracumulado de todos los nodosanteriores a el en un recorrido enprofundidad
VIII. Sumar anteriores
Tiposabstractosdedatosjerárquicos.Árbolesgenerales
Javier Vélez Reyes [email protected] 7 - 18
Problemasyejercicios
ProblemasLosárbolesgeneralessonun6poabstractodedatosqueseu6lizarecurrentementeenlosproblemas de cierta complejidad de programación. A con6nuación planteamos algunosejemplosdeproblemasqueseresuelvenconelusodeeste6poabstractodedatos.
Una cola de prioridad es un 6po especial de coladonde las inserciones se realizan por orden deacuerdo a un criterio compara6vo entre loselementos de la cola. La implementación máseficienteserealizaconárbolesgeneralesdondeenelnivelkestánloselementosdeprioridadk
Colas de prioridad
Árboles de decisión
En inteligencia ar6ficial y minería de datos seu6lizan árboles de decisión para representarproblemas de decisión. Cada nodo representa uncriteriodedecisiónylasramasdeéstelasposiblesalterna6vas
0
1 1
2
1
2 22 2
Tiposabstractosdedatosjerárquicos.Árbolesgenerales
Javier Vélez Reyes [email protected] 7 - 19
Problemasyejercicios
Problemas
Los datos almacenados en una base de datossuelen mantenerse ges6onados medianteestructurasarbóreascomplejas deunnivelfijodeprofundidad (nivel raiz, nivel de página, nivel dehojaynivelderegistro,etc.)
Bases de datos
Juegos
La inteligencia ar6ficial de muchos juegos deestrategia, como el ajedrez o las tres en ralla,u6liza árboles para representar el espacio debúsquedadelasalterna6vasdemovimientodentrodel juegovalorandoconunafuncióndeu6lidadelbeneficio, posi6vo o nega6vo, de realizarlo. Unafunciónumbralpermitetomarladecisión
Lasárbolesgeneralessonun6poabstractodedatosqueseu6lizarecurrentementeenlosproblemas de cierta complejidad de programación. A con6nuación planteamos algunosejemplosdeproblemasqueseresuelvenconelusodeeste6poabstractodedatos.
Tiposabstractosdedatosjerárquicos.Árbolesgenerales
Javier Vélez Reyes [email protected] 7 - 20
Bibliograca
BibliograTaBibliografía básica
Estructuras de datos en java. Weiss, Mark
Allen. Pearson Addison – Wesley. ISBN
9788478290352
Tiposabstractosdedatosjerárquicos.Árbolesgenerales
Javier Vélez Reyes [email protected] 7 - 21
Bibliograca
BibliograTaBibliografía complementaria
Estructura de datos y algoritmos en java. A.
Drozdek. Thomsom. ISBN: 9706866116. 2007
Estructuras de datos con Java. J. Lewis, J.
Chase. Pearson – Addison Wesley. ISBN 13:
9788420541914
EstrategiasdeprogramaciónyestructurasdedatosGradoenIngenieríaInformá8ca
GradoenTecnologíasdelaInformaciónDepartamentodeLenguajesySistemasinformá6cos
JavierVé[email protected]
DepartamentodeLenguajesYSistemasInformáAcosUNED
9TiposabstractosdedatosjerárquicosÁrbolesbinarios
Tiposabstractosdedatosjerárquicos.Árbolesbinarios
Javier Vélez Reyes [email protected] 8 - 2
Índice
Índice
› Introducción
› Tipos abstractos de datos jerárquicos
› El tipo abstracto de datos Árbol binario
› Interfaz del tipo abstracto de datos Árbol binario
› Implementaciones del tipo abstracto de datos Árbol binario
› Implementación dinámica
› Implementación estática con array de posiciones fijas
› Implementación estática con array de posiciones variables
› Algoritmos sobre Árboles binarios
› Recorrido de los elementos de un Árbol binario
› Búsqueda de un elemento sobre una Árboles binarios
› Ordenación y Equilibrado en Árboles binarios
› Problemas y ejercicios
› Bibliografía
Tiposabstractosdedatosjerárquicos.Árbolesbinarios
Javier Vélez Reyes [email protected] 8 - 3
Obje6vosgenerales
Obje8vos
› Conocer la interfaz del tipo abstracto de datos Árbol binario
› Aprender a implementar el TAD Árbol binario mediante la interfaz BTreeIF
› En versión estática (con limitación explícita de capacidad máxima)
› En versión dinámica (sin limitación explícita de capacidad máxima)
› Conocer los principales problemas algorítmicos sobre árboles binarios
› Recorrido de los elementos de un árboles binarios
› Búsqueda de un elemento sobre un árboles binarios
› Ordenación y equilibrado de un árboles binarios
› Practicar el diseño de funciones recursivas sobre árboles binarios
Tiposabstractosdedatosjerárquicos.Árbolesbinarios
Javier Vélez Reyes [email protected] 8 - 4
Introducción
TiposabstractosdedatosjerárquicosLos6posabstractosdedatosjerárquicosrepresentanabstraccionesenlasquelosdatossedistribuyenatravésderelacionesdeparento-filialidaddondecadaelemento6eneunpadrey varios hijos. En función del número máximo de hijos que puede tener un elementodis6nguiremosentreárbolesbinarios (con2hijos comomáximo)yárbolesgenerales (sinlimitación en el número de hijos). Aunque los segundos pueden considerarse unageneralización de los primeros, ambos presentan implementaciones y escenarios de usodiferentesloquejus6ficasuconsideracióncomo6posdis6ntos
Tipos abstractos de datos lineales
I. Árboles generales
II. Árboles binarios Un árbol binario es un tipo especial de árbol donde cada elemento del mismo puede referenciar a lo sumo a 2 hijos. Este tipo de estructuras se utilizan frecuentemente para representar en computación no sólo conjuntos de datos con una relación de dependencia padre-hijo sino también para articular esquemas de búsqueda eficientes
Los árboles generales pueden considerarse a todos los efectos una generalización de los árboles binarios donde el número de hijos está limitado por una constante k > 2 (o no existe limitación en el número de hijos). Aunque, en principio, es posible expresar todo árbol general como un árbol binario, existen situaciones en computación donde este tipo de abstracciones tiene usos interesantes
Tema 7
}
Tema 8
}
Tiposabstractosdedatosjerárquicos.Árbolesbinarios
Javier Vélez Reyes [email protected] 8 - 5
Introducción
El8poabstractodedatosÁrbolbinarioUnárbolbinarioesunaestructuraqueorganizaunacoleccióndeelementosatravésdeunarelacióndeparento-filialidaddondecadaelementodisponealosumodeunpadreyalosumode2hijos.Siun elemento no 6ene padre se llama nodo raíz. En un árbol binario hay siempre un y sólo unelementoraíz.Siunelementono6enehijosse llamaelementohoja.Ladefinicióncomputabledel6poseestablecerecursivamentedelasiguientemanera
Unárbolbinarioesun6poabstractodedatosquedaaccesodirectoaunelemento
llamadoraízy,a losumo,adossubárbolesquedependen jerárquicamentedeél
comohijosllamadossubárbolizquierdoysubárbolderecho
Árbol binario Los árboles binarios pueden tener a lo sumo dos elementos hijos
0
1 7
2 4 8 9
3 5 6
Elemento hoja Cuando un elemento no tiene hijos se llama hoja
Raíz La raíz es el elemento del que cuelga el resto de nodos
Niveles El número de niveles de un árbol indica la
separación máxima que hay entre la raíz y la
hoja más alejada de ésta
medida en número de
arcos
Tiposabstractosdedatosjerárquicos.Árbolesbinarios
Javier Vélez Reyes [email protected] 8 - 6
Interfazdel6poabstractodedatosÁrbolbinario
Lainterfazdel8poabstractodedatosÁrbolbinarioBTreeIF<T>
publicinterfaceBTreeIF<T>{publicintPREORDER=0;publicintINORDER=1;publicintPOSTORDER=2;publicintLRBREADTH=3;publicintRLBREADTH=4;/***Devuelveelelementoraizdelarbol.*@returnelelementoraizdelarbol.*/publicTgetRoot();/***Devuelveelsubarbolizquierdoonullsinoexiste.*@returnelsubarbolizquierdo.*/publicBTreeIF<T>getLeftChild();/***Devuelveelsubarbolderechoonullsinoexiste.*@returnelsubarbolderecho.*/publicBTreeIF<T>getRightChild();
El interfazdeÁrbolbinarioqueu6lizaremosa lo largode este curso, BTreeIF está compuesto por lasoperacionesquedescribimosacon6nuación
RecorridosEstas constantes sirven para identificar en el método getIterator distintas estrategias de recorrido de los elementos del árbol
ObtenerraízDevuelve la raíz del árbol. Este método devuelve un elemento de tipo T distinto de nulo
ObtenerhijoizquierdoEsta operación consultora devuelve el subárbol que cuelga como hijo izquierdo del árbol sobre el que se consulta
ObtenerhijoderechoEsta operación consultora devuelve el subárbol que cuelga como hijo derecho del árbol sobre el que se consulta
1
2 3
1
1
2 3
2
1
2 3
3
Tiposabstractosdedatosjerárquicos.Árbolesbinarios
Javier Vélez Reyes [email protected] 8 - 7
Interfazdel6poabstractodedatosÁrbolbinario
Lainterfazdel8poabstractodedatosÁrbolbinarioBTreeIF<T>
/***Estableceelelementoraiz.*@paramelementElelementoaestablecer.*/publicvoidsetRoot(Telement);/***Estableceelsubarbolizquierdo.*@paramtreeelarbolaesablecer.*/publicvoidsetLeftChild(BTreeIF<T>tree);/***Estableceelsubarbolderecho.*@paramtreeelarbolaesablecer.*/publicvoidsetRightChild(BTreeIF<T>tree);/***Borraelsubarbolizquierdo.*/publicvoidremoveLeftChild();/***Borraelsubarbolderecho.*/publicvoidremoveRightChild();
El interfazdeÁrbolbinarioqueu6lizaremosa lo largode este curso, BTreeIF está compuesto por lasoperacionesquedescribimosacon6nuación
AsignarelementoraízA través de esta operación se puede modificar el valor del elemento raíz del árbol referido
AsignarhijoizquierdoA través de esta operación se cambia el subárbol izquierdo por otro subárbol pasado como parámetro
AsignarhijoizquierdoA través de esta operación se cambia el subárbol izquierdo por otro subárbol pasado como parámetro
EliminarhijoizquierdoEsta operación elimina el subárbol izquierdo. Si no existe hijo derecho se convierte en hoja
4
2 3
4
1
4 3
4
1
2 4
4
EliminarhijoderechoEsta operación elimina el subárbol derecho. Si no existe hijo izquierdo se convierte en hoja
1
3
1
2 3
1
2
1
2
Tiposabstractosdedatosjerárquicos.Árbolesbinarios
Javier Vélez Reyes [email protected] 8 - 8
Interfazdel6poabstractodedatosÁrbolbinario
Lainterfazdel8poabstractodedatosÁrbolbinarioBTreeIF<T>
/***Devuelceciertosielarbolesunnodohoja.*@returnciertosielarbolesunnodohoja.*/publicbooleanisLeaf();/***Devuelveciertosielarbolesvacio.*@returnciertosielarbolesvacio.*/publicbooleanisEmpty();}
El interfazdeÁrbolbinarioqueu6lizaremosa lo largode este curso, BTreeIF está compuesto por lasoperacionesquedescribimosacon6nuación
EshojaEste predicado determina si el elemento de un árbol es un elemento hoja o no
RecorridoDevuelve un iterador que permite recorrer los elementos del árbol. Los tipos de recorridos (ver principio) son preorden, inorden, postorden, anchura y anchura inversa
1
2 3
falso
cierto
1
2 3
2,1,3inorden
Tiposabstractosdedatosjerárquicos.Árbolesbinarios
Javier Vélez Reyes [email protected] 8 - 9
Implementacióndel6poabstractodedatosÁrbolbinario
Implementacióndel8poabstractodedatosÁrbolbinarioBTreeIF<T>Existen varias estrategias de implementación árboles binarios que responden al interfazBTreeIFanterior.Éstassedividenenimplementacionesdinámicas,concapacidadindefinidapara almacenar elementos e implementaciones está6cas, con una capacidad máximalimitadaestablecidaporparámetro.Acon6nuaciónpresentamosvariasimplementaciones
ImplementacióndinámicabasadaenenlacesizquierdoyderechoSegúnestaestrategiadeimplementación,unárbolesunobjetoquerepresentaelnodoraízdelmismo.Cadanodo6eneunatributoparaalmacenarelvalordelelementoydosatributosde6poárbolbinarioparareferenciaralossubárbolesizquierdoyderecho
ElementoAlmacena el valor
del dato en el nodo
1
2 -5
- -3 - -4 - -6
e
IzquierdoReferencia al hijo izquierdo
DerechoReferencia al hijo derecho
Tiposabstractosdedatosjerárquicos.Árbolesbinarios
Javier Vélez Reyes [email protected] 8 - 10
Implementacióndel6poabstractodedatosÁrbolbinario
Implementacióndel8poabstractodedatosÁrbolbinarioBTreeIF<T>Existen varias estrategias de implementación árboles binarios que responden al interfazBTreeIFanterior.Éstassedividenenimplementacionesdinámicas,concapacidadindefinidapara almacenar elementos e implementaciones está6cas, con una capacidad máximalimitadaestablecidaporparámetro.Acon6nuaciónpresentamosvariasimplementaciones
Implementaciónestá8camediantearraydeposicioneshijasfijasEnestaimplementaciónunárbolserepresentacomounarraydeelementos.Elvalordelelemento raíz seencuentraen laposición0.Paraelelementoen laposicióni, suhijoizquierdo,sihay,estaráenlaposición2*i+1ysuhijoderechoenlaposición2*i+2
Niveles = 4
CapacidadmáximaylongitudLa capacidad de esta implementación se expresa en términos del número máximo de niveles. Si nes el número máximo de niveles hace falta un vector de tamaño 2n+1. El árbol debe estar equilibrado y casicompletoparaunaprovechamientoeficiente
0
1 7
2 4 8 9
3 5 6
- 59 34 87 20 1 6 - - - -8 96 74 52 30 1 0 1 2 3 4
10
izquierdo
derecho
Tiposabstractosdedatosjerárquicos.Árbolesbinarios
Javier Vélez Reyes [email protected] 8 - 11
Implementacióndel6poabstractodedatosÁrbolbinario
Implementacióndel8poabstractodedatosÁrbolbinarioBTreeIF<T>Existen varias estrategias de implementación árboles binarios que responden al interfazBTreeIFanterior.Éstassedividenenimplementacionesdinámicas,concapacidadindefinidapara almacenar elementos e implementaciones está6cas, con una capacidad máximalimitadaestablecidaporparámetro.Acon6nuaciónpresentamosvariasimplementaciones
Implementaciónestá8camediantearraydeposicioneshijasvariablesEn esta implementación un árbol se representa como un array de nodos. El valor delnodoraízseencuentraenlaposición0.Cadanodo6eneelvalordelelementoqueportaydosíndicesqueindicanlasposicionesdentrodelarraydondeestánlosnodoshijos
Niveles = 4
CapacidadmáximaylongitudAhora la capacidad se expresa en número de nodos y el árbol no tiene porqué estas equilibrado
8 96 74 52 30 1
Índiceizquierdo
716
1--
063 Índicederecho
elemento
0
1 7
2 4 8 9
3 5 6
Tiposabstractosdedatosjerárquicos.Árbolesbinarios
Javier Vélez Reyes [email protected] 8 - 12
Algoritmossobreárbolesbinarios
AlgoritmossobreárbolesbinariosComovienesiendofrecuentealolargodeestecurso,lostres6posdealgoritmoscanónicosaplicablesacualquierestructuradedatos sonrecorrido,búsquedayordenación.Enestecaso,laordenacióndebeentendersecomounareorganizacióndelosnodosdelárbolparafavoreceralgúncriterio (`picamente labúsqueda). Sinembargo,noestudiaremosningúnalgoritmodeordenaciónynoscentraremossóloenrecorridosybúsquedas
Algoritmos sobre árboles
binarios
I. Recorrido El recorrido de los elementos de un árbol binario devuelve un iterador que permite acceder secuencialmente a los mismos según aparecen almacenados en la estructura. Sin embargo, existen distintos criterios de secuenciamiento que pueden aplicarse para construir un recorrido. Aquí estudiaremos los 5 más típicamente aplicados
II. Búsqueda La búsqueda de un elemento sobre los nodos de un árbol binario se realiza de forma recursiva dada la definición del tipo lo que imprime un coste lineal al algoritmo en el peor caso. La ventaja de este tipo de algoritmos, con respecto a sus equivalentes en otras estructuras de datos es que el proceso no es destructivo con lo que no se requiere utilizar un iterador (con copia) ni reconstruir la estructura tras la aplicación del algoritmo
Independencia de la im
plementación
Tiposabstractosdedatosjerárquicos.Árbolesbinarios
Javier Vélez Reyes [email protected] 8 - 13
Algoritmossobreárbolesbinarios
RecorridodeloselementosdeunárbolbinarioLos recorridos que pueden aplicarse sobre las estructuras arborescentes son varios enfunciónde la estrategiade secuenciamientoque se aplique sobre los elementosdel6poabstracto de datos. En concreto es posible dis6nguir 5 estrategias organizados de lasiguientemanera
Rec
orrid
os
sobr
e ár
bole
s
I. Recorridos en profundidad Se recorre el árbol recursivamente en profundidad. En función de donde se aloje, relativamente cada nodo con respecto a sus hijos izquierdos y derechos se distinguen 3 recorridos en profundidad
II. Recorridos en anchura
Preorden
Inorden
Postorden
Cada nodo se inserta antes de sus hijos izquierdos y derechos
Cada nodo se inserta entre sus hijos izquierdos y derechos
Cada nodo se inserta detrás de sus hijos izquierdos y derechos
SACO
CASO
cAOS
Se recorre el árbol en anchura colocando pr imero todos los elementos del nivel k antes de pasar a colocar los del nivel k + 1. En función del orden en que se disponen los elementos por niveles se distinguen dos recorridos en anchura
Anchura
Anchura inversa
Se disponen los elementos del árbol por niveles de izquierda a derecha y desde la raíz a las hojas
Se disponen los elementos de forma inversa a como establece un recorrido en anchura
OCAS
SACO
Tiposabstractosdedatosjerárquicos.Árbolesbinarios
Javier Vélez Reyes [email protected] 8 - 14
Algoritmossobreárbolesbinarios
RecorridodeloselementosdeunaárbolbinarioPara implementar el iterador de los árboles binarios u6lizaremos una cola donde sealmacenaránenlaconstrucciónloselementosdispuestosadecuadamentesegúnel6poderecorridoseleccionado.Laiteraciónentoncessedelegaráeneliteradordeesacola
classBTreeIterator<T>implementsIteratorIF<T>{privateIteratorIF<T>iterator;/***ConstructorparaQueueIterator.*@paramhandlerelmanejadordearbolesbinarios.*@paramtypeeltipoderecorrido.*/publicBTreeIterator(BTreeIF<T>handler,inttype){QueueIF<T>traverse=null;switch(type){caseBTreeIF.PREORDER:traverse=preorder(handler);break;caseBTreeIF.INORDER:traverse=inorder(handler);break;caseBTreeIF.POSTORDER:traverse=postorder(handler);break;caseBTreeIF.LRBREADTH:traverse=lrBreadth(handler);break;caseBTreeIF.RLBREADTH:traverse=rlBreadth(handler);break;}this.iterator=newQueueIterator<T>(traverse);}/***Devuelveelsiguienteelementodelaiteracion.*@returnelsiguienteelementodelaiteracion.*/@OverridepublicTgetNext(){returniterator.getNext();}
La iteración de los elementos del árbol se delega en el iterador de cola que es construido en el constructor. La función de reset está garantizada
Iteraciónconreset
La función de avance delega en el iterador de cola que se ha construido previamente. Esta aproximación simplifica las operaciones pero penaliza el tiempo de la construcción del iterador
Avance
ConstrucciónEn función del valor del parámetro del tipo de recorrido, el constructor invoca a una u otra función privada que devuelve una cola con los elementos dispuestos en el orden apropiado. Después se construye un iterador sobre la cola resultante
Tiposabstractosdedatosjerárquicos.Árbolesbinarios
Javier Vélez Reyes [email protected] 8 - 15
Algoritmossobreárbolesbinarios
RecorridodeloselementosdeunaárbolbinarioPara implementar el iterador de los árboles binarios u6lizaremos una cola donde sealmacenaránenlaconstrucciónloselementosdispuestosadecuadamentesegúnel6poderecorridoseleccionado.Laiteraciónentoncessedelegaráeneliteradordeesacola/***Devuelveciertosiexistenmaselementoseneliterador.*@returnciertosiexistenmaselementoseneliterador.*/@OverridepublicbooleanhasNext(){returniterator.hasNext();}/***Restableceeliteradorparavolverarecorrerlaestructura.*/@Overridepublicvoidreset(){iterator.reset();}privateQueueIF<T>preorder(BTreeIF<T>tree){QueueIF<T>traverse=newQueueDynamic<T>();if(tree==null)returntraverse;Telement=tree.getRoot();BTreeIF<T>lTree=tree.getLeftChild();BTreeIF<T>rTree=tree.getRightChild();QueueIF<T>lTraverse=preorder(lTree);QueueIF<T>rTraverse=preorder(rTree);traverse.add(element);addAll(traverse,lTraverse);addAll(traverse,rTraverse);returntraverse;}
La función de siguiente se delega sobre el iterador de cola. Habrá siguientes elementos que visitar si el iterador de cola aún no ha finalizado
Siguiente
El recorrido en preorden inserta primero en la cola cada nodo y luego construye recursivamente las colas de los subárboles izquierdo y derecho. Mediante el método allAll dichas colas se añaden, en ese orden a la cola principal.
Preorden
ResetLa función de restablecimiento del iterador se delega igualmente sobre el método homónimo del iterador de colas
Tiposabstractosdedatosjerárquicos.Árbolesbinarios
Javier Vélez Reyes [email protected] 8 - 16
Algoritmossobreárbolesbinarios
RecorridodeloselementosdeunaárbolbinarioPara implementar el iterador de los árboles binarios u6lizaremos una cola donde sealmacenaránenlaconstrucciónloselementosdispuestosadecuadamentesegúnel6poderecorridoseleccionado.LaiteraciónentoncessedelegaráeneliteradordeesacolaprivateQueueIF<T>inorder(BTreeIF<T>tree){QueueIF<T>traverse=newQueueDynamic<T>();if(tree==null)returntraverse;Telement=tree.getRoot();BTreeIF<T>lTree=tree.getLeftChild();BTreeIF<T>rTree=tree.getRightChild();QueueIF<T>lTraverse=inorder(lTree);QueueIF<T>rTraverse=inorder(rTree);addAll(traverse,lTraverse);traverse.add(element);addAll(traverse,rTraverse);returntraverse;}privateQueueIF<T>postorder(BTreeIF<T>tree){QueueIF<T>traverse=newQueueDynamic<T>();if(tree==null)returntraverse;Telement=tree.getRoot();BTreeIF<T>lTree=tree.getLeftChild();BTreeIF<T>rTree=tree.getRightChild();QueueIF<T>lTraverse=postorder(lTree);QueueIF<T>rTraverse=postorder(rTree);addAll(traverse,lTraverse);addAll(traverse,rTraverse);traverse.add(element);returntraverse;}privatevoidaddAll(QueueIF<T>q,QueueIF<T>p){while(!p.isEmpty()){Telement=p.getFirst();q.add(element);p.remove();}}
El recorrido en inorden inserta primero en la cola, los elementos del subárbol izquierdo, luego el nodo en curso y finalmente los elementos del subárbol derecho.
Inorden
El recorrido en postorden inserta primero los elementos de los subárboles izquierdo y derecho y después anexa el nodo en curso.
Postorden
La función addAll inserta en una cola todos los elementos de una segunda cola
Encolartodos
Tiposabstractosdedatosjerárquicos.Árbolesbinarios
Javier Vélez Reyes [email protected] 8 - 17
Algoritmossobreárbolesbinarios
RecorridodeloselementosdeunaárbolbinarioPara implementar el iterador de los árboles binarios u6lizaremos una cola donde sealmacenaránenlaconstrucciónloselementosdispuestosadecuadamentesegúnel6poderecorridoseleccionado.LaiteraciónentoncessedelegaráeneliteradordeesacolaprivateQueueIF<T>lrBreadth(BTreeIF<T>tree){QueueIF<T>traverse=newQueueDynamic<T>();QueueIF<BTreeIF<T>>aux=newQueueDynamic<BTreeIF<T>>();aux.add(tree);while(!aux.isEmpty()){BTreeIF<T>aTree=aux.getFirst();Telement=tree.getRoot();BTreeIF<T>lTree=aTree.getLeftChild();BTreeIF<T>rTree=aTree.getRightChild();if(lTree!=null)aux.add(lTree);if(rTree!=null)aux.add(rTree);traverse.add(element);aux.remove();}returntraverse;}privateQueueIF<T>rlBreadth(BTreeIF<T>tree){QueueIF<T>traverse=lrBreadth(tree);StackIF<T>aux=newStackDynamic<T>();while(!traverse.isEmpty()){Telement=traverse.getFirst();aux.push(element);traverse.remove();}while(!aux.isEmpty()){Telement=aux.getTop();traverse.add(element);aux.pop();}returntraverse;}
El recorrido en anchura utiliza dos colas para su construcción. En una se van insertando los elementos resultantes del recorrido. La otra es una cola auxiliar que sirve para almacenar los subárboles pendientes de ser procesados en cada paso
Anchura
La anchura inversa es el recorrido inverso al anterior por tanto la implementación más sencilla consiste en generar un recorrido en anchura e invertirlo posteriormente. Para ello se utiliza una pila. Primero se mueven los elementos de la cola resultante a una pila. Después se extraen de la cola para insertarlos en una pilla. Finalmente se extraen de la pila para insertarlos nuevamente en la cola
Anchurainversa
Tiposabstractosdedatosjerárquicos.Árbolesbinarios
Javier Vélez Reyes [email protected] 8 - 18
Algoritmossobreárbolesbinarios
BúsquedadeunelementosobreunárbolbinarioLabúsquedadeundatosobreloselementoscontenidosenunárbolbinarioesunproblemaderecorridoqueterminacuandoseencuentraelelementobuscadodentrodelaestructuradedatos.Dadoquesetratadeun6pocondefiniciónrecursivaesposibleaplicardos6posdealgoritmos.Labúsquedaaplicaunaestrategiarecursivapararecorrerenprofundidadelárbol. Alterna6vamente también se puede encontrar una solución itera6va basada enbúsquedaconcen6nelau6lizandoalgunodelosrecorridossecuencialesqueacabamosdedescribir.
Búsquedabinaria
@Overridepublicbooleancontains(Telement){if(element==null)returnfalse;returnelement.equals(getRoot())||(getLeftChild()!=null)?getLeftChild().contains(element):false||(getRightChild()!=null)?getRightChild().contains(element):false;}
Es esta implementación se realiza unabúsqueda con recursiva sobre la estructuradenodosdelárbol.Elrecorridocorrespondeaunpreorden
Búsquedaconcen8nela
@Overridepublicbooleancontains(Telement){booleanfound=false;Iterator<T>it=getIterator(this,BTreeIF.INORDER);while(!found&&it.hasNext()){TanElement=it.getNext();found=anElement.equals(element);}returnfound;}
En la búsqueda con cen6nela la soluciónitera sobre los elementos de la estructuraobtenidos a par6r de un iterador decualquier 6po de recorrido (por ejemploinorden)
Tiposabstractosdedatosjerárquicos.Árbolesbinarios
Javier Vélez Reyes [email protected] 8 - 19
Algoritmossobreárbolesbinarios
ÁrbolesbinariosdebúsquedaLos árboles binarios de búsqueda son u6lizados para disponer los elementos de unconjuntodetalformaqueseop6micelalocalizacióndelosmismosalcanzándoseuncostetemporal logarítmico con respecto al volumen de datos medido para el peor caso. Ladisposicióndeloselementosdebeseguir,naturalmente,ciertoscriteriosdeorden
Un árbol binario es de búsqueda si es vacio o la raíz es mayor que el máximo
elemento del subárbol izquierdo ymenor que elmínimo elemento del subárbol
derechoy,asuvez,ambossubárbolessonárbolesbinariosdebúsqueda
8
3
1 6
4 7
10
14
13
En efecto, este es unárbol binario debúsquedapuestoqueverificaquetodosloselementosenelsubárbol izquierdo de cada nodo son menoresque dicho nodo y los que se encuentran en elsubárbolderechomayoresqueelmismo
}
Tiposabstractosdedatosjerárquicos.Árbolesbinarios
Javier Vélez Reyes [email protected] 8 - 20
Algoritmossobreárbolesbinarios
Árbolesbinariosdebúsqueda
Unárboldebúsquedaesequilibradosi
la alturade los subárboles izquierdoy
derechoesexactamentelamisma
ÁrbolesequilibradosParagaran6zarrealmenteuncostelogarítmicoenlabúsquedaesnecesarioasegurarsedeque la estructura se man6ene equilibrada. Es decir, que la proporción de nodos a laizquierdayderechadecualquiernodosealamisma
4
2 6
5 71 3
5
4
3
2
6 7
1En una estructura jerárquicaequilibrada el coste de labúsquedaesO(logn)
}
Si el árbol binario debú squeda no e s t áequilibrado, en el casopeor se puede llegar ac o n v e r A r e n u n aestructura lineal concosteO(n)
}
Los árboles binarios de búsqueda son u6lizados para disponer los elementos de unconjuntodetalformaqueseop6micelalocalizacióndelosmismosalcanzándoseuncostetemporal logarítmico con respecto al volumen de datos medido para el peor caso. Ladisposicióndeloselementosdebeseguir,naturalmente,ciertoscriteriosdeorden
Tiposabstractosdedatosjerárquicos.Árbolesbinarios
Javier Vélez Reyes [email protected] 8 - 21
Algoritmossobreárbolesbinarios
Árbolesbinariosdebúsqueda
Estrategiasdeequilibradoyrotaciones
Los árboles binarios de búsqueda son u6lizados para disponer los elementos de unconjuntodetalformaqueseop6micelalocalizacióndelosmismosalcanzándoseuncostetemporal logarítmico con respecto al volumen de datos medido para el peor caso. Ladisposicióndeloselementosdebeseguir,naturalmente,ciertoscriteriosdeorden
Dado que la estructuración jerárquica de los árboles de búsqueda no responde a unrequisitodelproblemasinoaunadisposiciónconvenientedelosdatosesposiblecambiarla misma según se hacen inserciones o extracciones para mantener el equilibrio. Lasrotacionesseencargandeello(véasehap://qma6ca.com)
Rotación simple a derechas Rotación simple a izquierdas
8
4
6 2
10
n
n
n+1
4
8
10 6
2
n n n+1
n
n
n+1
n n n+1
4
3 8
9 6
8
4
6 3
9
Tiposabstractosdedatosjerárquicos.Árbolesbinarios
Javier Vélez Reyes [email protected] 8 - 22
Algoritmossobreárbolesbinarios
Árbolesbinariosdebúsqueda
Estrategiasdeequilibradoyrotaciones
Los árboles binarios de búsqueda son u6lizados para disponer los elementos de unconjuntodetalformaqueseop6micelalocalizacióndelosmismosalcanzándoseuncostetemporal logarítmico con respecto al volumen de datos medido para el peor caso. Ladisposicióndeloselementosdebeseguir,naturalmente,ciertoscriteriosdeorden
Dado que la estructuración jerárquica de los árboles de búsqueda no responde a unrequisitodelproblemasinoaunadisposiciónconvenientedelosdatosesposiblecambiarla misma según se hacen inserciones o extracciones para mantener el equilibrio. Lasrotacionesseencargandeello(véasehap://qma6ca.com)
Rotación doble a derechas Rotación doble a izquierdas
n+1
n+1
n
n+1
9
10 5
1 7
8 6
7
5 9
1 6 8 10
n+1 n+1
n
n+1
3
5
9
7
6 8
10
n+1
n+1
n+1 n
7
5
3
n+1
6
n
9
8 10
n+1 n+1
Tiposabstractosdedatosjerárquicos.Árbolesbinarios
Javier Vélez Reyes [email protected] 8 - 23
Algoritmossobreárbolesbinarios
Árbolesbinariosdebúsqueda
Tiposdeárbolesdebúsqueda
Los árboles binarios de búsqueda son u6lizados para disponer los elementos de unconjuntodetalformaqueseop6micelalocalizacióndelosmismosalcanzándoseuncostetemporal logarítmico con respecto al volumen de datos medido para el peor caso. Ladisposicióndeloselementosdebeseguir,naturalmente,ciertoscriteriosdeorden
Dadoque la restricciónacercadel equilibrioesdemasiado fuerte, sehan ideadoalgunos6posdeárbolesdebúsquedacuasi-equilibradosqueaplicanlasrotacionesanteriorescomoejefundamentaldelmantenimientologarítmicodelasoperacionesdelocalización
Árboles AVL Árboles roji – negros En los árboles AVT las alturas de los hijos izquierdo yderechodecadasubárbolsólopuedendiferir,alosumoen una unidad aplicándose rotaciones para elreequilibrado. Inserción y borrado son logarítmicas. Laprimeradebidoaun coste constantede la rotación. LasegundaporquelapropagaciónsoloseexAendehastalaraíz Para el resto de operaciones, el coste temporal,tanto promedio como en el caso peor, es tambiénlogarítmico aunque su coste espacial resulta lineal.[Weiss,484-492][Drozdek,255-260]
Los árboles roji-negros son estructuras auto-equilibradas enlaquelosnodosAenenunatributoadicional,sucolor(rojoonegro). La raíz es siempre negra. Los dos hijos de un nodorojodebensernegros.Todaslashojassonnegras.Ytodosloscaminos desde un nodo antecesor hasta cualquiera de sushojasdebencontenerelmismonúmerodenodosnegros.SeuAlizan rotaciones para reequilibrar. Se pueden eliminar elsegundo recorrido de los AVLmediante una transformacióndescendente de algunos de los nodos (cambio de color,inserción de una hoja y rotación). Sin embargo, el borradoAene una codificación compleja. Su coste temporal eslogarítmico.[Weiss,492-505]
Tiposabstractosdedatosjerárquicos.Árbolesbinarios
Javier Vélez Reyes [email protected] 8 - 24
Algoritmossobreárbolesbinarios
Árbolesbinariosdebúsqueda
Tiposdeárbolesdebúsqueda
Los árboles binarios de búsqueda son u6lizados para disponer los elementos de unconjuntodetalformaqueseop6micelalocalizacióndelosmismosalcanzándoseuncostetemporal logarítmico con respecto al volumen de datos medido para el peor caso. Ladisposicióndeloselementosdebeseguir,naturalmente,ciertoscriteriosdeorden
Dadoque la restricciónacercadel equilibrioesdemasiado fuerte, sehan ideadoalgunos6posdeárbolesdebúsquedacuasi-equilibradosqueaplicanlasrotacionesanteriorescomoejefundamentaldelmantenimientologarítmicodelasoperacionesdelocalización
Árboles AA Árboles B LosárbolesAA sonunavariantede los roji-negros cuyoatributo adicional es el nivel en lugar del color. El nivelrepresentaelnúmerodeenlacesahijos izquierdosenelcaminohacialahoja(para lashojas1).Unpadrerojoysuhijo se conectanporun enlacehorizontal yAenenelmismonivel.Elniveldelhijodeunpadrenegroseráunaunidadmenosqueel desupadre.Lainserciónsiemprese realiza en el nivel más bajo del árbol. Se uAlizanrotaciones simples para reequilibrar si es preciso. Elborradoselimitaalaeliminacióndeunnododenivel1.Sucosteespacialytemporalesigualaldelosrojinegrosaunque los árboles AA se suelen aplanar algo más.[Weiss,505-512]
LosárbolesBsonunageneralizaciónde losárbolesbinariosdebúsquedaenlosqueunnodointernopuedetenermásdedos hijos hasta un cierto límite. OpAmizan la lectura degrandesbloquesdedatos.UnárbolBdeordenkesunárbolk-arioenque losdatossealmacenanen lashojas.Unnodointerno contendrá k-1 clavesdebúsqueda,donde la j-ésimaclaveserálamenordelárbolj+1-ésimo.Laraízbienseráunahoja bien tendrá un rango de hijos entre 2 y k. Los nodosinternosAenenentrek/2y khijos. Laprofundidadde todaslashojaseslamismayAenenentreh/2yhhijos,dondehesun valor constante y prefijado. Al maximizar el número dehijos la altura decrece reduciéndose el coste de acceso(logaritmoenbasek)ylosreequilibrios.[Weiss,512-519]
Tiposabstractosdedatosjerárquicos.Árbolesbinarios
Javier Vélez Reyes [email protected] 8 - 25
Problemasyejercicios
EjerciciosPueden encontrarsemul6tud de situaciones donde es necesariomanipular la estructurainterna de los elementos de un árbol binario. A con6nuación presentamos algunosejerciciosquevienenaejemplificartalessituaciones
Diseñe una función devuelva elnúmero de elementos que con6eneunárbolbinario
I. Contar elementos Diseñe una función que devuelve lasuma de todos los elementos de unárbolbinariodeenteros
II. Sumar elementos Diseñe una función recursiva quedevuelva una lista con todos loselementos pares de un árbol deenteros
III. Encontrar pares
Diseñe una función recursiva quedado un árbol binario de enterosdevuelva otro árbol solamente conloselementospares
IV. Eliminar impares Diseñe una función que reorganicelos elementos de un árbol paraconver6rlo en árbol binario debúsqueda
V. Equilibrar Diseñe una función recursiva quedeterminesidosárbolesbinariossonestructuralmenteidén6cos
VI. Comparación de árboles
Diseñe una función recursiva queindiquesidosárbolesbinariosson laimagenespecularelunodelotro
VII. Imagen especular Diseñe una función que dado unárbol binariodeenterossus6tuyaelvalor en cada nodo por el valoracumulado de todos los nodosanteriores a él en un recorrido enprofundidad
VIII. Sumar anteriores Diseñeuna funciónquedeterminesiun árbol binario es un árbol binariodebúsqueda
IX. Es árbol de búsqueda
Tiposabstractosdedatosjerárquicos.Árbolesbinarios
Javier Vélez Reyes [email protected] 8 - 26
Problemasyejercicios
ProblemasLasárbolesbinariossonun6poabstractodedatosqueseu6liza recurrentementeen losproblemas de cierta complejidad de programación. A con6nuación planteamos algunosejemplosdeproblemasqueseresuelvenconelusodeeste6poabstractodedatos.
La forma en que los compiladores manejan lasexpresiones aritmé6co-lógicas esmediante el usode un árbol sintác6co donde los nodos hojacorresponden a operandos y los intermedios aoperaciones. ¿Sabría idear un algoritmo quecalculeelvalordelasiguienteexpresiónaritmé6caexpresadaenformadeunárbolbinario?
Árboles sintácticos de operadores
Juegos y representación de escenarios 3D
En los motores de renderizado 3D (ampliamenteu6lizadoseneldesarrollodejuegosensubje6vo)larepresentación de los escenarios tridimensionalesu6liza árboles binarios para descomponer lastexturas poligonales en formas progresivamentemássencillas.
Tiposabstractosdedatosjerárquicos.Árbolesbinarios
Javier Vélez Reyes [email protected] 8 - 27
Problemasyejercicios
Problemas
Como aplicación especifica de los árboles debúsqueda binarios aparecen los diccionarios. Undiccionario es una estructura jerárquica sobre lacualsedisponenlostérminosenlashojasmientrasque los nos intermedios son prefijos organizadoslexicográficamente
Diccionarios
Codificación Huffman
La codificación Huffman es una técnica decompresióndedatosqueasigna representacionesde longitud variable a cadadato en función se suprobabilidad de aparición (mayor probabilidad,menor longitud). La tabla de correspondenciassuele representarse en forma de árbol binario (0izquierda, 1 derecha) para representar la cadenade0sy1squerepresentacadadato
Lasárbolesbinariossonun6poabstractodedatosqueseu6liza recurrentementeen losproblemas de cierta complejidad de programación. A con6nuación planteamos algunosejemplosdeproblemasqueseresuelvenconelusodeeste6poabstractodedatos.
Tiposabstractosdedatosjerárquicos.Árbolesbinarios
Javier Vélez Reyes [email protected] 8 - 28
Bibliograia
BibliograSaBibliografía básica
Estructuras de datos en java. Weiss, Mark
Allen. Pearson Addison – Wesley. ISBN
9788478290352
Tiposabstractosdedatosjerárquicos.Árbolesbinarios
Javier Vélez Reyes [email protected] 8 - 29
Bibliograia
BibliograSaBibliografía complementaria
Estructura de datos y algoritmos en java. A.
Drozdek. Thomsom. ISBN: 9706866116. 2007
Estructuras de datos con Java. J. Lewis, J.
Chase. Pearson – Addison Wesley. ISBN 13:
9788420541914