estrategias de programación & estructuras de datos

209
Javier Vélez Reyes [email protected] Departamento de Lenguajes Y Sistemas InformáAcos UNED Estrategias de programación y estructuras de datos Grado en Ingeniería Informá8ca Grado en tecnologías de la información Departamento de Lenguajes y Sistemas informáAcos Universidad Nacional de Educación a Distancia 1 er Curso

Upload: javier-velez-reyes

Post on 21-Mar-2017

203 views

Category:

Education


8 download

TRANSCRIPT

Page 1: Estrategias de Programación & Estructuras de Datos

JavierVé[email protected]

DepartamentodeLenguajesYSistemasInformáAcosUNED

EstrategiasdeprogramaciónyestructurasdedatosGradoenIngenieríaInformá8ca

Gradoentecnologíasdelainformación

DepartamentodeLenguajesySistemasinformáAcosUniversidadNacionaldeEducaciónaDistancia

1er Curso

Page 2: Estrategias de Programación & Estructuras de Datos

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

Page 3: Estrategias de Programación & Estructuras de Datos

EstrategiasdeprogramaciónyestructurasdedatosGradoenIngenieríaInformá8ca

GradoenTecnologíasdelaInformaciónDepartamentodeLenguajesySistemasinformá6cos

JavierVélezReyes [email protected]

DepartamentodeLenguajesYSistemasInformáAcosUNED

0PresentaciónEstrategiasdeprogramaciónyestructurasdedatos

Page 4: Estrategias de Programación & Estructuras de Datos

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

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

Page 5: Estrategias de Programación & Estructuras de Datos

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

Page 6: Estrategias de Programación & Estructuras de Datos

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

Page 7: Estrategias de Programación & Estructuras de Datos

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

Page 8: Estrategias de Programación & Estructuras de Datos

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

Page 9: Estrategias de Programación & Estructuras de Datos

JavierVé[email protected]

DepartamentodeLenguajesYSistemasInformáAcosUNED

EstrategiasdeprogramaciónyestructurasdedatosGradoenIngenieríaInformá8ca

GradoenTecnologíasdelaInformaciónDepartamentodeLenguajesySistemasinformá6cos

1IntroducciónLasestructurasdedatosdesdelaorientaciónaobjetos

Page 10: Estrategias de Programación & Estructuras de Datos

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

Page 11: Estrategias de Programación & Estructuras de Datos

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

Page 12: Estrategias de Programación & Estructuras de Datos

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

Page 13: Estrategias de Programación & Estructuras de Datos

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

Page 14: Estrategias de Programación & Estructuras de Datos

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

Page 15: Estrategias de Programación & Estructuras de Datos

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 +

Page 16: Estrategias de Programación & Estructuras de Datos

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

Page 17: Estrategias de Programación & Estructuras de Datos

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

Page 18: Estrategias de Programación & Estructuras de Datos

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

Page 19: Estrategias de Programación & Estructuras de Datos

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

Page 20: Estrategias de Programación & Estructuras de Datos

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()

Page 21: Estrategias de Programación & Estructuras de Datos

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

Page 22: Estrategias de Programación & Estructuras de Datos

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

Page 23: Estrategias de Programación & Estructuras de Datos

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

Page 24: Estrategias de Programación & Estructuras de Datos

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

Page 25: Estrategias de Programación & Estructuras de Datos

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

Page 26: Estrategias de Programación & Estructuras de Datos

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

Page 27: Estrategias de Programación & Estructuras de Datos

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;

Page 28: Estrategias de Programación & Estructuras de Datos

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...

Page 29: Estrategias de Programación & Estructuras de Datos

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)

Page 30: Estrategias de Programación & Estructuras de Datos

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[]

Page 31: Estrategias de Programación & Estructuras de Datos

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)...

Page 32: Estrategias de Programación & Estructuras de Datos

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

Page 33: Estrategias de Programación & Estructuras de Datos

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

Page 34: Estrategias de Programación & Estructuras de Datos

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

Page 35: Estrategias de Programación & Estructuras de Datos

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

Page 36: Estrategias de Programación & Estructuras de Datos

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

Page 37: Estrategias de Programación & Estructuras de Datos

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

Page 38: Estrategias de Programación & Estructuras de Datos

JavierVé[email protected]

DepartamentodeLenguajesYSistemasInformáAcosUNED

EstrategiasdeprogramaciónyestructurasdedatosGradoenIngenieríaInformá8ca

GradoenTecnologíasdelaInformaciónDepartamentodeLenguajesySistemasinformá6cos

2EstrategiasdeprogramaciónAlgoritmositeraAvosyrecursivos

Page 39: Estrategias de Programación & Estructuras de Datos

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

Page 40: Estrategias de Programación & Estructuras de Datos

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

Page 41: Estrategias de Programación & Estructuras de Datos

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

Page 42: Estrategias de Programación & Estructuras de Datos

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

Page 43: Estrategias de Programación & Estructuras de Datos

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

Page 44: Estrategias de Programación & Estructuras de Datos

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

Page 45: Estrategias de Programación & Estructuras de Datos

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

Page 46: Estrategias de Programación & Estructuras de Datos

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

Page 47: Estrategias de Programación & Estructuras de Datos

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)

Page 48: Estrategias de Programación & Estructuras de Datos

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

Page 49: Estrategias de Programación & Estructuras de Datos

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

Page 50: Estrategias de Programación & Estructuras de Datos

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

Page 51: Estrategias de Programación & Estructuras de Datos

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

Page 52: Estrategias de Programación & Estructuras de Datos

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

Page 53: Estrategias de Programación & Estructuras de Datos

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

Page 54: Estrategias de Programación & Estructuras de Datos

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

Page 55: Estrategias de Programación & Estructuras de Datos

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

Page 56: Estrategias de Programación & Estructuras de Datos

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

Page 57: Estrategias de Programación & Estructuras de Datos

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

Page 58: Estrategias de Programación & Estructuras de Datos

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

Page 59: Estrategias de Programación & Estructuras de Datos

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

Page 60: Estrategias de Programación & Estructuras de Datos

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

Page 61: Estrategias de Programación & Estructuras de Datos

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

Page 62: Estrategias de Programación & Estructuras de Datos

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

Page 63: Estrategias de Programación & Estructuras de Datos

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

Page 64: Estrategias de Programación & Estructuras de Datos

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

Page 65: Estrategias de Programación & Estructuras de Datos

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

Page 66: Estrategias de Programación & Estructuras de Datos

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

Page 67: Estrategias de Programación & Estructuras de Datos

JavierVé[email protected]

DepartamentodeLenguajesYSistemasInformáAcosUNED

EstrategiasdeprogramaciónyestructurasdedatosGradoenIngenieríaInformá8ca

GradoenTecnologíasdelaInformaciónDepartamentodeLenguajesySistemasinformá6cos

3AnálisisdelaeficienciadelosalgoritmosCosteasintóAcotemporal

Page 68: Estrategias de Programación & Estructuras de Datos

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

Page 69: Estrategias de Programación & Estructuras de Datos

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

Page 70: Estrategias de Programación & Estructuras de Datos

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

Page 71: Estrategias de Programación & Estructuras de Datos

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

Page 72: Estrategias de Programación & Estructuras de Datos

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

Page 73: Estrategias de Programación & Estructuras de Datos

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

.

Page 74: Estrategias de Programación & Estructuras de Datos

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

.

Page 75: Estrategias de Programación & Estructuras de Datos

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)

Page 76: Estrategias de Programación & Estructuras de Datos

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

Page 77: Estrategias de Programación & Estructuras de Datos

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);

}

Page 78: Estrategias de Programación & Estructuras de Datos

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

Page 79: Estrategias de Programación & Estructuras de Datos

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

Page 80: Estrategias de Programación & Estructuras de Datos

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

}

Page 81: Estrategias de Programación & Estructuras de Datos

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

Page 82: Estrategias de Programación & Estructuras de Datos

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

Page 83: Estrategias de Programación & Estructuras de Datos

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)

Page 84: Estrategias de Programación & Estructuras de Datos

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

Page 85: Estrategias de Programación & Estructuras de Datos

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

Page 86: Estrategias de Programación & Estructuras de Datos

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

Page 87: Estrategias de Programación & Estructuras de Datos

JavierVé[email protected]

DepartamentodeLenguajesYSistemasInformáAcosUNED

EstrategiasdeprogramaciónyestructurasdedatosGradoenIngenieríaInformá8ca

GradoenTecnologíasdelaInformaciónDepartamentodeLenguajesySistemasinformá6cos

4TiposAbstractosdeDatosEstructurasdeDatosBásicas

Page 88: Estrategias de Programación & Estructuras de Datos

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

Page 89: Estrategias de Programación & Estructuras de Datos

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

Page 90: Estrategias de Programación & Estructuras de Datos

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()

Page 91: Estrategias de Programación & Estructuras de Datos

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

Page 92: Estrategias de Programación & Estructuras de Datos

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

Page 93: Estrategias de Programación & Estructuras de Datos

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()

Page 94: Estrategias de Programación & Estructuras de Datos

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

Page 95: Estrategias de Programación & Estructuras de Datos

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

Page 96: Estrategias de Programación & Estructuras de Datos

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

Page 97: Estrategias de Programación & Estructuras de Datos

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

Page 98: Estrategias de Programación & Estructuras de Datos

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

Page 99: Estrategias de Programación & Estructuras de Datos

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

Page 100: Estrategias de Programación & Estructuras de Datos

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

Page 101: Estrategias de Programación & Estructuras de Datos

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

Page 102: Estrategias de Programación & Estructuras de Datos

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

Page 103: Estrategias de Programación & Estructuras de Datos

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);}

Page 104: Estrategias de Programación & Estructuras de Datos

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

Page 105: Estrategias de Programación & Estructuras de Datos

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

Page 106: Estrategias de Programación & Estructuras de Datos

JavierVé[email protected]

DepartamentodeLenguajesYSistemasInformáAcosUNED

EstrategiasdeprogramaciónyestructurasdedatosGradoenIngenieríaInformá8ca

GradoenTecnologíasdelaInformaciónDepartamentodeLenguajesySistemasinformá6cos

5TiposabstractosdedatoslinealesListas

Page 107: Estrategias de Programación & Estructuras de Datos

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

Page 108: Estrategias de Programación & Estructuras de Datos

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

Page 109: Estrategias de Programación & Estructuras de Datos

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

}

Page 110: Estrategias de Programación & Estructuras de Datos

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

Page 111: Estrategias de Programación & Estructuras de Datos

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

Page 112: Estrategias de Programación & Estructuras de Datos

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

Page 113: Estrategias de Programación & Estructuras de Datos

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

Page 114: Estrategias de Programación & Estructuras de Datos

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()

Page 115: Estrategias de Programación & Estructuras de Datos

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()

Page 116: Estrategias de Programación & Estructuras de Datos

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

Page 117: Estrategias de Programación & Estructuras de Datos

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

Page 118: Estrategias de Programación & Estructuras de Datos

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

Page 119: Estrategias de Programación & Estructuras de Datos

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

Page 120: Estrategias de Programación & Estructuras de Datos

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

Page 121: Estrategias de Programación & Estructuras de Datos

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

Page 122: Estrategias de Programación & Estructuras de Datos

EstrategiasdeprogramaciónyestructurasdedatosGradoenIngenieríaInformá8ca

GradoenTecnologíasdelaInformaciónDepartamentodeLenguajesySistemasinformá6cos

JavierVé[email protected]

DepartamentodeLenguajesYSistemasInformáAcosUNED

6TiposabstractosdedatoslinealesPilas

Page 123: Estrategias de Programación & Estructuras de Datos

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

Page 124: Estrategias de Programación & Estructuras de Datos

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

Page 125: Estrategias de Programación & Estructuras de Datos

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

}

Page 126: Estrategias de Programación & Estructuras de Datos

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

Page 127: Estrategias de Programación & Estructuras de Datos

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()

Page 128: Estrategias de Programación & Estructuras de Datos

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

Page 129: Estrategias de Programación & Estructuras de Datos

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

Page 130: Estrategias de Programación & Estructuras de Datos

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

Page 131: Estrategias de Programación & Estructuras de Datos

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

Page 132: Estrategias de Programación & Estructuras de Datos

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

Page 133: Estrategias de Programación & Estructuras de Datos

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

Page 134: Estrategias de Programación & Estructuras de Datos

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

Page 135: Estrategias de Programación & Estructuras de Datos

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

Page 136: Estrategias de Programación & Estructuras de Datos

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:

Page 137: Estrategias de Programación & Estructuras de Datos

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.

Page 138: Estrategias de Programación & Estructuras de Datos

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

Page 139: Estrategias de Programación & Estructuras de Datos

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

Page 140: Estrategias de Programación & Estructuras de Datos

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

Page 141: Estrategias de Programación & Estructuras de Datos

EstrategiasdeprogramaciónyestructurasdedatosGradoenIngenieríaInformá8ca

GradoenTecnologíasdelaInformaciónDepartamentodeLenguajesySistemasinformá6cos

JavierVé[email protected]

DepartamentodeLenguajesYSistemasInformáAcosUNED

7TiposabstractosdedatoslinealesColas

Page 142: Estrategias de Programación & Estructuras de Datos

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

Page 143: Estrategias de Programación & Estructuras de Datos

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

Page 144: Estrategias de Programación & Estructuras de Datos

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

}

Page 145: Estrategias de Programación & Estructuras de Datos

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

Page 146: Estrategias de Programación & Estructuras de Datos

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

Page 147: Estrategias de Programación & Estructuras de Datos

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

Page 148: Estrategias de Programación & Estructuras de Datos

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

Page 149: Estrategias de Programación & Estructuras de Datos

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

Page 150: Estrategias de Programación & Estructuras de Datos

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

Page 151: Estrategias de Programación & Estructuras de Datos

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

Page 152: Estrategias de Programación & Estructuras de Datos

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

Page 153: Estrategias de Programación & Estructuras de Datos

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

Page 154: Estrategias de Programación & Estructuras de Datos

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

Page 155: Estrategias de Programación & Estructuras de Datos

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

Page 156: Estrategias de Programación & Estructuras de Datos

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

Page 157: Estrategias de Programación & Estructuras de Datos

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

Page 158: Estrategias de Programación & Estructuras de Datos

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

Page 159: Estrategias de Programación & Estructuras de Datos

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

Page 160: Estrategias de Programación & Estructuras de Datos

EstrategiasdeprogramaciónyestructurasdedatosGradoenIngenieríaInformá8ca

GradoenTecnologíasdelaInformaciónDepartamentodeLenguajesySistemasinformá6cos

JavierVé[email protected]

DepartamentodeLenguajesYSistemasInformáAcosUNED

8TiposabstractosdedatosjerárquicosÁrbolesgenerales

Page 161: Estrategias de Programación & Estructuras de Datos

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

Page 162: Estrategias de Programación & Estructuras de Datos

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

Page 163: Estrategias de Programación & Estructuras de Datos

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

}

Page 164: Estrategias de Programación & Estructuras de Datos

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

Page 165: Estrategias de Programación & Estructuras de Datos

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

Page 166: Estrategias de Programación & Estructuras de Datos

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

Page 167: Estrategias de Programación & Estructuras de Datos

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 -

Page 168: Estrategias de Programación & Estructuras de Datos

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

Page 169: Estrategias de Programación & Estructuras de Datos

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

Page 170: Estrategias de Programación & Estructuras de Datos

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

Page 171: Estrategias de Programación & Estructuras de Datos

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

Page 172: Estrategias de Programación & Estructuras de Datos

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

Page 173: Estrategias de Programación & Estructuras de Datos

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

Page 174: Estrategias de Programación & Estructuras de Datos

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

Page 175: Estrategias de Programación & Estructuras de Datos

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

Page 176: Estrategias de Programación & Estructuras de Datos

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

Page 177: Estrategias de Programación & Estructuras de Datos

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

Page 178: Estrategias de Programación & Estructuras de Datos

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.

Page 179: Estrategias de Programación & Estructuras de Datos

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

Page 180: Estrategias de Programación & Estructuras de Datos

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

Page 181: Estrategias de Programación & Estructuras de Datos

EstrategiasdeprogramaciónyestructurasdedatosGradoenIngenieríaInformá8ca

GradoenTecnologíasdelaInformaciónDepartamentodeLenguajesySistemasinformá6cos

JavierVé[email protected]

DepartamentodeLenguajesYSistemasInformáAcosUNED

9TiposabstractosdedatosjerárquicosÁrbolesbinarios

Page 182: Estrategias de Programación & Estructuras de Datos

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

Page 183: Estrategias de Programación & Estructuras de Datos

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

Page 184: Estrategias de Programación & Estructuras de Datos

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

}

Page 185: Estrategias de Programación & Estructuras de Datos

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

Page 186: Estrategias de Programación & Estructuras de Datos

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

Page 187: Estrategias de Programación & Estructuras de Datos

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

Page 188: Estrategias de Programación & Estructuras de Datos

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

Page 189: Estrategias de Programación & Estructuras de Datos

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

Page 190: Estrategias de Programación & Estructuras de Datos

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

Page 191: Estrategias de Programación & Estructuras de Datos

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

Page 192: Estrategias de Programación & Estructuras de Datos

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

Page 193: Estrategias de Programación & Estructuras de Datos

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

Page 194: Estrategias de Programación & Estructuras de Datos

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

Page 195: Estrategias de Programación & Estructuras de Datos

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

Page 196: Estrategias de Programación & Estructuras de Datos

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

Page 197: Estrategias de Programación & Estructuras de Datos

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

Page 198: Estrategias de Programación & Estructuras de Datos

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)

Page 199: Estrategias de Programación & Estructuras de Datos

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

}

Page 200: Estrategias de Programación & Estructuras de Datos

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

Page 201: Estrategias de Programación & Estructuras de Datos

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

Page 202: Estrategias de Programación & Estructuras de Datos

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

Page 203: Estrategias de Programación & Estructuras de Datos

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]

Page 204: Estrategias de Programación & Estructuras de Datos

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]

Page 205: Estrategias de Programación & Estructuras de Datos

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

Page 206: Estrategias de Programación & Estructuras de Datos

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.

Page 207: Estrategias de Programación & Estructuras de Datos

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.

Page 208: Estrategias de Programación & Estructuras de Datos

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

Page 209: Estrategias de Programación & Estructuras de Datos

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