You are on page 1of 234

Javier

Vlez Reyes
Jos Ignacio Mayorga Toledano
jvelez@lsi.uned.es
nmayorga@lsi.uned.es
Departamento de Lenguajes Y Sistemas InformDcos
UNED

Estrategias de programacin y
estructuras de datos
Grado en Ingeniera Inform8ca
Grado en tecnologas de la informacin
Departamento de Lenguajes y Sistemas informDcos
Universidad Nacional de Educacin a Distancia

1er Curso

Parte I
Introduccin

Grado en Ingeniera Inform8ca . Grado en tecnologas de la


Departamento de Lenguajes y Sistemas informacin
inform6cos

Estrategias de programacin y estructuras de datos

Javier Vlez Reyes


Jos Ignacio Mayorga Toledano
jvelez@lsi.uned.es nmayorga@lsi.uned.es
Departamento de Lenguajes Y Sistemas InformDcos
UNED

Estrategias de programacin y estructuras de datos


Grado en Ingeniera Inform8ca
Grado en Tecnologas de la Informacin

Departamento de Lenguajes y Sistemas inform6cos

Presentacin

Estrategias de programacin y
estructuras de datos

Javier Vlez Reyes Jos Ignacio Mayorga Toledano


jvelez@lsi.uned.es
nmayorga@lsi.uned.es
Departamento de Lenguajes Y Sistemas InformDcos
UNED

Presentacin
Estrategias de programacin y estructuras de datos

I. Datos de la asignatura
Ttulo de la asignatura Estrategias de programacin y estructuras de datos
Cdigo

71901043

Nmero de crditos

6 ECTS (150 horas)

Tipo

Troncal Anual

Curso

II. Equipo docente


Julio Gonzalo Arroyo (Coordinador)
e-mail : eped@lsi.uned.es
Despacho: 2.15 ETSI Informtica UNED
Horario de tutoras: Jueves 16:00 a 20:00
telfono: 91.398.79.22
Jos Ignacio Mayorga Toledano (profesor)
e-mail : eped@lsi.uned.es
Despacho: 2.13 ETSI Informtica UNED
Horario de tutoras: Jueves 16:00 a 20:00
telfono: 91.398.64.83

Fernando Lpez Ostenero (Profesor)


e-mail : eped@lsi.uned.es
Despacho: 2.13 ETSI Informtica UNED
Horario de tutoras: Jueves 16:00 a 20:00
telfono: 91.398.77.93

lvaro Rodrigo Yuste (profesor, TAR)


e-mail : eped@lsi.uned.es
Despacho: 2.03 ETSI Informtica UNED
Horario de tutoras: Jueves 16:00 a 20:00
telfono: 91.398.96.93


0-2

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Presentacin
Estrategias de programacin y estructuras de datos

III. Atencin al alumno


Entorno virtual
- http://virtual.uned.es
- Material didctico
- Foros de atencin al alumno




Pgina ocial de la asignatura
- hOp://www.lsi.uned.es/eped
- Transparencias
- Consulta de notas


Equipo docente en sede central
- Por correo
- Por telfono
- Presencialmente en horario de guardias

0-3

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Presentacin
Estrategias de programacin y estructuras de datos

IV. Obje8vos generales de la asignatura


Obtener un conocimiento de los principales tipos de datos
Adquirir la capacidad de usar esos tipos en contextos realistas de aplicacin
Aprender algoritmos tpicamente aplicados sobre estos tipos de datos
Adquirir soltura en la aplicacin de estrategias algortmicas de carcter recursivo
Adquirir soltura en la aplicacin de estrategias algortmicas de carcter iterativo
Obtener capacidad para analizar y comparar la eficiencia de los algoritmos
Aprender a disear, formalizar e implementar los tipos de datos
Adquirir una actitud crtica del uso de tipos de datos en la orientacin a objetos

0-4

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Presentacin
Estrategias de programacin y estructuras de datos

V. Contenidos de la asignatura
Parte I. Introduccin
1. Introduccin. Estructuras de datos y sus abstracciones
2. Estrategias de programacin
3. Anlisis de la eficiencia de algoritmos
Parte II. Tipos lineales de datos
4. Listas
5. Pilas
6. Colas
Parte III. Tipos jerrquicas de datos
7. rboles generales
8. rboles binarios
9. rboles binarios de bsqueda

0-5

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Presentacin
Estrategias de programacin y estructuras de datos

VI. Trabajo a realizar


1 prueba presencial
Preguntas de teora
Ejercicios prcticos
Prctica
Carcter individual y obligatorio
Diseo e implementacin de un problema de tipos de datos orientados a objetos
1 sesin de control en el Centro Asociado de asistencia obligatoria

VII. Normas de evaluacin


2 convocatorias anuales (Junio y septiembre)
Notas

0.8 NE + 0.2 NP >= 5.0

NE = Nota Examen
NP = Nota Prctica

0-6

22 .es
Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned

Estrategias de programacin y estructuras de datos


Grado en Ingeniera Inform8ca
Grado en Tecnologas de la Informacin

Departamento de Lenguajes y Sistemas inform6cos

Introduccin

Las estructuras de datos y sus


abstracciones

Javier Vlez Reyes Jos Ignacio Mayorga Toledano


jvelez@lsi.uned.es
nmayorga@lsi.uned.es
Departamento de Lenguajes Y Sistemas InformDcos
UNED

Introduccin
ndice

ndice

Introduccin

Programacin orientada a objetos

1-2

Qu es la programacin orientada a objetos?

Mecanismos de la programacin orientada a objetos

Fundamentos de la programacin orientada a objetos

Tipos abstractos de datos

Qu son los tipos abstractos de datos?

Especificacin de tipos abstractos de datos

Diseo de tipos abstractos de datos

Implementacin de tipos abstractos de datos

Catlogo de tipos abstractos de datos

Bibliografa

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Introduccin
Obje6vos generales

Obje8vos

1-3

Entender las principales caractersticas de la programacin estructurada

Entender las principales caractersticas de la programacin orientada a objetos

Aprender a distinguir ambas aproximaciones paradigmticas

Aprender qu son los tipos abstractos de datos

Aprender cmo se construyen tipos abstractos de datos

Dentro del paradigma estructurado

Dentro del paradigma de orientacin a objetos

Conoces los distintos tipos abstractos de datos que existen

Aprender 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 diseo de tipos abstractos de datos

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Introduccin
Introduccin

Introduccin
I. Programacin estructurada

Programacin
estructurada

El paradigma de programacin estructurada centra la construccin de


so@ware en la creacin de abstracciones funcionales organizadas de
forma composi6va de acuerdo a una estructura jerrquica
Garaje

Vehculo

Tipos abstractos
de datos

Diagnos6co

Reparacin

Elctrica

Mecnica

El programa principal se descompone


funcionalmente en subproblemas que
a su vez se descomponen funcionales
en abstracciones ms sencillas hasta
llegar a operaciones atmicas
El problema de esta aproximacin es
que se asume, irrealistamente, que la
especificacin del problema no cambia
a lo largo del tiempo de desarrollo del
proyecto. Adems la reutilizacin de
cada descomposicin est confinada
al contexto funcional donde aparece
implicado

Programacin
orientada a objetos

1-4

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Introduccin
Introduccin

Introduccin
II. Tipos abstractos de datos

Programacin
estructurada

Con el nimo de fomentar la reu6lizacin de cdigo se buscan


artefactos ms estables dentro de la evolucin del desarrollo de los
productos de so@ware. Las abstracciones de datos, que organizan
datos de acuerdo a determinada lgica estructural son los candidatos
idneos
Garaje

Tipos abstractos
de datos

Vehculo

usa

Diagnos6co

Reparacin

Elctrica

Si bien el proceso de
construccin de software
sigue estando basado en
abstracciones funcionales,
ahora se realizan abstracciones de datos que
representan entidades del
dominio del problema que se
van transformando a lo largo
del rbol de descomposicin

Mecnica

Programacin
orientada a objetos

1-5

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Introduccin
Introduccin

Introduccin
III. Programacin orientada a objetos

Programacin
estructurada

El programacin orientada a objetos proporciona los mecanismos


necesarios de los que adolece el paradigma estructurado para
ar6cular soluciones completamente centradas en abstracciones de
datos

Vehculo
+ arrancar ()
+ parar ()

Garaje

+ Reparar (Vehculo v)

Tipos abstractos
de datos

usa

Ahora toda la arquitectura software de la solucin se articula


en trminos de un ecosistema de abstracciones de datos
(objetos) que colaboran entre si por medio del envo de
mensajes (invocaciones de operaciones)

Programacin
orientada a objetos

1-6

La ventaja de esta aproximacin es que permite central


preliminarmente el desarrollo en la construccin de las
abstracciones y postergar el cuerpo funcional para las ltimas
fases del proyecto, que se expresa como un algoritmo
distribuido entre objetos

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Introduccin
Programacin orientada a objetos

Qu es la programacin orientada a objetos?


La construccin de so@ware orientado a objetos es el mtodo de desarrollo so@ware que
basa la arquitectura de un sistema so@ware en artefactos deducidos de los 6pos de objetos
que ste manipula en lugar de basarse en la funcin o funciones a las cuales el sistema
debe responder
Desarrollo
centrado en
abstracciones
funcionales

Nivel de reutilizacin

Programacin
estructurada
A
B

Desarrollo
centrado en
abstracciones de
datos

Programacin
orientada a objetos

a : A

b : B

Descomposicin
funcional descendente
1-7

c : C
Ecosistema de
colaboracin entre objetos

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Introduccin
Programacin orientada a objetos

Mecanismos bsicos de la programacin orientada a objetos


El paradigma de programacin orientada a objetos se ar6cula, esencialmente, a travs de
cuatro mecanismos fundamentales: Clases, mtodos, objetos y mensajes. De ellos los dos
primeros 6enen lugar en fase de diseo, mientras que los segundos corresponden a la fase
de ejecucin

Fase de diseo
I. Clases
Una clase es una especicacin formal y computable que se
u6liza para construir objetos de un mismo 6po en fase de
ejecucin. Internamente est descrita en trminos de una
coleccin de atributos y una serie de operaciones

Coche

atributos

II. Mtodos
La coleccin de mtodos de una clase dene las capacidades
de la misma y conforma un contrato program6co (API) para
acceder o alterar los atributos de la misma. Los mtodos
ocultan su implementacin a resto de clases de manera que
stas se perciben unas a otras como artefactos con
capacidades de sencilla invocacin
1-8

clase

- marca
- modelo
+ getMarca ()
+ getModelo ()

mtodos

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Introduccin
Programacin orientada a objetos

Mecanismos bsicos de la programacin orientada a objetos


El paradigma de programacin orientada a objetos se ar6cula, esencialmente, a travs de
cuatro mecanismos fundamentales: Clases, mtodos, objetos y mensajes. De ellos los dos
primeros 6enen lugar en fase de diseo, mientras que los segundos corresponden a la fase
de ejecucin

Fase de ejecucin
objeto

III. Objetos
Un objeto es un ejemplar de una clase que reside en memoria
durante cierto 6empo en la fase de ejecucin. Est formado
por un estado denido a par6r del valor que toma en cada
momento cada atributo de la clase en ese ejemplar
IV. Mensajes

estado

- Renault
- Clio

mensaje

Renault

El acto de invocacin de un mtodos sobre un objeto en


6empo de ejecucin se reere como envo de mensaje. En
orientacin a objetos los algoritmos son colaboracin entre
objetos expresadas en trminos de mensajes que uyen de
unos a otros. Cada mensaje 6ene como efecto ejecutar el
algoritmo del mtodo descrito en la clase
1-9

miCoche : Coche

respuesta

miCoche.getMarca ()

Cliente

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Introduccin
Programacin orientada a objetos

Fundamentos de la programacin orientada a objetos


Lo que convierte a la programacin orientada a objetos en el paradigma idneo para
realizar diseo de sistemas centrados en abstracciones de datos es el uso de 6
caracters6cas fundamentales: abstraccin encapsulacin, herencia, polimorsmo, ligadura
dinmica y genericidad

I. Abstraccin
La abstraccin es el proceso mediante el cual describimos una realidad del dominio del
problema para crear una representacin simplicada dentro del dominio de solucin.
Esta simplicacin se basa en la supresin, conversin o adaptacin de caracters6cas
reales en atributos sistmicos y se llama abstraccin de datos
Dominio de la solucin

Motor

Dominio del problema


abstraccin

- combustible
- nCilindros
- fabricante
- modelo

1 - 10

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Introduccin
Programacin orientada a objetos

Fundamentos de la programacin orientada a objetos


Lo que convierte a la programacin orientada a objetos en el paradigma idneo para
realizar diseo de sistemas centrados en abstracciones de datos es el uso de 6
caracters6cas fundamentales: abstraccin encapsulacin, herencia, polimorsmo, ligadura
dinmica y genericidad

II. Encapsulacin
La encapsulacin es el proceso por el cual la coleccin de
mtodos de una clase protege el acceso ilegal al estado de un
objeto por parte de otros objetos segn la lgica de negocio. De
esta forma los atributos no son directamente alterables sino slo
a travs de los mtodos de la clase
setPresin (6)
Mecnico

Coche

Segn los requisitos, una presin


de 6 es excesiva, por lo tanto la
implementacin del mtodo de la
clase provoca que el mensaje no
cause ningn efecto

1 - 11

estado

mtodos

- presin
- ...
+ getPresin ()
+ setPresin (p)

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Introduccin
Programacin orientada a objetos

Fundamentos de la programacin orientada a objetos


Lo que convierte a la programacin orientada a objetos en el paradigma idneo para
realizar diseo de sistemas centrados en abstracciones de datos es el uso de 6
caracters6cas fundamentales: abstraccin encapsulacin, herencia, polimorsmo, ligadura
dinmica y genericidad

II. Encapsulacin
Al ar6cular la encapsulacin es posible denir diferentes modicadores de acceso a los
elementos de una clase (atributos y mtodos). Estos modicadores alteran las reglas de
visibilidad de los elementos desde el exterior de la clase
Modificador private
Un elemento denido como privado slo es
accesible desde dentro de la clase donde se ha
declarado el elemento
Modificadores
de visibilidad
de Java

Modificador public
Un elemento denido como pblico slo es
accesible por todos los objetos del sistema
Modificador protected
Un elemento protegido es accesible por la
propia clase y por cualquier clase hija de est
as como cualquier clase perteneciente al
paquete donde sta est denida

1 - 12

Coche
-Marca
-Modelo
+ getMarca ()
+ getModelo ()
# isPlanRenove ()

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Introduccin
Programacin orientada a objetos

Fundamentos de la programacin orientada a objetos


Lo que convierte a la programacin orientada a objetos en el paradigma idneo para
realizar diseo de sistemas centrados en abstracciones de datos es el uso de 6
caracters6cas fundamentales: abstraccin encapsulacin, herencia, polimorsmo, ligadura
dinmica y genericidad

III. Herencia
La herencia es un mecanismo que permite organizar
un conjunto de clases de acuerdo a una jerarqua. La
relacin que se establece entre ellas es interpretada
como una especializacin / generalizacin y se lee de
la forma A es un B. Mediante la herencia, se pueden
compar6r datos y mtodos miembro entre clases y
subclases. Una clase hija obtendr acceso a todos los
atributos pblicos o protegidos declarados en sus
clases antecesoras. Asimismo, adquirir la
implementacin de los mtodos miembro pblicos o
protegidos en ellas declarados. Por su parte, las clases
hijas pueden especializar la funcionalidad de los
mtodos heredados del padre por medio de la
sobrescrita de su implementacin.

1 - 13

Vehculo

# nRuedas
+ arrancar ()
+ parar ()

Moto

Coche

+ arrancar ()
+ parar ()

+ arrancar ()
+ parar ()

Camin

- capacidad
+ arrancar ()
+ parar ()
+ llenar ()
+ vaciar ()

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Introduccin
Programacin orientada a objetos

Fundamentos de la programacin orientada a objetos


Lo que convierte a la programacin orientada a objetos en el paradigma idneo para
realizar diseo de sistemas centrados en abstracciones de datos es el uso de 6
caracters6cas fundamentales: abstraccin encapsulacin, herencia, polimorsmo, ligadura
dinmica y genericidad

III. Herencia
La herencia permite diferir la implementacin de los
mtodos a alguna de las clases hijas para que hagan
una implementacin especializada. En este sen6do
podemos hablar de:

Vehculo

# nRuedas
+ arrancar ()
+ parar ()

A. Mtodos abstractos
Un mtodo del que se quiere diferir la
implementacin debe declarase como
abstracto. Esto permite encontrar diferentes
implementaciones en cada clase
B. Clase abstracta
Un clase con mtodos abstractos debe
declararse abstracta y no es directamente
instanciable
1 - 14

Moto

Coche

+ arrancar ()
+ parar ()

+ arrancar ()
+ parar ()

Camin

- capacidad
+ arrancar ()
+ parar ()
+ llenar ()
+ vaciar ()

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Introduccin
Programacin orientada a objetos

Fundamentos de la programacin orientada a objetos


Lo que convierte a la programacin orientada a objetos en el paradigma idneo para
realizar diseo de sistemas centrados en abstracciones de datos es el uso de 6
caracters6cas fundamentales: abstraccin encapsulacin, herencia, polimorsmo, ligadura
dinmica y genericidad

III. Herencia
Las jerarquas de herencia prescriben ciertas restricciones con respecto a la forma de
aplicar la lgica de construccin de los objetos. El programador puede alterar esta lgica
mediante el uso de los constructores implcitos this y super.
A. Construccin delegada

1 - 15

this (renault);
this.nRuedas = ruedas;
...

En la instanciacin de objetos, antes de


ejecutar la lgica de creacin del constructor
invocado, se llama al constructor sin
argumentos (u). El uso del constructor
implcito this como primera instruccin de la
lgica de creacin permite alterar este
comportamiento forzando a que se u6lice otro
constructor sobrecargado con ciertos
parmetros de construccin actuales (v)

Vehculo

+ Vehiculo ()

Coche

+ Coche ()
+ Coche (String marca)
+ Coche (int ruedas)

Coche ()
u Coche (Renault)
v Coche (4)

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Introduccin
Programacin orientada a objetos

Fundamentos de la programacin orientada a objetos


Lo que convierte a la programacin orientada a objetos en el paradigma idneo para
realizar diseo de sistemas centrados en abstracciones de datos es el uso de 6
caracters6cas fundamentales: abstraccin encapsulacin, herencia, polimorsmo, ligadura
dinmica y genericidad

III. Herencia
Las jerarquas de herencia prescriben ciertas restricciones con respecto a la forma de
aplicar la lgica de construccin de los objetos. El programador puede alterar esta lgica
mediante el uso de los constructores implcitos this y super.
B. Construccin ascendente en cascada

1 - 16

Vehiculo ()
super (4);
this.marca = Renault;
...

En la instanciacin de objetos, antes de


ejecutar la lgica de creacin del constructor
invocado, se llama al constructor sin
argumentos de la clase padre (u). El uso del
constructor implcito super como primera
instruccin de la lgica de creacin permite
alterar este comportamiento forzando a que se
u6lice otro constructor sobrecargado en el
padre con ciertos parmetros de construccin
actuales (v)

Vehculo
+ Vehiculo ()
+ Vehiculo (int ruedas)

Vehiculo (4)

Coche

Coche ()

u
+ Coche ()
+ Coche (int ruedas)

v
Coche (4)

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Introduccin
Programacin orientada a objetos

Fundamentos de la programacin orientada a objetos


Lo que convierte a la programacin orientada a objetos en el paradigma idneo para
realizar diseo de sistemas centrados en abstracciones de datos es el uso de 6
caracters6cas fundamentales: abstraccin encapsulacin, herencia, polimorsmo, ligadura
dinmica y genericidad

IV. Polimorsmo
La herencia conere a las instancias de una clase ml6ples 6pos. En concreto, los objetos
adquirirn el 6po de la clase a la que pertenecen y el 6po denido por cada una de las
clases padre de las que heredan su comportamiento. A esta propiedad se la llama
polimorsmo
Tipo Vehculo
Vehculo

+ arrancar ()
+ parar ()

1 - 17

Los objetos de las clases Camin tambin los de la clase


Moto o Coche adquieren adems por herencia el tipo
Vehiculo, lo que permite que aparezcan en colaboraciones
de objetos con variables tipificadas con el tipo vehculo

Moto

Coche

Camin

+ arrancar ()
+ parar ()

+ arrancar ()
+ parar ()

+ arrancar ()
+ parar ()
+ llenar ()

Tipo Camin

Los objetos de la clase Camin


adquieren el tipo Camin lo que
significa que en cualquier colaboracin
de objetos, los ejemplares de esta
clase pueden utilizarse en variables
declaradas con el tipo Camin

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Introduccin
Programacin orientada a objetos

Fundamentos de la programacin orientada a objetos


Lo que convierte a la programacin orientada a objetos en el paradigma idneo para
realizar diseo de sistemas centrados en abstracciones de datos es el uso de 6
caracters6cas fundamentales: abstraccin encapsulacin, herencia, polimorsmo, ligadura
dinmica y genericidad

IV. Polimorsmo
Las propiedades polimrcas tambin se coneren a travs del uso de interfaces. De esta
manera, adicionalmente a lo anterior, los objetos de una clase tambin adquirirn el 6po
de cada una de las interfaces que implementen
Interfaz
Una interfaz es un artefacto
especial, similar a una clase, que
prescribe un contrato programtico
estableciendo una coleccin de
signaturas de mtodos pero no la
implementacin de los mismos.

Tipo Vehculo

Los objetos de las clases Camin tambin los de la clase


Moto o Coche adquieren adems por implementacin de
+ arrancar () la interfaz el tipo Vehiculo, lo que permite que aparezcan en
+ parar ()
colaboraciones de objetos con variables tipificadas con el
tipo vehculo

Vehculo

Tipo Camin

1 - 18

Moto

Coche

Camin

+ arrancar ()
+ parar ()

+ arrancar ()
+ parar ()

+ arrancar ()
+ parar ()
+ llenar ()

Los objetos de la clase Camin


adquieren el tipo Camin lo que
significa que en cualquier colaboracin
de objetos, los ejemplares de esta
clase pueden utilizarse en variables
declaradas con el tipo Camin

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Introduccin
Programacin orientada a objetos

Fundamentos de la programacin orientada a objetos


Lo que convierte a la programacin orientada a objetos en el paradigma idneo para
realizar diseo de sistemas centrados en abstracciones de datos es el uso de 6
caracters6cas fundamentales: abstraccin encapsulacin, herencia, polimorsmo, ligadura
dinmica y genericidad

IV. Polimorsmo
Cada 6po dentro de una estructura polimrca de herencia iden6ca un nivel de
abstraccin sobre el que se puede trabajar con los objetos de la herencia. Es posible
conver6r un objeto de un 6po a otro mediante upcas6ngs y downcas6ngs
Tipo Vehculo

Vehculo

Un objeto Camin tipificado como un Vehculo


no puede invocar mtodos del tipo camin

+ arrancar ()
+ parar ()

downcast
Vehculo v = ...
Coche c = (Coche) v;

Moto
+ arrancar ()
+ parar ()

1 - 19

Coche

Camin

+ arrancar ()
+ parar ()

+ arrancar ()
+ parar ()
+ llenar ()

upcast
Coche c = new Coche ();
Vehculo v = (Vehculo) c;

Tipo Camin

Los objetos Camin son una especializacin de


Vehculo que disponen de ciertos mtodos
propios de la abstraccin Camin

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Introduccin
Programacin orientada a objetos

Fundamentos de la programacin orientada a objetos


Lo que convierte a la programacin orientada a objetos en el paradigma idneo para
realizar diseo de sistemas centrados en abstracciones de datos es el uso de 6
caracters6cas fundamentales: abstraccin encapsulacin, herencia, polimorsmo, ligadura
dinmica y genericidad

IV. Polimorsmo
El polimorsmo permite ar6cular un modelo de diseo so@ware conocido por el nombre
de programacin genrica, segn el cual la algoritmia se describe al nivel de abstraccin
de la clase padre para no vincularse a la realizacin prescita por ninguna de sus hijas
Vehculo

Empleado

+ lavar ()

TunelDeLavado

+ lavar (Vehculo v)

v.lavar ()

lavar (unCoche)
Lavando coche...
Moto

+ lavar ()

Coche

Camin

+ lavar ()

+ lavar ()

lavar (unaMoto)
Lavando moto...
lavar (unCamin)

return Lavando moto...

return Lavando camin...

return Lavando coche...

1 - 20

Lavando camin...

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Introduccin
Programacin orientada a objetos

Fundamentos de la programacin orientada a objetos


Lo que convierte a la programacin orientada a objetos en el paradigma idneo para
realizar diseo de sistemas centrados en abstracciones de datos es el uso de 6
caracters6cas fundamentales: abstraccin encapsulacin, herencia, polimorsmo, ligadura
dinmica y genericidad

V. Ligadura dinmica
La ligadura dinmica es la capacidad de algunos lenguajes orientados a objetos de cambiar
en 6empo de ejecucin el objeto referenciado por una variable por otro objeto de dis6nto
6po polimrcamente compa6ble
ColaDeVehiculos

usa

+ reparar (Vehculo v)

- cola

+ encolar (Vehiculo v)
+ lavarTodos ()
+ boolean hayMas ()
+ Vehiculo siguiente ()

1 - 21

Garaje

cola.aadir (v)
Garaje garaje = new Garaje ()
Vehiculo v;
while (cola.hayMas ()) {
v = cola.siguiente ();
garaje.reparar (v);
}

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Introduccin
Programacin orientada a objetos

Fundamentos de la programacin orientada a objetos


Lo que convierte a la programacin orientada a objetos en el paradigma idneo para
realizar diseo de sistemas centrados en abstracciones de datos es el uso de 6
caracters6cas fundamentales: abstraccin, encapsulacin, herencia, polimorsmo, ligadura
dinmica y genericidad

VI. Genericidad
La genericidad permite abstraerse de las los 6pos de objetos con los que trabaja
internamente una clase por medio de la parametrizacin de los mismos. De hecho esta
caracters6cas es tambin conocida como parametrizacin de 6pos
PilaDeCoches
- Coche pila []

Genericidad
Pila <T>

+ apilar (Coche p)
+ Coche desapilar ()

PilaDeMotos

- T pila []
+ apilar (T t)
+ T desapilar ()

- Moto pila []
+ apilar (Moto m)
+ Moto desapilar ()

1 - 22

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Introduccin
Tipos abstractos de datos

Qu son los 8pos abstractos de datos?


La caracterizacin formal y precisa de lo que entenderemos en este curso por 6po abstracto
de datos parte de una diferenciacin previa fundamental entre tres conceptos: 6po
abstracto de datos, 6po de datos y estructura de datos

Deniciones
I. Tipo abstracto de datos
Un 6po abstracto de datos es un modelo formal de organizacin de datos
caracterizado por cierto comportamiento semn6co denido en trminos
de una coleccin de propiedades axiom6cas y operaciones. Dicho
modelo es prescrip6vamente independiente de sus posibles
implementaciones subyacentes y responde a un patrn de uso recurrente
II. Tipo de datos
Un 6po de datos se corresponde con una implementacin par6cular de
un 6po abstracto de datos para lo cual se escoge una representacin
computacional que da soporte a la organizacin de dichos datos
III. Estructura de datos
Una estructura de datos es una representacin computacional de la
organizacin de un conjunto de datos ar6culada en trminos de 6pos de
datos primi6vos y otras estructuras o 6pos de datos
1 - 23

Stack <T>
+ void push (T e)
+ T pop ()

Stack <T>
- T elements []
+ void push (T e) {...}
+ T pop () {...}

T elements []

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Introduccin
Tipos abstractos de datos

Especicacin de 8pos abstractos de datos


La construccin de 6pos abstractos de datos comienza por la especicacin formal de un
conjunto de operaciones que denen el comportamiento del 6po. Cada operacin del 6po
se dene sintc6camente por un perl y semn6camente por un contrato. Por extensin
llamaremos perl y contrato de un 6po abstracto de datos al formado, respec6vamente,
por todas sus operaciones

Partes de la especicacin de 8pos abstractos de datos


I. Parte sintc8ca
El perl de cada operacin describe la sintaxis de la
misma indicando su nombre, 6po y nombre de cada
parmetro de entrada y / o salida y el 6po de retorno
de la misma

Especicacin de
un 8po abstracto
II. Parte semn8ca
de datos

El contrato de cada operacin describe en trminos


formales abstractos el comportamiento esperado de
la misma tras su operacin y el conjunto de valores
leg6mos que es posible aplicar a cada parmetro
formal para realizar la invocacin
1 - 24

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Introduccin
Tipos abstractos de datos

Especicacin de 8pos abstractos de datos. Parte Sintc8ca


El perl de un 6po abstracto de datos est formado por el perl de cada una de las
operaciones pblicas que lo cons6tuyen. ste indica la forma en que se pueden explotar las
capacidades del 6po. Desde un punto de vista conceptual es posible dis6nguir entre 10
6pos dis6ntos de operaciones

Tipos de operaciones
I. Operaciones constructoras
Una operacin constructora con6ene la lgica de inicializacin de
un 6po de datos. Como tal, es invocada inicialmente para crear un
nuevo ejemplar vaco del 6po. Su invocacin puede requerir el
paso de parmetros necesarios para la inicializacin

Stack <T>
+ Stack (int capacity)
...

II. Operaciones constructoras por copia


Una operacin constructora por copia realiza un proceso de
inicializacin similar al anterior. La diferencia estriba en que en
esta ocasin la operacin recibe como parmetro un ejemplar del
mismo 6po de datos y copia sus elementos al nuevo ejemplar
construido

1 - 25

Stack <T>
+ Stack (Stack s)
...

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Introduccin
Tipos abstractos de datos

Especicacin de 8pos abstractos de datos. Parte Sintc8ca


El perl de un 6po abstracto de datos est formado por el perl de cada una de las
operaciones pblicas que lo cons6tuyen. ste indica la forma en que se pueden explotar las
capacidades del 6po. Desde un punto de vista conceptual es posible dis6nguir entre 10
6pos dis6ntos de operaciones

Tipos de operaciones
III. Operaciones modicadoras
Las operaciones modicadoras se u6lizan para alterar de forma
segura el estado interno de una abstraccin de datos. Si la
invocacin es semn6camente valida garan6zan que, tras su
ejecucin dejan al 6po abstracto en un nuevo estado consistente

Stack <T>
+ void push (T element)
+ void pop ()
...

IV. Operaciones consultoras


Las operaciones consultoras de una abstraccin de datos son
aquellas que sirven para consultar de forma segura el estado
interno de la misma. Su invocacin 6ene la propiedad de no
producir efectos en el estado por lo que se consideran
idempotentes

1 - 26

Stack <T>
+ T peek ()
...

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Introduccin
Tipos abstractos de datos

Especicacin de 8pos abstractos de datos. Parte Sintc8ca


El perl de un 6po abstracto de datos est formado por el perl de cada una de las
operaciones pblicas que lo cons6tuyen. ste indica la forma en que se pueden explotar las
capacidades del 6po. Desde un punto de vista conceptual es posible dis6nguir entre 10
6pos dis6ntos de operaciones

Tipos de operaciones
V. Operaciones consultoras lgicas o predicados
Un 6po de operaciones consultoras son los predicados lgicos que
sirven para realizar comprobaciones seguras sobre el estado en
que se encuentra la abstraccin de datos con respecto a cierta
propiedad caracters6ca de la misma

Stack <T>
+ boolean contains (T e)
+ boolean isEmpty ()
+ boolean isFull ()
...

VI. Operaciones comparadoras


Las operaciones comparadoras son un 6po de predicados
dedicados a comparar el estado interno de un ejemplar de la
abstraccin de datos con el de otro u otros ejemplares. El caso
ms recurrente es el de operaciones de igualdad entre ejemplares
del mismo 6po

1 - 27

Stack <T>
+ boolean equals (Stack s)
+ boolean containsAll (Stack s)
...

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Introduccin
Tipos abstractos de datos

Especicacin de 8pos abstractos de datos. Parte Sintc8ca


El perl de un 6po abstracto de datos est formado por el perl de cada una de las
operaciones pblicas que lo cons6tuyen. ste indica la forma en que se pueden explotar las
capacidades del 6po. Desde un punto de vista conceptual es posible dis6nguir entre 10
6pos dis6ntos de operaciones

Tipos de operaciones
VII. Operaciones de hashing
Las operaciones de hashing ofrecen una representacin numrica
que representa de manera casi univoca el estado interno de
una abstraccin de datos. Se u6lizan para controlar la ausencia de
elementos repe6dos en otras abstracciones agregadoras

Stack <T>
+ long hashcode ()
...

VIII. Operaciones transformadoras


Las operaciones transformadoras permiten crear ejemplares de
otros 6pos de abstracciones cuyo estado interno proviene del
estado de la abstraccin original, de acuerdo a cierta lgica de
transformacin

1 - 28

Stack <T>
+ String toString ()
+ String toXML ()
+ List toList ()
+ Set toSet ()
...

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Introduccin
Tipos abstractos de datos

Especicacin de 8pos abstractos de datos. Parte Sintc8ca


El perl de un 6po abstracto de datos est formado por el perl de cada una de las
operaciones pblicas que lo cons6tuyen. ste indica la forma en que se pueden explotar las
capacidades del 6po. Desde un punto de vista conceptual es posible dis6nguir entre 10
6pos dis6ntos de operaciones

Tipos de operaciones
IX. Operaciones destructoras
Las operaciones destructoras con6enen toda la lgica asociada a
la liberacin de recursos que es necesario invocar cuando un
determinado ejemplar de una abstraccin de datos no va a volver
a ser u6lizado a lo largo del programa

Stack <T>
+ void dispose ()
...

X. Operaciones reinicializadoras
Las operaciones reinicialidoras son un caso par6cular de
operaciones modicadoras que restablecen el estado interno de
la abstraccin al original, aquel en que se encontraban cuando
fueron construidas. Su lgica interna es similar a la de una
constructora a excepcin que estas operaciones no realizan
reserva de nuevos recursos

1 - 29

Stack <T>
+ void clear ()
+ void removeAll ()
...

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Introduccin
Tipos abstractos de datos

Especicacin de 8pos abstractos de datos. Parte Sintc8ca


La especicacin de perles de los 6pos abstractos de datos es una labor delicada que debe
prestar atencin a una serie reglas que van dirigidas a evitar efectos colaterales cuando se
invocan las operaciones del 6po abstracto de datos. A con6nuacin resumidos las 4 reglas
fundamentales de la especicacin

Reglas de especicacin
I. Separacin entre operaciones consultoras y modicadoras
Las operaciones consultoras deben garan6zar que no provocaran
un cambio en el estado interno de la abstraccin ya que de no ser
as la semn6ca de las operaciones puede verse comprome6da
desde la perspec6va de los usuarios de la abstraccin
II. Separacin entre parmetros de conguracin y operandos
Los parmetros que debe recibir una operacin deben ser solo de
6po operando. Los parmetros de conguracin aquellos para
los que existe un valor por omisin deben ser proporcionados
previamente mediante la invocacin opcional de otras
operaciones de conguracin

1 - 30

Stack <T>
+ void push (T element)
+ T pop ()
...

stack.pop () + stack.pop ()
!= 2 * stack.pop ()

Impresora
+ void imprimir (Trabajo t)
+ void setPapel (int papel)
+ void setColor (boolean c)
+ void set2Caras (boolean c)

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Introduccin
Tipos abstractos de datos

Especicacin de 8pos abstractos de datos. Parte Sintc8ca


La especicacin de perles de los 6pos abstractos de datos es una labor delicada que debe
prestar atencin a una serie reglas que van dirigidas a evitar efectos colaterales cuando se
invocan las operaciones del 6po abstracto de datos. A con6nuacin resumidos las 4 reglas
fundamentales de la especicacin

Reglas de especicacin
III. Tamao de las operaciones
El nmero de parmetros formales que debe contener el perl de
una operacin no debe ser mayor de 3. Si la can6dad de
informacin que se debe proporcionar es mucha considere
realizar abstracciones que encapsulen varios parmetros en uno

Trabajo
- idioma - documento
- usuario - bandeja

IV. Tamao de las abstracciones


La especicacin del perl de una abstraccin de datos debe ser
realizada de manera que garan6ce que cada operacin del 6po
responde a unas responsabilidades que no colisionan con las
responsabilidades de otra/s operaciones. Asimismo, el nivel de
granularidad de las operaciones debe mantenerse homogneo
entre ellas

1 - 31

ColaDeImpresin <Trabajo>
+ void imprimir (Trabajo t)
+ void cancelar (trabajo t)
+ void reset ()
+ boolean status ()

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Introduccin
Tipos abstractos de datos

Especicacin de 8pos abstractos de datos. Parte Semn8ca


La especicacin de un 6po abstracto de datos tambin incluye la denicin del contrato
para cada una de las operaciones del mismo. Estos contratos describen el efecto de las
operaciones sobre el estado interno del 6po y prescriben las condiciones de deben
sa6sfacer los parmetros de entrada

Partes de un contrato
I. Precondiciones

II. Postcondiciones

Las precondiciones de un contrato de operacin


describen las condiciones bajo las cuales puede
invocarse de forma segura la misma para
garan6zar un futuro estado consistente. Estas se
expresan en trminos de los posibles valores de
cada parmetro de entrada o entrada / salida

Las postcondiciones de un contrato de


operacin describen formalmente los efectos
que provoca la invocacin. stas se describen a
par6r de los parmetros de entrada y salida de
las operaciones y de las variables internas que
referencian el estado anterior del 6po
(U6lizaremos el apostrofe para referirnos a l)

pre: true
stack.push (TElement e)
post: stack.nElementos == stack.nElementos + 1
AND stack.top () == e

1 - 32

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Introduccin
Tipos abstractos de datos

Diseo de 8pos abstractos de datos


La construccin de so@ware centrada en abstracciones de datos se rige por 5 criterios, 5
reglas y 5 principios que deben ser atendidos para conseguir un diseo adecuado que
fomente la reu6lizacin, tolerancia a fallos y extensibilidad del producto

5 criterios de diseo
I. Descomposicin modular
El diseo del so@ware debe descomponer el problema en
abstracciones con responsabilidades especcas, dependencias
bien conocidas e interfaces consensuadas

II. Composicin modular


La construccin de abstracciones debe realizarse de tal manera
que stas puedan combinarse libremente con otras para dar lugar
a nuevas abstracciones de mayor nivel de complejidad

A
B

III. Comprensibilidad modular


Cada abstraccin de datos debe ser construida de tal manera que
la semn6ca, funcionalidad y responsabilidades de cada una
pueda ser interpretada de forma independiente de las dems
abstracciones que par6cipan en el problema

1 - 33

A
B

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Introduccin
Tipos abstractos de datos

Diseo de 8pos abstractos de datos


La construccin de so@ware centrada en abstracciones de datos se rige por 5 criterios, 5
reglas y 5 principios que deben ser atendidos para conseguir un diseo adecuado que
fomente la reu6lizacin, tolerancia a fallos y extensibilidad del producto

5 criterios de diseo
IV. Con8nuidad modular
El diseo de abstracciones debe promover la con6nuidad
modular. De acuerdo a este principio, un pequeo cambio en
alguna abstraccin de datos debe implicar pocos o ningn cambio
en el resto de las abstracciones de datos que forman parte del
dominio de la solucin del problema

A
B

V. Proteccin modular
Las abstracciones de datos deben disearse de manera que se
garan6ce la proteccin modular. Esto signica que el efecto de la
generacin de un error en ejecucin dentro de alguna abstraccin
de datos debe quedar connado dentro de las fronteras de la
misma y nunca propagarse a otras abstracciones dependientes

1 - 34

A
B

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Introduccin
Tipos abstractos de datos

Diseo de 8pos abstractos de datos


La construccin de so@ware centrada en abstracciones de datos se rige por 5 criterios, 5
reglas y 5 principios que deben ser atendidos para conseguir un diseo adecuado que
fomente la reu6lizacin, tolerancia a fallos y extensibilidad del producto

5 reglas de diseo
I. Correspondencia directa
En el proceso de construccin de so@ware pueden reconocerse
dos dominios: el dominio del problema y el dominio de la
solucin. El primero corresponde a una fase de anlisis de los
requisitos del problema. El segundo a un diseo crea6vo que
pretende dar respuesta al problema. Este principio arma que las
abstracciones en ambos dominios deberan parecerse lo mximo
posible

A
B

Solucin
A

Problema
B

II. Ocultacin de informacin


El obje6vo principal del diseo centrado en abstracciones de
datos es realizar una ocultacin conveniente de la informacin no
per6nente. Es decir, cada abstraccin de datos debe publicar slo
aquella informacin interna que resulte necesaria a otras
abstracciones para que en conjunto se puedan desarrollar
colaboraciones
1 - 35

A
B

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Introduccin
Tipos abstractos de datos

Diseo de 8pos abstractos de datos


La construccin de so@ware centrada en abstracciones de datos se rige por 5 criterios, 5
reglas y 5 principios que deben ser atendidos para conseguir un diseo adecuado que
fomente la reu6lizacin, tolerancia a fallos y extensibilidad del producto

5 reglas de diseo
III. Pocas interfaces
Cada abstraccin de datos debe disearse para que requiera
conectarse con el mnimo posible de otras abstracciones del
dominio. Esto man6ene el acoplamiento bajo
IV. Interfaces pequeas
Si dos abstracciones de datos deben comunicarse, dicha
comunicacin debe realizarse garan6zando que la can6dad de
informacin que intercambien sea la mnima posible

L
A

J
x, y

V. Interfaces explcitas
Si dos abstracciones de datos deben intercambiar cierta
informacin para funcionar, este hecho debe quedar reejado
expresamente a par6r de un mensaje de comunicacin explcito

L
escribir

1 - 36

x, y

leer

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Introduccin
Tipos abstractos de datos

Diseo de 8pos abstractos de datos


La construccin de so@ware centrada en abstracciones de datos se rige por 5 criterios, 5
reglas y 5 principios que deben ser atendidos para conseguir un diseo adecuado que
fomente la reu6lizacin, tolerancia a fallos y extensibilidad del producto

5 principios de diseo
I. Unidades modulares lings8cas
La construccin de 6pos abstractos de datos se realiza mediante
los elementos propios del lenguaje de programacin, asociando
cada abstraccin al elemento adecuado
II. Auto-documentacin
Toda la documentacin de una determinada abstraccin de datos
debe estar contenida dentro del propio cdigo fuente de la misma
para que pueda ser mantenida fcilmente

Clase java Biblioteca C Uso Pascal

A

/* ...*/

III. Acceso uniforme


Todas las capacidades ofrecidas por una abstraccin de datos
deberan estar accesibles a travs de una notacin uniforme
independientemente de si se trata de si se trata de valores
almacenados o calculados
1 - 37

User
+ name
- birth
+ int getAge ()

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Introduccin
Tipos abstractos de datos

Diseo de 8pos abstractos de datos


La construccin de so@ware centrada en abstracciones de datos se rige por 5 criterios, 5
reglas y 5 principios que deben ser atendidos para conseguir un diseo adecuado que
fomente la reu6lizacin, tolerancia a fallos y extensibilidad del producto

5 principios de diseo
IV. Abierto - Cerrado
El diseo de abstracciones de datos debe realizarse de manera
que sea a la vez abierto y cerrado. Una abstraccin se considera
cerrada si presenta todas las capacidades funcionales necesarias
para ser u6lizadas por otras abstracciones. Se considera abierto si
ste puede ser extendido sin necesidad de recompilar toda la
solucin

V. Eleccin nica

getAll ()

En toda arquitectura si existen varias abstracciones de datos


alterna6vas que se pueden escoger para ar6cular una funcin en
6empo de ejecucin debe haber una abstraccin encargada de
ges6onar todas ellas a la que se pueda consultar

1 - 38

M
{A, B}

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Introduccin
Tipos abstractos de datos

Implementacin de 8pos abstractos de datos


La implementacin de 6pos abstractos de datos debe realizarse cuidadosamente para que
responda a los criterios de diseos anteriores y alcance altos niveles de reu6lizacin y
extensibilidad. En este sen6do cabe destacar 3 principios de implementacin
fundamentales

3 principios de implementacin
I. Separacin entre perl e implementacin
La implementacin de una abstraccin de datos debe realizarse de manera que se
separe en artefactos computacionales diferentes: por una parte el perl del 6po y por
otra su implementacin subyacente. Esto permite que una misma abstraccin de datos
pueda disponer simultneamente de varias implementaciones diferentes
A. Separacin por clase
abstracta

Interfaz

Base

1 - 39

B. Separacin por
interfaz

C. Separacin por interfaz y


clase abstracta
Base

Interfaz

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Introduccin
Tipos abstractos de datos

Implementacin de 8pos abstractos de datos


La implementacin de 6pos abstractos de datos debe realizarse cuidadosamente para que
responda a los criterios de diseos anteriores y alcance altos niveles de reu6lizacin y
extensibilidad. En este sen6do cabe destacar 3 principios de implementacin
fundamentales

3 principios de implementacin
II. Delegacin por sobrecarga
En los mtodos sobrecargados siempre
d e b e i n t e n t a r s e h a c e r u n a n i c a
implementacin completa e intentar
delegar las dems versiones en la primera.
De esta manera la semn6ca se ve
centralizada en un mismo mtodo. La
delegacin puede ser a otro mtodo de la
misma clase o a un mtodo de alguna clase
padre, tanto en constructoras como
cualquier otro 6po de operaciones

1 - 40

Stack <T>

+ Stack (int capacity) {
super ();
this.capacity = capacity;
}

+ Stack () {
this (100);
}

+ void push (T e) { ... }

+ void pushAll (List l) {
Iterator lIt = l.iterator ();
while (l.hasNext ()) {
T e = (T) l.next();
this.push (e);
}
}

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Introduccin
Tipos abstractos de datos

Implementacin de 8pos abstractos de datos


La implementacin de 6pos abstractos de datos debe realizarse cuidadosamente para que
responda a los criterios de diseos anteriores y alcance altos niveles de reu6lizacin y
extensibilidad. En este sen6do cabe destacar 3 principios de implementacin
fundamentales

3 principios de implementacin
III. Implementacin completa
La implementacin completa de un 6po en
no termina con la implementacin de cada
una de las operaciones del mismo sino que
debe incluir 3 operaciones cannicas para
su clasicacin, comparacin y trazado.
Estas operaciones en java son cannicas ya
que heredan de la clase padre (Object) y se
trata de hashcode () , equals () y toString ()

1 - 41

Stack <T>
-List elements
-
int capacity

hashcode () {
return 67 * elements.hashcode () +
capacity;
}

boolean equals (Object o) {
if (!(o instanceof Stack)) return false;
else {
s = (Stack) o;
return s.elements.equals (elements) &&
s.capacity == capacity;
}

String toString () {
return elements.toString ();
}

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Introduccin
Tipos abstractos de datos

Catlogo de 8pos abstractos de datos


Las abstracciones de datos que se pueden construir dependen, en general, de la naturaleza
del dominio del problema. No obstante, existen una coleccin de 6pos abstractos de datos
que aparecen recurrentemente en dis6ntas formas, algunas de las cuales sern objeto de
estudio en este curso.

Tipos de abstracciones de datos


Tipos abstractos de datos
Estructuras
sin orden

Estructura
s lineales

Estructuras
circulares

Estructuras
jerarquas

Estructuras
indexadas

Estructuras
tabulares

Conjuntos

Bolsas

Pilas

Listas

Listas doblemente enlazadas

Colas

Colas de prioridad

Listas circulares

Enumeracin

rboles

Mon`culos

Grafos

Matrices

Matrices dispersas

Tablas de dispersin

Diccionarios

1 - 42

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Introduccin
Bibliograda

Bibliograaa
Bibliografa bsica

1 - 43

Bibliografa complementaria

Estructuras de datos en java. Weiss, Mark

Construccin de software orientado a objetos.

Allen. Pearson Addison Wesley. ISBN

Meyer, B. Prentice Hall Espaa. 1998. ISBN

9788478290352

978-84-8322-040-5

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Estrategias de programacin y estructuras de datos


Grado en Ingeniera Inform8ca
Grado en Tecnologas de la Informacin

Departamento de Lenguajes y Sistemas inform6cos

Estrategias de
programacin

Algoritmos iteraDvos y recursivos

Javier Vlez Reyes Jos Ignacio Mayorga Toledano


jvelez@lsi.uned.es
nmayorga@lsi.uned.es
Departamento de Lenguajes Y Sistemas InformDcos
UNED

Estrategias de programacin
ndice

ndice

Introduccin

Diseo de algoritmos recursivos

2-2

Qu son los algoritmos recursivos?

Diseo de algoritmos recursivos

Ejemplos de algoritmos recursivos

Diseo de algoritmos iterativos

Qu son los algoritmos iterativos?

Diseo de algoritmos iterativos

Ejemplos de algoritmos iterativos

Traduccin de algoritmos recursivos a iterativos

Catlogo de algoritmos

Bibliografa

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Estrategias de programacin
Obje6vos generales

Obje8vos

2-3

Entender las principales caractersticas del diseo recursivo

Entender las ventajas y desventajas del diseo recursivo

Aprender a disear algoritmos recursivos

Advertir su importancia en el contexto de las abstracciones de datos

Entender las principales caractersticas del diseo iterativo

Entender las ventajas y desventajas del diseo iterativo

Aprender a disear algoritmos iterativos

Advertir su importancia en el contexto de las abstracciones de datos

Aprender a transformar algoritmos recursivos en iterativos

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Estrategias de programacin
Introduccin

Introduccin
Todo algoritmo pretende la realizacin de algn 6po de tarea o clculo. Las ms de las
veces, si dicha tarea no es trivial, esto implica repe6r un conjunto de pasos sencillos un
cierto nmero de veces hasta que se cumpla cierta condicin, que se conoce como
condicin de terminacin. Esencialmente, hay dos formas de disear algoritmos que
desarrollen tareas repe66vas, que veremos en este tema ya que representan estrategias
diferentes para resolver el mismo problema: la recursividad y la iteracin
I. Diseo recursivo de algoritmos

Estrategias de
programacin

El problema se resuelve por el diseo de funciones que recurren sobre si


mismas de forma directa o indirecta. Su construccin se basa en la eleccin
de una familia de casos base, triviales de resolver y una coleccin de casos
recursivos que converjan hacia los casos base y que en suma den cobertura
a todo el espectro de posibles parmetros de entrada
II. Diseo iterativo de algoritmos
El problema se resuelve por aplicacin de sentencias de control de ujo de
programa sobre estructuras de datos que representan la entrada o salida
del mismo. En este caso la llamada a otra funciones dentro de una funcin
se debe a criterios de descomposicin modular y no se aplica recursividad
para resolver el problema

2-4

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Estrategias de programacin
Introduccin

Introduccin
I. Diseo recursivo
Los algoritmos de diseo recursivo permiten resolver un problema
invocando dentro del cuerpo de una funcin directa o
indirectamente nuevamente a la propia funcin sobre un conjunto
de parmetros actuales diferentes. Un diseo adecuado de este 6po
de algoritmos debe garan6zar que la ejecucin de la funcin con unos
parmetros adecuados converja a la solucin de manera que se
garan6ce la nalizacin del mismo
int factorial (int n) {
if (n == 0) return 1;
else return n * factorial (n 1);
}

Diseo iterativo

2-5

Diseo recursivo

Para resolver la funcin


factorial se vuelve a
invocar a la funcin
factorial con valor n 1 y
se devuelve el resultado de
multiplicar el valor devuelto
de esta invocacin por n

Factorial (5) = 5 * factorial (4)


= 5 * 4 * factorial (3)
= 5 * 4 * 3 factorial (2)
= 5 * 4 * 3 * 2 * factorial (1)
= 5 * 4 * 3 * 2 * 1 * factorial (0)
= 5 * 4 * 3 * 2 * 1 * 1
= 120

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Estrategias de programacin
Introduccin

Introduccin
I. Diseo iterativo

Diseo iterativo

Los algoritmos itera6vos son aquellos que se construyen a par6r de


una secuencia ordenada de instrucciones de alto nivel. Un
subconjunto de estas instrucciones permiten alterar el ujo de
ejecucin. En concreto se dis6nguen instrucciones de control de ujo
condicional que seleccionan un camino de ejecucin de entre varios
posibles e itera6vo que repiten la ejecucin de un bloque de
instruccin mientras se sa6sfagan ciertas condiciones ambientales. Un
diseo adecuado de este 6po de algoritmos debe garan6zar la
terminacin del mismo
int factorial (int n) {
int index = 1;
int result = 1;
while (index <= n) {
result = result * index;
index ++;
}
}
Factorial (5)

Diseo recursivo

Para resolver la funcin factorial


se procede iterativamente
acumulando en la variable result
el producto del contador index de
cada iteracin por el resultado
acumulado anterior

index 1 2 3 4 5
result 1 2 6 24 120
2-6

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Estrategias de programacin
Diseo de algoritmos recursivos

Qu son los algoritmos recursivos?


Un algoritmo recursivo es aquel que se invoca a si mismo dentro de su propio cuerpo con
unos parmetros actuales dis6ntos. Estructuralmente cada funcin est formada por una
coleccin de alterna6vas disjuntas llamadas casos con guardas expresadas en trminos de
los parmetros del problema. Los casos base resuelven el problema de forma inmediata
mientras que los otros recurren composi6vamente sobre la funcin

Esquema general de un algoritmo recursivo


Funcin recursiva

Casos
El diseo
requiere la
denicin de
una coleccin
de casos que
den cobertura a
toda entrada
leg6ma de
parmetros

2-7

Tr funcin (Tx x) {

if (esCasoBase1 (x)) return <<resolucin inmediata 1>>
...
Casos base
if (esCasoBaseN (x)) return <<resolucin inmediata N>>

if (esCasoRecursivo1 (x)) return <<resolucin recursiva convergente 1>>
...
if (esCasoRecursivoM (x)) return <<resolucin recursiva convergente M>>

}

Guarda
La guarda del caso reeja las condiciones
ambientales que deben sa6sfacerse para
ejecutar el caso. Estn expresadas en trminos
de los parmetros y deben ser disjuntas entre s

Casos recursivos

Resolucin
La resolucin de un caso indica las acciones que deben
efectuarse para resolver el caso. Si es base la resolucin
es inmediata si es recursiva consiste en la aplicacin de
una composicin de llamadas recursivas

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Estrategias de programacin
Diseo de algoritmos recursivos

Diseo de algoritmos recursivos


Como hemos visto, la tarea de diseo de una funcin recursiva consiste en la denicin de
la coleccin de casos base y casos recursivos que resuelvan sa6sfactoriamente el problema.
A con6nuacin discu6mos el correcto diseo de cada 6po de caso

Diseo de casos base


Un caso base representa el nal de una tarea, ya que no requiere de nuevas llamadas
recursivas para su resolucin debido a su sencillez. Cuando diseamos los casos base de
un algoritmo recursivo debemos asegurarnos de que las guardas de todos ellos son
disjuntas entre s y de que en suma dan cobertura a todas las posibles invocaciones
provenientes de algn caso recursivo
Caso base

Toda invocacin recursiva termina


por aplicacin del nico caso base
con guarda n==0. A veces es
posible balancear los casos de un
diseo recursivo entre los base y
los propiamente recursivos sin
impacto en la solucin. Considere
que otra solucin hubiera sido
denir el caso base con la guarda
n<2

2-8

int factorial (int n) {


if (n == 0) return 1;
else return n * factorial (n 1);
}

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Estrategias de programacin
Diseo de algoritmos recursivos

Diseo de algoritmos recursivos


Como hemos visto, la tarea de diseo de una funcin recursiva consiste en la denicin de
la coleccin de casos base y casos recursivos que resuelvan sa6sfactoriamente el problema.
A con6nuacin discu6mos el correcto diseo de cada 6po de caso

Diseo de casos recursivos


Un caso recursivo consta de tres elementos: una divisin del problema en uno o ms
subproblemas, una invocaciones recursiva para resolver cada uno de estos subproblemas
y una combinacin de los resultados de los subproblemas para obtener, a la vuelta de las
invocaciones recursivas, el resultado del problema original. Este esquema termina si la
divisin del problema converge hacia alguno de los casos base de la funcin

Divisin

Caso recursivo

Aqu el nico caso recursivo es


aquel con guarda implcita n>0. Su
resolucin consiste en una divisin
convergente hacia n==0 debido a
la expresin de divisin del
problema

La funcin de divisin
genera a cada paso de
if (n == 0) return 1;
recursin un subproblema
else return n * factorial (n 1); de tamao una unidad
menor que converge a 0
}
int factorial (int n) {

Recursin

Combinacin

La funcin de combinacin en este caso


que permite resolver el problema a par6r
de los resultados parciales de cada
subproblema es la operacin producto
2-9

La recursin se aplica para


resolver el subproblema de
tamao n-1

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Estrategias de programacin
Diseo de algoritmos recursivos

Diseo de algoritmos recursivos


Como hemos visto, la tarea de diseo de una funcin recursiva consiste en la denicin de
la coleccin de casos base y casos recursivos que resuelvan sa6sfactoriamente el problema.
A con6nuacin discu6mos el correcto diseo de cada 6po de caso

Diseo de casos recursivos


Un caso recursivo consta de tres elementos: una divisin del problema en uno o ms
subproblemas, una invocaciones recursiva para resolver cada uno de ellos y una
combinacin de los resultados de los subproblemas para obtener, a la vuelta de las
invocaciones recursivas, el resultado del problema original.

I. Por la forma de recursin
Recursividad simple

El nmero de invocaciones realizadas


en cada caso recursivo marca un
Recursividad mltiple
criterio de clasicacin
Clasificaciones
de recursividad

II. Por la forma de particin


Particin por substraccin
La forma de dividir el problema en
subproblemas es otro criterio de
Particin por divisin
clasicacin
III. Por la forma de combinacin

Recursividad final

La forma de combinar los resultados


parciales de la resolucin de cada
Recursividad no final
subproblema es el tercer criterio
2 - 10

return n * f (n-1)
return f (n-1) + + f (n-k)
return n * f (n-1)
return f (n/2)
return f (n/2)
return n * f (n-1)

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Estrategias de programacin
Diseo de algoritmos recursivos

Diseo de algoritmos recursivos


Como hemos visto, la tarea de diseo de una funcin recursiva consiste en la denicin de
la coleccin de casos base y casos recursivos que resuelvan sa6sfactoriamente el problema.
A con6nuacin discu6mos el correcto diseo de cada 6po de caso

Diseo de recursividad por inmersin


A veces el diseo de una funcin recursiva se expresa como una invocacin concreta de
una funcin ms general que incluye parmetros adicionales. Esta tcnica, conocida por
el nombre de diseo por inmersin, se aplica por dis6ntas cues6ones que discu6remos a
con6nuacin
La inmersin es una estrategia de diseo mediante la cual
una funcin se expresa como una invocacin particular de
otra funcin ms general con parmetros adiciones

Funcin sumergida

La funcin sumergida
se expresa como una
invocacin concreta de
la funcin inmersora
ms general

2 - 11

int sumaTodos (int v[]) {


return sumaDesde (v, 0);
}

int sumaDesde (int v[], int index) { ... }

Funcin inmersora

L a f u n c i n i n m e r s o r a
sumerge a la original puesto
que, al ser ms general, con
una invocacin par6cular de
sta se da cobertura al
problema

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Estrategias de programacin
Diseo de algoritmos recursivos

Diseo de algoritmos recursivos


Como hemos visto, la tarea de diseo de una funcin recursiva consiste en la denicin de
la coleccin de casos base y casos recursivos que resuelvan sa6sfactoriamente el problema.
A con6nuacin discu6mos el correcto diseo de cada 6po de caso

Diseo de recursividad por inmersin


A veces el diseo de una funcin recursiva se expresa como una invocacin concreta de
una funcin ms general que incluye parmetros adicionales. Esta tcnica, conocida por
el nombre de diseo por inmersin, se aplica por dis6ntas cues6ones que discu6remos a
con6nuacin

Tctica de
inmersin

I. Inmersin de parmetros
La inmersin de parmetros se reere a la
aplicacin de la tcnica de inmersin sobre
los parmetros de entrada de la misma.
Existen 2 6pos dentro de esta categora

I.I. Parmetros de recorrido


Se incluyen parmetros en la funcin de
inmersora que controlan el recorrido de los
elementos de una estructura de datos
I.II. Parmetros acumuladores
Se incluyen parmetros en la funcin de
inmersora que acumulan resultados inter-
medios

II. Inmersin de resultados


La inmersin de resultados consiste en la
aplicacin de la tcnica de la inmersin para
acumular en parmetros el resultado del
problema en llamada recursiva
2 - 12

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Estrategias de programacin
Diseo de algoritmos recursivos

Diseo de algoritmos recursivos


Como hemos visto, la tarea de diseo de una funcin recursiva consiste en la denicin de
la coleccin de casos base y casos recursivos que resuelvan sa6sfactoriamente el problema.
A con6nuacin discu6mos el correcto diseo de cada 6po de caso

Diseo de recursividad por inmersin


A veces el diseo de una funcin recursiva se expresa como una invocacin concreta de
una funcin ms general que incluye parmetros adicionales. Esta tcnica, conocida por
el nombre de diseo por inmersin, se aplica por dis6ntas cues6ones que discu6remos a
con6nuacin
I. Inmersin por diseo
Se aplican tcnicas de inmersin con el objeto de denir
una recursin que de otro modo no sera posible ar6cular

Objetivos de
inmersin

II. Inmersin por eficiencia


Se aplican tcnicas de inmersin con el n de conseguir
una ejecucin ms eciente de la funcin en la resolucin
del problema
III. Inmersin por recursin final
Se aplican tcnicas de inmersin con el nimo de
transformar la recursividad en recursin nal

2 - 13

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Estrategias de programacin
Diseo de algoritmos recursivos

Diseo de algoritmos recursivos


Como hemos visto, la tarea de diseo de una funcin recursiva consiste en la denicin de
la coleccin de casos base y casos recursivos que resuelvan sa6sfactoriamente el problema.
A con6nuacin discu6mos el correcto diseo de cada 6po de caso

Diseo de recursividad por inmersin


A veces el diseo de una funcin recursiva se expresa como una invocacin concreta de
una funcin ms general que incluye parmetros adicionales. Esta tcnica, conocida por
el nombre de diseo por inmersin, se aplica por dis6ntas cues6ones que discu6remos a
con6nuacin
Tctica

Objetivos

Diseo

Eficiencia

R. Final

2 - 14

Recorrido

Acumulacin

Resultados

S e a p l i c a p a r a o b t e n e r
recurrencias con estructuras de
datos est6cas o parmetros
constantes durante la ejecucin

Esta tc6ca de inmersin se aplica


para precalcular y acumular un
valor de entrada de manera que se
ahorre en 6empo o memoria

S e i n c l u y e n p a r m e t r o s d e
acumulacin para evitar tener que
combinar tras la ejecucin de las
recursiones de cada subproblema

-
-

Esta tc6ca de inmersin se aplica


para calcular y u6lizar un resultado
parcial, que viene de una llamada
posterior en la cadena recursiva

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Estrategias de programacin
Diseo de algoritmos recursivos

Diseo de algoritmos recursivos


Como hemos visto, la tarea de diseo de una funcin recursiva consiste en la denicin de
la coleccin de casos base y casos recursivos que resuelvan sa6sfactoriamente el problema.
A con6nuacin discu6mos el correcto diseo de cada 6po de caso

Ejercicios
I. Funcin factorial

II. Serie de fibonacci

Disee una funcin que calcule el


factorial de un nmero. Determine el
6po de recursividad de que se trata
segn las 3 clasicaciones anteriores

IV. Suma de N naturales


Disee una funcin recursiva que
calcule la suma de los n primeros
nmeros naturales. Es recursiva
simple? es nal?

VII. Bsqueda en vector


Disee una funcin recursiva que
busque un elemento dentro de un
vector de enteros. Clasique la
funcin

2 - 15

Cada valor de la serie de bonacci se


ob6ene a par6r de la suma de los dos
anteri ores. Los dos pri meros
elementos de la serie son 1

V. Suma de un vector
Disee una funcin recursiva que
calcule la suma de los n primeros
elementos de un vector de enteros.
Clasique la funcin

VIII. Elementos repetidos


Disee un predicado recursivo que
determine si un vector de enteros
con6ene o no algn elemento
repe6do

III. Potencia de un nmero


Calcule la n-esima potencia de un
nmero mediante el diseo de una
funcin recursiva. Clasique el diseo
con respecto a los criterios anteriores

VI. Producto escalar


Disee una funcin recursiva que
calcule el producto escalar de dos
vectores de enteros. Clasique la
funcin

IX. Mximo comn divisor


Disee una funcin recursiva que
calcule el mximo comn divisior
entre dos enteros por aplicacin del
algoritmo de Euclides

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Estrategias de programacin
Diseo de algoritmos itera6vos

Qu son los algoritmos itera8vos?


En los algoritmos itera6vos los problemas se resuelven mediante la escritura de una
coleccin de instrucciones de propsito especco que se ejecutan de manera secuencial
segn el orden en que se han escrito. Algunas de estas instrucciones permiten alterar el
control secuencial de la ejecucin para ar6cular ujos itera6vos o condicionales de
ejecucin

Esquema general de un algoritmo itera8vo


Inicializacin
int est (T[] v, T e) {
int index = 0;
boolean found = false;

La inicializacin es el paso
preliminar para proceder con el
diseo itera6vo de algoritmos

Iteracin while (!found && index < v.length) {

Los algoritmos itera6vos basan su


funcionamiento en iteraciones de
bloques de cdigo generalmente
aplicadas sobre elementos de
estructuras de datos

found = (v [index] == e);

Bifurcacin

if (!found) index++;

Las instrucciones de control de


ujo condicional permiten ejecutar
sentencias solo bajo determinadas
condiciones ambientales

}
if (found) return index;
else return -1;
}

Secuenciamiento

La caracters6ca esencial del diseo itera6vo radica en el


concepto de secuencia de instrucciones ejecutadas en orden
y en el uso de variables para acumular estados parciales
2 - 16

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Estrategias de programacin
Diseo de algoritmos itera6vos

Diseo de algoritmos itera8vos


El diseo itera6vo u6liza instrucciones que prescriben cmo realizar los clculos o tareas
necesarias para llegar al resultado buscado. Estas instrucciones se ejecutan de acuerdo a
ujos de ejecucin, que pueden ser secuenciales, bifurca6vos e itera6vos. La u6lizacin de
variables y la sentencia de asignacin juegan un papel preponderante

Elementos de los
algoritmos
iterativos

Elementos de un algoritmo itera88vo

2 - 17

I. Sentencias de asignacin
La sentencia de asignacin juegan un papel preponderante en el diseo
itera6vo ya que permite acumular clculos parciales que representan el
estado del algoritmo en ese punto
A. Encadenamiento secuencial
Las instrucciones se encadenan secuencialmente
para que se ejecuten una detrs de otra
II. Sentencias de control de flujo
La ejecucin de instrucciones
puede ar6cularse en secuencia,
bifurca6vamente o en iteracin.
Existen sentencias que permiten
determinar el control de ujo

B. Control de flujo condicional


Las instrucciones se agrupan en dos bloques que
se ejecutan alterna6vamente si se sa6sface una
condicin
C. Control de flujo iterativo
Las instrucciones se agrupan en un bloque que se
ejecuta itera6vamente mientras se sa6sface una
condicin

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Estrategias de programacin
Diseo de algoritmos itera6vos

Diseo de algoritmos itera8vos


El diseo itera6vo u6liza instrucciones que prescriben cmo realizar los clculos o tareas
necesarias para llegar al resultado buscado. Estas instrucciones se ejecutan de acuerdo a
ujos de ejecucin, que pueden ser secuenciales, bifurca6vos e itera6vos. La u6lizacin de
variables y la sentencia de asignacin juegan un papel preponderante

Sentencia de asignacin
En el diseo itera6vo las variables representan almacenes de datos en memoria que
con6enen el valor resultante del cmputo de una expresin. Este valor representa
parcialmente el estado del algoritmo en 6empo de ejecucin en funcin de los
elementos de entrada
Estado

Cada sentencia
supone un cambio
potencial en el
estado de la
mquina. La
asignacin permite
recogerlo
parcialmente en el
valor de la variable

2 - 18

Sentencia;
variable = expresin;
Sentencia;
Expresin y variable

La variable es una referencia


simblica a un especio reservado
en memoria. La expresin una
frmula que permite calcular un
valor en funcin de otras variables
y constantes

Asignacin

A diferencia de cmo ocurre


en algoritmos recursivos las
sentencias de asignacin
permiten apoyarse en
variables para que sean
referidas posteriormente
desde otros puntos del
algoritmo

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Estrategias de programacin
Diseo de algoritmos itera6vos

Diseo de algoritmos itera8vos


El diseo itera6vo u6liza instrucciones que prescriben cmo realizar los clculos o tareas
necesarias para llegar al resultado buscado. Estas instrucciones se ejecutan de acuerdo a
ujos de ejecucin, que pueden ser secuenciales, bifurca6vos e itera6vos. La u6lizacin de
variables y la sentencia de asignacin juegan un papel preponderante

Encadenamiento secuencial
El modelo de ejecucin por defecto es la ejecucin secuencial. Segn ste, las
instrucciones son lanzadas a ejecucin de acuerdo al orden en que aparecen
correla6vamente escritas en el algoritmo
Encadenamiento secuencial

Sentencia;
Sentencia;
Sentencia;

El delimitador de sentencias separa una


sentencia de la siguiente dentro de un bloque
de instrucciones secuencial y puede ser
considerado como el operador que ar6cula el
encadenamiento secuencial

Ejecucin en secuencia

La ejecucin en secuencia se alinea con la idea de que


cada sentencia realiza un paso del algoritmo hacia la
obtencin del resultado nal y con la descomposicin
funcional descendente del paradigma estructurado
2 - 19

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Estrategias de programacin
Diseo de algoritmos itera6vos

Diseo de algoritmos itera8vos


El diseo itera6vo u6liza instrucciones que prescriben cmo realizar los clculos o tareas
necesarias para llegar al resultado buscado. Estas instrucciones se ejecutan de acuerdo a
ujos de ejecucin, que pueden ser secuenciales, bifurca6vos e itera6vos. La u6lizacin de
variables y la sentencia de asignacin juegan un papel preponderante

Control de ujo condicional


Las sentencias de control de ujo condicional alteran la ejecucin normal secuencial
de un algoritmo para generar dis6ntas bifurcaciones ejecutables en funcin de ciertas
condiciones ambientales
switch (expresin) {
if (expresin-lgica ) {

case cte-1: <<bloque-sentencias>> break;

<< bloque-sentencias>>

case cte-2: <<bloque-sentencias>> break;

} else {

...

<< bloque-sentencias>>

default: <<bloque-sentencias>>

If Then Else

Se evala la expresin lgica. Si el resultado es


cierto se ejecuta el primer bloque de sentencias.
Si es falso se ejecuta el segundo bloque de
sentencias
2 - 20

Switch - Case

Se evala la expresin. Si coincide con la


constante del caso i se ejecuta el bloque de
sentencias adjunto. Si no se ajusta a ningn caso
se ejecuta el bloque de sentencias default

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Estrategias de programacin
Diseo de algoritmos itera6vos

Diseo de algoritmos itera8vos


El diseo itera6vo u6liza instrucciones que prescriben cmo realizar los clculos o tareas
necesarias para llegar al resultado buscado. Estas instrucciones se ejecutan de acuerdo a
ujos de ejecucin, que pueden ser secuenciales, bifurca6vos e itera6vos. La u6lizacin de
variables y la sentencia de asignacin juegan un papel preponderante

Control de ujo itera8vo


Las sentencias de control de ujo itera6vo alteran la ejecucin normal secuencial de
un algoritmo para generar dis6ntas iteraciones sobre un cuerpo de sentencias. El
nmero de iteraciones depende de condiciones ambientales
for (asignacin-ndice;

<<inicializacin>>

<<inicializacin>>

expresin-lmite;

while (expresin-lgica ) {

do {

expresin-incremento) {

<< bloque-sentencias>>

<< bloque-sentencias>>

<< bloque-sentencias>>

<< incremento>>

<< incremento>>

} while (expresin-lgica );

For

While

Iteracin de bloque de sentencias


controlada por ndice. El valor
inicial se indica en asignacin-
ndice, el incremento en expresin-
incremento y termina cuando
expresin-lmite se hace falso
2 - 21

Iteracin de bloque se sentencias


mientras expresin-lgica sea
cierta. Inicializacin externa al
b u c l e . I n c r e m e n t o e x p l c i t o
\picamente al nal del bloque de
sentencias

Do - While

Iteracin de bloque de sentencias.


Inicializacin exterior. Incremento
\picamente al nal del bloque.
Comprobacin lgica al nal de
cada iteracin. Una ejecucin al
menos

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Estrategias de programacin
Diseo de algoritmos itera6vos

Diseo de algoritmos itera8vos


El diseo itera6vo u6liza instrucciones que prescriben cmo realizar los clculos o tareas
necesarias para llegar al resultado buscado. Estas instrucciones se ejecutan de acuerdo a
ujos de ejecucin, que pueden ser secuenciales, bifurca6vos e itera6vos. La u6lizacin de
variables y la sentencia de asignacin juegan un papel preponderante

Ejercicios
Encuentre una solucin itera6va para
cada uno de los problemas que se
presentaron con anterioridad
I.

Funcin factorial

public int sumaV (int[] v) {

II. Serie de fibonacci

int j = 0;

III. Potencia de un nmero

int s = 0;

IV. Suma de N naturales

while (j < v.length) {

V. Suma de un vector
VI. Producto escalar

2 - 22

// Pre: -1 < j <= length

s = s + v[j];
j++;
}

VII. Bsqueda en vector

return s;

VIII.Elementos repetidos

IX. Mximo comn divisor

// Post: s = v[i]

length
i=0

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Estrategias de programacin
Traduccin de algoritmos recursivos a itera6vos

Traduccin de algoritmos recursivos a


itera8vos

Los algoritmos
recursivos aunque elegantes y ecaces han presentado problemas histricos

de computabilidad ya que el soporte por parte de los compiladores a la invocacin recursiva


de programas es rela6vamente reciente. Merece la pena discu6r procedimientos de
transformacin de algoritmos recursivos a itera6vos

Traduccin de algoritmos con recursividad nal


public int sumaV (int[] v, int j, int w) {

public int sumaVit (int [n] v) {

if (j >= n) return w

int j = 0;

else return sumaV (v, j+1, v[j] + w)


}

int w = 0;

Los parmetros de entrada se subs6tuyen por


variables locales con el valor que recibiran en la
llamada inicial (j). El parmetro acumulador (w)
juega el papel del resultado parcial inicialmente 0.

while (j < n) {
w = w + v[j];
j = j + 1;
}

Dentro del bucle se calcula el valor,


en cada paso, de las variables de
resultado parcial w y de recorrido j

return w;
}

2 - 23

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Estrategias de programacin
Traduccin de algoritmos recursivos a itera6vos

Traduccin de algoritmos recursivos a


itera8vos

Los algoritmos
recursivos aunque elegantes y ecaces han presentado problemas histricos

de computabilidad ya que el soporte por parte de los compiladores a la invocacin recursiva


de programas es rela6vamente reciente. Merece la pena discu6r procedimientos de
transformacin de algoritmos recursivos a itera6vos

Traduccin de algoritmos con recursividad no nal


public int factorial( int n ) {
if (n == 0) return 1;
else return n * factorial ( n - 1 );
}

public int factIt (int n) {


int i = n;
while (i > 0) {
i = i - 1
}
int r = 1;
while (i < n) {
r = r * i;
i++;
}
return r
}

2 - 24

Buscar en i el nal de la cadena de llamadas


descendente. Se aplica en cada vuelta el sucesor
de los parmetros (n-1) hasta encontrar el
equivalente al tamao del caso trivial (0).
Se usa r para acumular el resultado. Se inicializa
al resultado del caso base. Se usa la variable i
como objeto de comparacin del segundo
bucle. Se computa el resultado parcial aplicando
la funcin de combinacin (*) por el valor del
parmetro. Al nal se devuelve el resultado

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Estrategias de programacin
Traduccin de algoritmos recursivos a itera6vos

Traduccin de algoritmos recursivos a


itera8vos

Los algoritmos
recursivos aunque elegantes y ecaces han presentado problemas histricos

de computabilidad ya que el soporte por parte de los compiladores a la invocacin recursiva


de programas es rela6vamente reciente. Merece la pena discu6r procedimientos de
transformacin de algoritmos recursivos a itera6vos

Traduccin de algoritmos mediante el uso de una pila


int invertir (int n, int r) {

int invertirIt (int n) {

if (n == 0) return r;

int j = n;

return invertir ((n / 10), r * 10 + n % 10); Stack <int> p=new Stack <int>();
}

Inicializacin de j como
variable local que
representa el valor inicial
del parmetro y de p como
pila vaca de trabajo

while (j > 10) {


p.push (j);
n = n / 10;

Apilamos el valor en curso de j para


recuperarlo a la vuelta y calculamos el
sucesos (n/10)

}
int k = j;

Hemos terminado la cadena descendente de


llamadas. Ahora preparamos la cadena
ascendente de vuelta. k llevar el resultado,
que parte del valor de j cuando termina el
bucle de ida

while (!p.isEmpty ()) {


j = p.top();
p.pop();
k = k + (j % 10);
}
return k }

2 - 25

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Estrategias de programacin
Catlogo de algoritmos

Catlogo de algoritmos
Aunque encontrar un catlogo de algoritmos cannicos y recurrentes es complejo dado su
gran diversidad, si relacionamos el diseo de algoritmos con los principales 6pos abstractos
de datos que se presentaron en el tema anterior, es posible encontrar 3 categoras
generales en la que stos caen principalmente de acuerdo a su propsito
I. Algoritmos de recorrido
El propsito de los algoritmos de recorrido es encontrar una expresin lineal de
los elementos almacenados en la estructura de datos. Dependiendo de sta
puede haber varias estrategias de recorrido alterna6vas. El resultado es una
coleccin ordenada de los elementos de la estructura
Catlogo de
algoritmos

2 - 26

II. Algoritmos de bsqueda


El propsito de los algoritmos de bsqueda es encontrar una elemento de entre
todos los elementos almacenados en la estructura de datos. Dependiendo de
sta existen dis6ntas estrategias con complejidad viceversa. El resultado es un
valor de verdad indicado si se encuentra el elemento o un ndice de posicin
III. Algoritmos de ordenacin
El propsito de los algoritmos de ordenacin es reorganizar los elementos de la
estructura de datos para disponerlos de acuerdo a cierto criterio de orden.
Para poder ar6cular una ordenacin sobre una estructura de datos los
elementos deben ser comparables y la estructura prestarse al criterio de orden

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Estrategias de programacin
Catlogo de algoritmos

Catlogo de algoritmos
La naturaleza itera6va o recursiva de los algoritmos quede frecuentemente inducida por la
forma en que el perl de las operaciones da acceso a los datos. A lo largo de este curso
repasaremos los principales 6pos de algoritmos recorrido, bsqueda y ordenacin
aplicables sobre cada uno de los 6pos abstractos de datos que estudiaremos
Recorrido

Bsqueda

Ordenacin

Listas*

Recorrido directo
Recorrido inverso


Bsqueda secuencial

Insercin
Merge sort

Pilas


Recorrido desde la cima


Bsqueda secuencial

Colas


Recorrido hacia el nal


Bsqueda secuencial

Arboles

Preorden, inorden,
postorden
Recorrido en anchura


Bsqueda binaria


Ordenacin

* Se reere a listas, listas doblemente


enlazadas y listas circulares

2 - 27

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Estrategias de programacin
Bibliograha

BibliograOa
Bibliografa bsica
Estructuras de datos en java. Weiss, Mark
Allen. Pearson Addison Wesley. ISBN
9788478290352

2 - 28

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Estrategias de programacin
Bibliograha

BibliograOa
Bibliografa complementaria
Programacin metdica. BALCZAR, J. L.
McGraw-Hill, 1993. ISBN 8448119576

2 - 29

Diseo de programas. Formalismo y


abstraccin. Ricardo Pea Mar. Pearson Prentice Hall. ISBN 13: 9788420541914

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Estrategias de programacin y estructuras de datos


Grado en Ingeniera Inform8ca
Grado en Tecnologas de la Informacin

Departamento de Lenguajes y Sistemas inform6cos

Anlisis de la eciencia
de los algoritmos
Coste asintDco temporal

Javier Vlez Reyes Jos Ignacio Mayorga Toledano


jvelez@lsi.uned.es
nmayorga@lsi.uned.es
Departamento de Lenguajes Y Sistemas InformDcos
UNED

Anlisis de la eciencia de los algoritmos


ndice

ndice

3-2

Introduccin

Qu es la eficiencia de los algoritmos?

Criterios de clasificacin del anlisis de la eficiencia

Mtricas de anlisis de la eficiencia de los algoritmos

Medida de la eficiencia de los algoritmos

Cmo se mide la eficiencia de los algoritmos?

Medida asinttica de la eficiencia

rdenes de complejidad

Bibliografa

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Anlisis de la eciencia de los algoritmos


Obje6vos generales

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 mtricas de medida de la eficiencia

Aprender cmo se puede calcular el coste de un algoritmo bajo 3 supuestos

3-3

Medida del tiempo de ejecucin

Medida asinttica O

Hiptesis de caso peor

Aprender cmo se mide la eficiencia algortmica de

Algoritmos recursivos

Algoritmos iterativos

Adquirir una visin crtica sobre la complejidad algortmica

Adquirir herramientas para seleccionar el mejor algoritmo para un problema

Adquirir herramientas para seleccionar la estructura ms eficiente para un problema

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Anlisis de la eciencia de los algoritmos


Introduccin

Qu es la eciencia de los algoritmos?


El anlisis de la eciencia de los algoritmos permite establecer criterios compara6vos y
clasicatorios entre algoritmos que ayudan a entender cmo se comportan y escalan stos
en cuanto a la consumicin de recursos 6empo y memoria fundamentalmente con
respecto a la magnitud de sus parmetros de entrada

Denicin
El anlisis de la eciencia de los algoritmos es un estudio terico, formal, compara6vo e
independiente de la implementacin que 6ene por objeto clasicar a los algoritmos en
familias de complejidad de acuerdo a cmo se comportan segn crece la magnitud de
sus parmetros de entrada

Estudio terico

3-4

Independencia

Estudio formal

De recursos de mquina

Terico

Del lenguaje de programacin

Comparativo

De aspectos constantes

Clasificatorio

De aspectos de escala

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Anlisis de la eciencia de los algoritmos


Introduccin

Qu es la eciencia de los algoritmos?


El anlisis de la eciencia de los algoritmos permite establecer criterios compara6vos y
clasicatorios entre algoritmos que ayudan a entender cmo se comportan y escalan stos
en cuanto a la consumicin de recursos 6empo y memoria fundamentalmente con
respecto a la magnitud de sus parmetros de entrada
boolean repetidos (T[] v) {
boolean ordenar (T[] v) {

boolean repetidos = false;

int temp;

int i = 0;

for (int i = 1; i < v.length; i++)

while (!repetidos && i < v.length)

for (int k = v.length - 1; k >= i; k--)

repetidos = contiene (v, i+1, v[i]);

if (v[k] < v[k-1]) {

return repetidos;

temp = v[k];

v[k] = v[k-1];
v[k-1]= temp;

boolean contiene (T[] v, int p, T e) {

int i = p;

boolean found = false

tiempo

<

while (!found && i <= v.length) {


found = (v[i] == e);
i = i + 1;
}
return found; }

3-5

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Anlisis de la eciencia de los algoritmos


Introduccin

Qu es la eciencia de los algoritmos?


El anlisis de la eciencia de los algoritmos permite establecer criterios compara6vos y
clasicatorios entre algoritmos que ayudan a entender cmo se comportan y escalan stos
en cuanto a la consumicin de recursos 6empo y memoria fundamentalmente con
respecto a la magnitud de sus parmetros de entrada

Criterios de medida de la eciencia

Criterios de medida

La eficiencia de los algoritmos puede medirse


de acuerdo a la consumicin de diferentes
recursos. La medida de la eficiencia de un
algoritmo puede ser distinta segn el recurso

II. Segn el tipo de comportamiento


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

II. Segn la mtrica utilizada


Fijado un tipo de recurso y un determinado
supuesto, debe escogerse una mtrica
comparativa que permita clasificar a los
algoritmos en familias con un comportamiento
interno similar

3-6

Espacial
Se analiza la relacin funcional existente entre
el tamao del problema expresado en trminos
de sus parmetros de entrada y la consumicin
del recurso memoria

Temporal
Se analiza la relacin funcional existente entre
el tamao del problema expresado en trminos
de sus parmetros de entrada y la consumicin
del recurso tiempo de cmputo

I. Segn el tipo de recurso

Foco de
atencin

Otros
Se analiza la relacin funcional existente entre
el tamao del problema expresado en trminos
de sus parmetros de entrada y la consumicin
de otros recursos como perifricos empleados,
ancho de banda, consumo elctrico, etc.

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Anlisis de la eciencia de los algoritmos


Introduccin

Qu es la eciencia de los algoritmos?


El anlisis de la eciencia de los algoritmos permite establecer criterios compara6vos y
clasicatorios entre algoritmos que ayudan a entender cmo se comportan y escalan stos
en cuanto a la consumicin de recursos 6empo y memoria fundamentalmente con
respecto a la magnitud de sus parmetros de entrada

Criterios de medida de la eciencia

Criterios de medida

La eficiencia de los algoritmos puede medirse


de acuerdo a la consumicin de diferentes
recursos. El tipo de recurso establece una
particin del espacio de algoritmos distinta

II. Segn el tipo de comportamiento


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

II. Segn la mtrica utilizada


Fijado un tipo de recurso y un determinado
supuesto, debe escogerse una mtrica
comparativa que permita clasificar a los
algoritmos en familias con un comportamiento
interno similar

3-7

Peor caso
Se estima la mxima cantidad de recursos que
un algoritmo puede necesitar consumir para su
ejecucin en funcin de su entrada. Supone
una cota superior de estos recursos

I. Segn el tipo de recurso

Foco de
atencin

Caso medio
Se estima el comportamiento a partir de una
hiptesis sobre la distribucin estadstica de los
datos de entrada que se supone ms probable.
Tambin llamado anlisis probabilstico

Mejor caso
Se estiman los recursos necesarios para su
ejecucin en condiciones ptimas en funcin de
la entrada. Esta medida afecta al ejemplar ms
sencillo del problema

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Anlisis de la eciencia de los algoritmos


Introduccin

Qu es la eciencia de los algoritmos?


El anlisis de la eciencia de los algoritmos permite establecer criterios compara6vos y
clasicatorios entre algoritmos que ayudan a entender cmo se comportan y escalan stos
en cuanto a la consumicin de recursos 6empo y memoria fundamentalmente con
respecto a la magnitud de sus parmetros de entrada

Criterios de medida de la eciencia

Criterios de medida

La eficiencia de los algoritmos puede medirse


de acuerdo a la consumicin de diferentes
recursos. El tipo de recurso establece una
particin del espacio de algoritmos distinta

II. Segn el tipo de comportamiento


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

II. Segn la mtrica utilizada


Fijado un tipo de recurso y un determinado
supuesto, debe escogerse una mtrica
comparativa que permita clasificar a los
algoritmos en familias con un comportamiento
interno similar

3-8

Cota superior. O
Se mide el coste asinttico de la ejecucin de
un algoritmo de acuerdo a una cota superior. Es
decir, la ejecucin nunca, a partir de cierto
valor, sobrepasar la cota de coste establecida

I. Segn el tipo de recurso

Foco de
atencin

Cota inferior.
Se mide el coste asinttico de la ejecucin de
un algoritmo de acuerdo a una cota inferior. Es
decir, la ejecucin nunca, a partir de cierto
valor, ser menor que la cota establecida

Cota exacta.
Se mide el coste asinttico de la ejecucin de
un algoritmo de acuerdo a una cota resultante
de la interseccin entre O y . Es decir, la
ejecucin crece al ritmo de la cota establecida

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Anlisis de la eciencia de los algoritmos


Introduccin

Qu es la eciencia de los algoritmos?


El anlisis de la eciencia de los algoritmos permite establecer criterios compara6vos y
clasicatorios entre algoritmos que ayudan a entender cmo se comportan y escalan stos
en cuanto a la consumicin de recursos 6empo y memoria fundamentalmente con
respecto a la magnitud de sus parmetros de entrada

Mtricas de anlisis de la eciencia de los algoritmos

Cota superior. O

Cota inferior.

Si g(n) es la funcin 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 rpido que
f(n). Es decir, la grfica de g est por
debajo de la de f

3-9

Si g(n) es la funcin de coste de un


algoritmo, se dice que g(n) est en
(f(n)) si a partir de un cierto punto
crece ms rpido que f(n). Es decir,
la grfica de g est por encima de la
de f)

Cota exacta.
Si g(n) es la funcin 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)

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Anlisis de la eciencia de los algoritmos


Medida de la eciencia de los algoritmos

Cmo se mide la eciencia de los algoritmos?


La medida de la eciencia asint6ca de algoritmos pretende clasicar cada algoritmo en
una familia de complejidad asint6ca determinada prescindiendo de consideraciones
constantes o de escala. En nuestro estudio u6lizaremos medida temporal, caso peor y cota
superior

Medida asint8ca de la eciencia


Si hacemos medidas expe-
rimentales sobre sucesivas
ejecuciones de un algorit-
mo y en cada ejecucin
duplicamos el tamao del
problema, observamos que
el 6empo de ejecucin
tambin se duplica. En ese
caso se puede decir que el
c o s t e a s i n t 6 c o d e l
algoritmo es lineal

Bsqueda de un elemento en un vector


Tamao

Tiempo medido

Tiempo de ejecucin

A * n + B

2n

A * 2n + B

2t

3n

A * 3n + B

3t

...

...

...

kn

A * kn + B

kt

O (n)

El tamao del problema es proporcional al nmero de elementos que


contiene el vector. Sin embargo el tiempo de ejecucin no se ve
afectado por constantes multiplicativas o sumativas ya que el coste
temporal se duplica al duplicar el tamao del problema

3 - 10

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Anlisis de la eciencia de los algoritmos


Medida de la eciencia de los algoritmos

Cmo se mide la eciencia de la algoritmos?


La medida de la eciencia asint6ca de algoritmos pretende clasicar cada algoritmo en
una familia de complejidad asint6ca determinada prescindiendo de consideraciones
constantes o de escala. En nuestro estudio u6lizaremos medida temporal, caso peor y cota
superior

Ordenes de eciencia
El anlisis asint6co nos permite
clasicar el espacio de algoritmos en
dis6ntas familias que se corresponden
con rdenes de complejidad diferentes
int factorial (int n) {
if (n == 0) return 1;
else return n * factorial (n - 1);
}

Hiperexponencial. O (nn)

Factorial. O (n!)
Exponencial de grado k. O (kn)
...
Exponencial. O (2n)
Polinmica de grado k. O (nk)
...
Cbica. O (n3)
Cuadrtica. O (n2)
Cuasilineal. O (n log n)
Lineal. O (n)
Cuadrtica inversa. O (n)
Logartmica. O (log n)
Constante. O (1)

3 - 11

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Anlisis de la eciencia de los algoritmos


Medida de la eciencia de los algoritmos

Cmo se mide la eciencia de la algoritmos?


La medida de la eciencia asint6ca de algoritmos pretende clasicar cada algoritmo en
una familia de complejidad asint6ca determinada prescindiendo de consideraciones
constantes o de escala. En nuestro estudio u6lizaremos medida temporal, caso peor y cota
superior

Ordenes de eciencia
C a d a o r d e n d e e c i e n c i a
representa un nivel de crecimiento
con respecto al tamao del
problema. En la grca adjunta
p u e d e v e r s e l a r e l a c i n
compara6va de los niveles de
crecimiento de los primeros
rdenes de eciencia anteriores

3 - 12

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Anlisis de la eciencia de los algoritmos


Medida de la eciencia de los algoritmos

Cmo se mide la eciencia de la algoritmos?


La medida de la eciencia asint6ca de algoritmos pretende clasicar cada algoritmo en
una familia de complejidad asint6ca determinada prescindiendo de consideraciones
constantes o de escala. En nuestro estudio u6lizaremos medida temporal, caso peor y cota
superior

Ordenes de eciencia
C a d a o r d e n d e e c i e n c i a
representa un nivel de crecimiento
con respecto al tamao del
problema. En la grca adjunta
p u e d e v e r s e l a r e l a c i n
compara6va de los niveles de
crecimiento de los rdenes de
eciencia siguientes a n2

3 - 13

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Anlisis de la eciencia de los algoritmos


Medida de la eciencia de los algoritmos

Cmo se mide la eciencia de los algoritmos?


La medida de la eciencia asint6ca de algoritmos pretende clasicar cada algoritmo en
una familia de complejidad asint6ca determinada prescindiendo de consideraciones
constantes o de escala. En nuestro estudio u6lizaremos medida temporal, caso peor y cota
superior

Algoritmos recursivos
El clculo del coste temporal de un algoritmo recursivo se expresa en trminos del coste
de los casos base y los casos de recursin del mismo. Para ilustrar cmo se procede
consideremos la funcin del clculo de un nmero factorial en su versin recursiva.
Entonces, si u6lizamos T(n) para representar el coste de computar la ejecucin con
tamao n
C1 si n == 0 Coste caso base

int factorial (int n) {


if (n == 0) return 1;
else return n * factorial (n - 1);

T (n) =
T (n-1) + C2 si n > 0 Coste caso recurrente

}
Resolucin para factorial (5):
T(5) = T(4) + C2 = T(3) + C2 + C2 = T(2) + C2 + C2 + C2 = T(1) + C2 + C2 + C2 + C2
= O (n)

3 - 14

= T(0) + C2 + C2 + C2 + C2 + C2 = C1 + C2 + C2 + C2 + C2 + C2 = C1 + 5 * C2

Dado que el coste temporal


resulta linealmente proporcional al tamao del problema el orden de complejidad
es lineal

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Anlisis de la eciencia de los algoritmos


Medida de la eciencia de los algoritmos

Cmo se mide la eciencia de los algoritmos?


La medida de la eciencia asint6ca de algoritmos pretende clasicar cada algoritmo en
una familia de complejidad asint6ca determinada prescindiendo de consideraciones
constantes o de escala. En nuestro estudio u6lizaremos medida temporal, caso peor y cota
superior

Algoritmos recursivos
Para evitar en cada caso un razonamiento
similar al anterior, podemos derivar una
frmula general de clculo en funcin de la
estructura de la funcin recursiva, solucin
anal6ca de la ecuacin de recurrencias
adjunta

c1nk si n < d
T (n) =
iT(n d) + c2nk si n >= d

i: Nmero mximo de invocaciones recursivas por caso


d: Factor de decrecimiento del problema en la divisin del problema
n < d : Caso base
n >= d : Caso recursivo
c1nk, c2nk : Coste asociados a las partes no recursivas
k : Nivel de dependencia de las operaciones no recursivas con el tamao del problema
0 : Constante
1 : Lineal
2 : Cuadrtica

3 - 15

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Anlisis de la eciencia de los algoritmos


Medida de la eciencia de los algoritmos

Cmo se mide la eciencia de los algoritmos?


La medida de la eciencia asint6ca de algoritmos pretende clasicar cada algoritmo en
una familia de complejidad asint6ca determinada prescindiendo de consideraciones
constantes o de escala. En nuestro estudio u6lizaremos medida temporal, caso peor y cota
superior

Algoritmos recursivos
Para evitar en cada caso un razonamiento
similar al anterior, podemos derivar una
frmula general de clculo en funcin de la
estructura de la funcin recursiva, solucin
anal6ca de la ecuacin de recurrencias
adjunta
Si reduccin por substraccin

O (nk+1) si i == 1

T (n) =
iT(n d) + c2nk si n >= d

Si reduccin por divisin /

O (nk) si i < dk
T (n) = O (nk log n) si i = dk

T (n) =
O (in/d) si i > 1

3 - 16

c1nk si n < d

O (nlogdi) si i > dk

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Anlisis de la eciencia de los algoritmos


Medida de la eciencia de los algoritmos

Cmo se mide la eciencia de los algoritmos?


La medida de la eciencia asint6ca de algoritmos pretende clasicar cada algoritmo en
una familia de complejidad asint6ca determinada prescindiendo de consideraciones
constantes o de escala. En nuestro estudio u6lizaremos medida temporal, caso peor y cota
superior

Algoritmos itera8vos
El coste temporal de un algoritmo itera6vo se calcula acumula6vamente a par6r del coste
de cada una de sus instrucciones cons6tuyentes. Estudiemos su coste
Instruccin

3 - 17

Coste

Instruccin

Coste

Operaciones bsicas1

Sentencias iterativas

- Entrada / salida

O(1)

- for (ini;e;inc) {b}

max {O(ini), n max {O(e), O(inc), O(b)}}

- Asignacin

O(1)

- while (e) {b}

n max {O(e), O(b)}

- Expresiones escalares

O(1)

- do {b} while (e)

n max {O(e), O(b)}

Secuencias sentencias

Invocacin subprogramas

- s1; s2; s3

O(si) = max {O (si)}

- f (e1, e2)

Max {O(e1), O(e2), O(f)}

Sentencias condicionales

Reglas de producto y suma

- if (e) {b1} else {b2}

max {O(e), O(b1), O(b2)}

- O (f + g)

O(f + g) = max (O(f), O(g))

- switch (e) {

max {O(e), O(b1), O(b2)}

- O (f * g)

O(f * g) = O(f) * O(g)

case c1 : b1;

case c2 : b2;

1 Las Operaciones bsicas no

dependen del tamao del problema

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Anlisis de la eciencia de los algoritmos


Medida de la eciencia de los algoritmos

Cmo se mide la eciencia de los algoritmos?


La medida de la eciencia asint6ca de algoritmos pretende clasicar cada algoritmo en
una familia de complejidad asint6ca determinada prescindiendo de consideraciones
constantes o de escala. En nuestro estudio u6lizaremos medida temporal, caso peor y cota
superior

Algoritmos itera8vos
A par6r de los anlisis anteriores de coste
de cada instruccin analicemos la
eciencia de un algoritmo itera6vo
boolean ordenar (T[] v) {
int temp;
for (int i = 1; i < v.length; i++) O(1)
for (int k = 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

3 - 18

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Anlisis de la eciencia de los algoritmos


BibliograWa

BibliograJa
Bibliografa bsica
Estructuras de datos en java. Weiss, Mark
Allen. Pearson Addison Wesley. ISBN
9788478290352

3 - 19

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Anlisis de la eciencia de los algoritmos


BibliograWa

BibliograJa
Bibliografa complementaria
Fundamentos de Algoritmia. G. Brassard, P.
Bratley. Prentice Hall. SBN: 84-89660-00-X
1997

3 - 20

Diseo de programas. Formalismo y


abstraccin. Ricardo Pea Mar. Pearson Prentice Hall. ISBN 13: 9788420541914

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Tipos abstractos de
datos lineales

Grado en Ingeniera Inform8ca . Grado en tecnologas de la


Departamento de Lenguajes y Sistemas informacin
inform6cos

Parte II

Estrategias de programacin y estructuras de datos

Javier Vlez Reyes


Jos Ignacio Mayorga Toledano
jvelez@lsi.uned.es nmayorga@lsi.uned.es
Departamento de Lenguajes Y Sistemas InformDcos
UNED

Estrategias de programacin y estructuras de datos


Grado en Ingeniera Inform8ca
Grado en Tecnologas de la Informacin

Departamento de Lenguajes y Sistemas inform6cos

Tipos abstractos de
datos lineales
Listas

Javier Vlez Reyes Jos Ignacio Mayorga Toledano


jvelez@lsi.uned.es
nmayorga@lsi.uned.es
Departamento de Lenguajes Y Sistemas InformDcos
UNED

Tipos abstractos de datos lineales. Listas


ndice

ndice

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

4-2

Introduccin

Implementacin dinmica

Implementacin esttica

Algoritmos sobre listas

Recorrido de los elementos de una lista

Bsqueda de un elemento sobre una lista

Ordenacin de los elementos de una lista

Ejercicios

Bibliografa

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Tipos abstractos de datos lineales. Listas


Obje6vos generales

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

4-3

En versin esttica (con limitacin explcita de capacidad mxima)

En versin dinmica (sin limitacin explcita de capacidad mxima)

Conocer los principales problemas algortmicos sobre listas

Recorrido de los elementos de una lista

Bsqueda de un elemento sobre una lista

Ordenacin de los elementos de una lista

Practicar el diseo de funciones recursivas sobre listas

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Tipos abstractos de datos lineales. Listas


Introduccin

Tipos abstractos de datos lineales


Los 6pos abstractos de datos lineales representan abstracciones en las que los datos son
organizados de forma secuencial. A con6nuacin se muestran los diferentes TADs que caen
dentro de esta categora y que se diferencian, esencialmente, en la forma en que ofrecen
acceso a sus datos
I. Listas
Tema 4

Tema 5

Tipos abstractos
de datos lineales

El tipo abstracto de datos Lista representa una estructuras de datos


donde los elementos se disponen de forma secuencial y las
operaciones de insercin y extraccin se aplican por el principio,
que puede moverse recursivamente haciendo referencia a otras
sublistas

Tema 6

II. Pilas
El tipo abstracto de dato Pila representa una estructuras de datos
donde los elementos se disponen de forma secuencial y las
operaciones de insercin y extraccin se aplican por el principio
segn la poltica de acceso ltimo en entrar, primero en salir

III. Colas
El tipo abstracto de dato Cola representa una estructuras de datos
donde los elementos se disponen de forma secuencial y las
operaciones de insercin y extraccin se aplican por el final y por el
principio respectivamente de acuerdo a la poltica de primero en
entrar, primero en salir

4-4

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Tipos abstractos de datos lineales. Listas


Introduccin

El 8po abstracto de datos lista


Las listas son abstracciones de datos que organizan una coleccin de elementos de manera
secuencial, donde a cada elemento le sigue un nico elemento siguiente. La denicin del
6po es recursiva lo que condiciona su forma de acceso. Una lista de tamao n se dene
como un primer elemento accesible seguido de una lista de tamao n 1 tambin accesible
Una lista es un 6po abstractos de datos que organiza una coleccin de elementos
de forma secuencial. Su denicin recursiva dis6ngue una cabeza y un resto de
lista ambos accesibles. Las inserciones se realizan por delante de la cabeza
Resto
El resto de elementos son accesibles
a travs de la lista resto que es de
tamao un elemento menor

Primero
Toda lista no vaca
distingue un primer
elemento que
puede ser operado
directamente

2 3 4 5 6 7 8 9

Lista
La definicin de la lista como un par (primero, resto) induce un
acceso recursivo a la misma donde los elementos se acceden por
la cabeza (posicin del primero) y para llegar al elemento i-esimo
hay que recorrer los i-1 elementos anteriores

4-5

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Tipos abstractos de datos lineales. Listas


Interfaz del 6po abstracto de datos Lista

La interfaz del 8po abstracto de datos Lista ListIF <T>


El interfaz de listas que u6lizaremos a lo largo de este
curso, ListIF esta compuesto por las operaciones que
describimos a con6nuacin
Primero y resto

1
1

2 3

Las operaciones primero y restos son los


principales mtodos de acceso recursivo a los
elementos de la lista. Se trata de operaciones
consultoras que no modifican el estado de tipo

Insertar

2 3

La operacin de insercin aade un elemento


delante de la cabeza de la lista. Junto con la
ordenacin, es la nica operacin modificadora

Est llena y est vaca


Los predicados lgicos isEmpty y isFull indican el estado de la lista
en relacin con el nmero de elementos que contiene. isEmpty
devuelve cierto si la lista no contiene elementos. En este caso
getFirst devuelve null y getTail devuelve la propia lista vaca. En
implementaciones con capacidad isFull devuelve cierto si el
numero de elemento ha llegado a la capacidad. En
implementaciones dinmicas siempre devuelve falso

4-6

public interface ListIF<T>


{
/**
* Devuelve la cabeza de una lista.
* @return la cabeza de una lista.
*/
public T getFirst ();

/**
* Devuelve la lista excluyendo la cabeza.
* @return la lista excluyendo la cabeza.
*/
public ListIF<T> getTail ();

/**
* Inserta un nuevo elemento a la lista.
* @param element El elemento a aadir.
* @return la lista incluyendo el elemento.
*/
public ListIF<T> insert (T element);

/**
* Devuelve cierto si la lista esta vacia.
* @return cierto si la lista esta vacia.
*/
public boolean isEmpty ();

/**
* Devuelve cierto si la lista esta llena.
* @return cierto si la lista esta llena.
*/
public boolean isFull();

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Tipos abstractos de datos lineales. Listas


Interfaz del 6po abstracto de datos Lista

La interfaz del 8po abstracto de datos Lista ListIF <T>


El interfaz de listas que u6lizaremos a lo largo de este
curso, ListIF esta compuesto por las operaciones que
describimos a con6nuacin
/**

Longitud * Devuelve el numero de elementos de la lista.

* @return el numero de elementos de la lista.


*/
public int getLength ();


Recorrido /**
* Devuelve un iterador para la lista.
Devuelve un iterador que permite
* @return un iterador para la lista.
lista
recorrer los elementos de la lista en el */
orden en que aparecen. Esta operacin public IteratorIF<T> getIterator ();
no es modificadora del tipo

/**
* Devuelve cierto si la lista contiene el elemento.
Iterador de elementos
Con8ene * @param element El elemento buscado.
* @return cierto si la lista contiene el elemento.
El predicado contiene realiza una bsqueda sobre los elementos */
de la lista para comprobar si cierto dato pasado como parmetro public boolean contains (T element);
est incluido entre ellos

/**
Ordenar * Ordena los elementos de la lista.
* @param element El comparador de elementos.
Ordena los elementos de la lista de * @return la lista ordenada.
antes
a c u e r d o a l c r i t e r i o d e o r d e n */
implementado en el comparador. Es una public ListIF<T> sort (ComparatorIF<T> comparator);
despus
operacin modificadora


}

La longitud de la lista se refiere al nmero de elementos que


sta contiene. Este mtodo junto con los dos anteriores son las
herramientas necesarias para identificar los casos base en la
estructura recursiva

3 1 2

3 1 2
1 2 3

4-7

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Tipos abstractos de datos lineales. Listas


Implementacin del 6po abstracto de datos Lista

Implementacin del 8po abstracto de datos Lista ListIF <T>


Existen varias estrategias para implementar listas que respondan al interfaz ListIF anterior.
En general, stas se dividen en implementaciones dinmicas, que ar6culan listas de
capacidad indenida e implementaciones est6cas, con una capacidad mxima limitada y
establecida como parmetro. Aqu presentamos un ejemplo de cada caso

Implementacin dinmica basada en primero y siguiente


Segn esta estrategia de implementacin, una lista est formada por un atributo que
representa la cabeza y otro que es una referencia a una lista que representa el resto de la
lista. De esta manera una lista es una coleccin encadenada de pares (primero, resto).
Lista

Primero y resto

Ul8mo, elemento fantasma

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

4-8

La lista es una secuencia


de pares (primero, resto)
acabada en un par
fantasma

Aunque en otras implementaciones la cabeza


del ltimo objeto se aprovecha para incluir un
ultimo 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 lista a un nico
caso base isEmpty ()

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Tipos abstractos de datos lineales. Listas


Implementacin del 6po abstracto de datos Lista

Implementacin dinmica basada en primero y siguiente


Segn esta estrategia de implementacin, una lista esta formada por un atributo que
representa la cabeza y otro que es una referencia a una lista que representa el resto de la
lista. De esta manera una lista es una coleccin encadenada de pares (primero, resto).
public class ListDynamic<T> implements ListIF<T> *
{
private T first;
private ListIF<T> tail;

public ListDynamic ()
{
first = null;
tail = null;
}

public ListDynamic (ListIF<T> list)
{
this ();
if (list != null)
if (!list.isEmpty ())
{
first = list.getFirst ();
tail = new ListDynamic<T> (list.getTail ());
}
}

@Override
public T getFirst ()
{
return first;
}

@Override
public ListIF<T> getTail ()
{
if (isEmpty ()) return this;
return tail;
}

@Override
public ListIF<T> insert (T element)
{
if (element != null) {
ListDynamic<T> next = new ListDynamic<T>();
next.first = first;
next.tail = tail;
first = element;
tail = next;
}
return this;
}

@Override
public boolean isEmpty ()
{
return first == null &&
tail == null;
}

@Override
public boolean isFull () {
return false;
* Los comentarios
}

de las cabeceras se
han omitido por cuestiones de espacio

4-9

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Tipos abstractos de datos lineales. Listas


Implementacin del 6po abstracto de datos Lista

Implementacin dinmica basada en primero y siguiente


Segn esta estrategia de implementacin, una lista esta formada por un atributo que
representa la cabeza y otro que es una referencia a una lista que representa el resto de la
lista. De esta manera una lista es una coleccin encadenada de pares (primero, resto).
@Override
public int getLength ()
{
if (isEmpty ()) return 0;
else return 1 + tail.getLength ();
}

@Override
public IteratorIF<T> getIterator ()
{
ListIF<T> handler = new ListDynamic<T> (this);
return new ListIterator<T> (handler);
}

@Override
public boolean contains (T element) {
...
}

@Override
public ListIF<T> sort (ComparatorIF<T> comparator) {
...
}

@Override
public int hashcode () {
return 31 * ((first == null) ? 0 : first.hashCode ())
+ ((tail == null) ? 0 : tail.hashCode ());
}

@Override
public boolean equals (Object o)
{
if (o == this) return true;
if (o == null) return false;

if (!(o instanceof ListDynamic)) return false;
else {
ListDynamic<T> l = (ListDynamic<T>) o;
return l.first.equals (first) &&
l.tail.equals (tail);
}
}

@Override
public String toString ()
{
StringBuffer buff = new StringBuffer ();
buff.append ("ListDynamic - [");

IteratorIF<T> listIt = getIterator ();
while (listIt.hasNext ()) {
T element = listIt.getNext ();
buff.append (element);
if (listIt.hasNext ())
buff.append (", ");
}

buff.append ("]");
return buff.toString ();
}

* Los comentarios de las cabeceras se


han omitido por cuestiones de espacio

4 - 10

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Tipos abstractos de datos lineales. Listas


Implementacin del 6po abstracto de datos Lista

Implementacin del 8po abstracto de datos Lista ListIF <T>


Existen varias estrategias para implementar listas que respondan al interfaz ListIF anterior.
En general, stas se dividen en implementaciones dinmicas, que ar6culan listas de
capacidad innita e implementaciones est6cas, con una capacidad mxima limitada y
establecida como parmetro. Aqu presentamos un ejemplo de cada caso

Implementacin est8ca basada en array


Segn esta estrategia de implementacin, una lista est cons6tuida por un array de
capacidad limitada y especicada mediante parmetro y un ndice que apunta a la
cabeza de la lista. La lista empieza por el nal y crece hacia la primera posicin del array
Basura
El resto de elementos del
array que no pertenecen a la
lista es basura resultado del
trabajo con el tipo

0 0 0 0 3 7 1 2 3 4
Insertar

Las inserciones mueven la


cabeza una posicin hacia atrs
e insertan el elemento. Si
Primero llega a valer 0 la lista
est llena y no se puede insertar

4 - 11

Lista

Capacidad = 10

Primero
Este ndice apunta siempre
al elemento que se
encuentra en cabeza de la
lista. El ndice comienza en
0 y llega hasta capacidad1
para valores de la lista

La lista est formada por los


elementos que van desde la
posicin Primero hasta
Capacidad - 1

Resto
Acceder al resto mueve la cabeza una posicin
hacia delante con lo que sta pasa a ser el
primero del resto. Si Primero llega a valer la
capacidad indica que la lista es vaca. Para que
la operacin no sea modificadora esta
implementacin requiere la copia preliminar de
la estructura.

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Tipos abstractos de datos lineales. Listas


Implementacin del 6po abstracto de datos Lista

Implementacin est8ca basada en array


Segn esta estrategia de implementacin, una lista est cons6tuida por un array de
capacidad limitada y especicada mediante parmetro y un ndice que apunta a la
cabeza de la lista. La lista empieza por el nal y crece hacia la primera posicin del array
public class ListStatic<T> implements ListIF<T> *
{
private Object[] elements;
private int capacity;
private int first;

public ListStatic (int capacity)
{
this.capacity = capacity;
this.first = capacity;
this.elements = new Object[capacity];
}

public ListStatic (ListIF<T> list)
{
if (list != null) {
this.capacity = list.getLength ();
this.first = this.capacity;
this.elements = new Object[this.capacity];

ListIF<T> aList = list;
for (int i = capacity-list.getLength (); i <
capacity ; i++) {
this.elements [i] = aList.getFirst ();
this.first = this.first - 1;
aList = aList.getTail ();
}
}
}

4 - 12

private ListIF<T> copy (ListStatic<T> list) {


ListStatic<T> l = new ListStatic<T> (capacity);
l.first = list.first;
l.elements = list.elements;
return l;
}

public T getFirst () {
if (isEmpty ()) return null;
return (T) elements [first];
}

public ListIF<T> getTail () {
if (!isEmpty ()) {
ListStatic<T> tail = (ListStatic<T>) copy (this);
tail.first = first + 1;
return tail;
}
return this;
}

public ListIF<T> insert (T element) {
if (!isFull ()) {
first = first - 1;
elements [first] = element;
}
return this;
}

* Los comentarios de las cabeceras se


han omitido por cuestiones de espacio

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Tipos abstractos de datos lineales. Listas


Implementacin del 6po abstracto de datos Lista

Implementacin est8ca basada en array


Segn esta estrategia de implementacin, una lista est cons6tuida por un array de
capacidad limitada y especicada mediante parmetro y un ndice que apunta a la
cabeza de la lista. La lista empieza por el nal y crece hacia la primera posicin del array
@Override
public boolean isEmpty ()
{
return first == capacity;
}

@Override
public boolean isFull()
{
return first == 0;
}

@Override
public int getLength ()
{
return capacity - first;
}

@Override
public IteratorIF<T> getIterator ()
{
ListIF<T> handler = new ListStatic<T> (capacity, this);
return new ListIterator<T> (handler);
}

@Override
public boolean contains (T element) { ... }

@Override
public ListIF<T> sort (ComparatorIF<T> comparator) { ... }

4 - 13

@Override
public int hashCode () {
return 31 * 31 * ((elements == null) ? 0 : elements.hashCode ()) +
31 * capacity + first;
}

@SuppressWarnings("unchecked")
@Override
public boolean equals (Object o) {
if (o == this) return true;
if (o == null) return false;
if (o.getClass () != this.getClass ()) return false;
else { ListStatic<T> l = (ListStatic<T>) o;
return l.elements.equals (elements) &&
l.capacity == capacity &&
l.first == first; }
}

@Override
public String toString ()
{
StringBuffer buff = new StringBuffer ();
buff.append ("ListStatic - [");
IteratorIF<T> listIt = getIterator ();
while (listIt.hasNext ()) {
T element = listIt.getNext ();
buff.append (element);
if (listIt.hasNext ())
buff.append (", ");
}
* Los comentarios de las cabeceras se
buff.append ("]");
return buff.toString (); } } han omitido por cuestiones de espacio

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Tipos abstractos de datos lineales. Listas


Algoritmos sobre listas

Algoritmos sobre listas


Estudiaremos 3 6pos de problemas recurrentes sobre la interfaz de listas ListIF: recorrido
de los elementos de una lista, bsqueda de un elemento entre los elementos de una lista y
ordenacin ascendente de los elementos de una lista. La denicin recursiva del 6po
condiciona las estrategias algortmicas que pueden u6lizarse.
I. Recorrido
El recorrido de los elementos de una lista devuelve un iterador que permite
procesarlos secuencialmente segn aparecen almacenados en la estructura.
Como la definicin es recursiva solo el recorrido directo ser estudiado. El
recorrido inverso es fcilmente implementable y se deja como ejercicio

Algoritmos
sobre listas

La bsqueda de un elemento sobre los elementos de una lista se realiza de


forma secuencial dada la definicin recursiva del tipo lo que imprime un coste
lineal al algoritmo. Se estudiar el predicado de contencin dejando como
ejercicio la bsqueda del mnimo y el mximo

III. Ordenacin
La ordenacin de los elementos de una lista, reorganiza sus elementos de
forma que se dispongan ascendentemente de acuerdo a cierto criterio de
comparacin que se recibe como parmetro. En este captulo estudiaremos
dos conocidos mtodos de ordenacin en listas: ordenacin por insercin
(insert sort) y ordenacin por mezcla (merge sort).La ordenacin
descendente es similar y se deja como ejercicio.

4 - 14

Independencia de la
implementacin

II. Bsqueda

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Tipos abstractos de datos lineales. Listas


Algoritmos sobre listas

Recorrido de los elementos de una lista


Antes de pasar a discu6r las estrategias de recorrido de los elementos de una lista debemos
presentar el interfaz IteratorIF. Esta interfaz ser u6lizada a lo largo del curso para ar6cular
el recorrido de los elementos de los diferentes 6pos abstractos de datos que vayamos
estudiando

La Interfaz IteratorIF <T>


public interface IteratorIF<T>
{
/**
* Devuelve el siguiente elemento de la iteracion.
* @return el siguiente elemento de la iteracion.
*/
public T getNext ();

/**
* Indica si hay ms elemento en la iteracin.
* @return true si hay ms elemento en la iteracin
*/
public boolean hasNext ();

/**
* Restablece el iterador para volver al inicio.
*/
public void reset ();
}

4 - 15

getNext ()
Devuelve el siguiente elemento dentro de
la iteracin o null si el iterador alcanz el
final

hasNext ()
Este predicado indica si existen ms
elementos an sin visitar dentro de la
iteracin

reset ()
Este mtodo, incluido por razones de
eficiencia, permite resetear el iterador
para que vuelva al principio sin que sea
necesario construirlo de nuevo

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Tipos abstractos de datos lineales. Listas


Algoritmos sobre listas

Recorrido de los elementos de una lista


Para ar6cular el recorrido secuencial de los elementos de una lista debe implementarse el
interfaz IteratorIF. Las implementaciones de ListIF anteriores construyen una copia de la
lista como manejador para garan6zar que la iteracin no modique el estado del 6po
class ListIterator<T> implements IteratorIF<T>
{
private ListIF<T> handler;
Iteracin con reset
private ListIF<T> restart;
Se mantienen 2 manejadores constantemente,

/**
uno para articular el recorrido de la lista. El otro
* Constructor para ListIterator.
siempre apunta a la cabeza de la lista y se utiliza
* @param handler el manejador de listas.
para implementar la operacin de reset del
*/
public ListIterator (ListIF<T> handler)
iterador
restart
{
this.handler = handler;
this.restart = handler;
}

/**
* Devuelve el siguiente elemento de la iteracion.
* @return el siguiente elemento de la iteracion.
*/
getNext()
@Override
handler
public T getNext ()
Avance
{
T next = handler.getFirst ();
La operacin de avance devuelve el elemento en
handler = handler.getTail ();
cabeza de la lista y actualiza el manejador de
return next;
recorrido para que apunte a la cabeza del resto
}

de la lista. Para invocar esta operacin con

1 2 3 4

seguridad hay que asegurarse de que el


manejador no apunta a la lista vaca

4 - 16

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Tipos abstractos de datos lineales. Listas


Algoritmos sobre listas

Recorrido de los elementos de una lista


Para ar6cular el recorrido secuencial de los elementos de una lista debe implementarse el
interfaz IteratorIF. Las implementaciones de ListIF anteriores construyen una copia de la
lista como manejador para garan6zar que la iteracin no modique el estado del 6po
/**
* Devuelve cierto si existen mas elementos a iterar.
* @return cierto si existen mas elementos a iterar.
*/
@Override
public boolean hasNext ()
{
return !handler.isEmpty ();
}

/**
* Restablece el iterador para volver al inicio.
*/
@Override
public void reset ()
{
handler = restart;
}

@Override
public int hashCode () { ... }

@Override
public boolean equals (Object o) { ... }

@Override
public String toString () {...}
}

Hay siguiente
Para saber si el iterador contiene ms elementos y por
tanto puede volver a invocarse la operacin de avance o
no hay que preguntar si el manejador ha alcanzado el final
de la lista

Reset
Una vez que un iterador ha llegado a su fin slo se puede
construir otro iterador, lo cual es costoso ya que requiere
una nueva copia del tipo, o volverlo a colocar en su
posicin inicial, Gracias a la copia del manejador que
hicimos en el constructor del iterados, esta operacin tiene
un coste constante

restart

1 2 3 4
reset()
handler

4 - 17

handler

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Tipos abstractos de datos lineales. Listas


Algoritmos sobre listas

Bsqueda de un elemento sobre una lista


La bsqueda de un dato sobre los elementos contenidos en una lista es un problema de
recorrido secuencial que termina cuando se encuentra una cabeza que corresponde con el
dato buscado. En este sen6do puede aplicarse un algoritmo recursivo o aprovechar el
iterador anterior para resolverlo itera6vamente mediante bsqueda con cen6nela

Bsqueda itera8va con cen8nela


En la bsqueda con cen6nela se itera sobre
la lista y se u6liza una guarda (cen6nela)
para indicar el momento en que se ha
encontrado el elemento y la bsqueda
puede parar
/**
* Devuelve cierto si la lista contiene el elemento.
* @param element El elemento buscado.
* @return cierto si la lista contiene el elemento.
*/
@Override
public boolean contains (T element)
{
IteratorIF<T> listIt = this.getIterator ();
boolean found = false;
while (!found && listIt.hasNext ()) {
T anElement = listIt.getNext ();
found = anElement.equals (element);
}
return found;
}

4 - 18

Bsqueda recursiva
En la bsqueda recursiva se comprueba si la
cabeza se corresponde con el elemento
buscado. Si es as el algoritmo termina
devolviendo cierto y si no, se recurre sobre
el resto de la lista para buscar el elemento
/**
* Devuelve cierto si la lista contiene el elemento.
* @param element El elemento buscado.
* @return cierto si la lista contiene el elemento.
*/
@Override
public boolean contains (T element)
{
if (isEmpty ()) return false;
return first.equals (element) ||
tail.contains (element);
}

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Tipos abstractos de datos lineales. Listas


Algoritmos sobre listas

Ordenacin de los elementos de una lista


Antes de discu6r los algoritmos de ordenacin debemos presentar dos artefactos que sern
u6lizados a lo largo del curso en la ordenacin de 6pos abstractos de datos. Como los 6pos
son genricos es necesario proporcionar una implementacin del criterio de orden que
debe aplicarse entre dos elementos cualesquiera del mismo 6po

La Interfaz ComparatorIF <T>

4 - 19

/**
* Indica si un elemento es igual que otro.
* @param e1 el primer elemento.
* @param e2 el segundo elemento.
* @return true si un elemento es igual que otro.
*/
public boolean isEqual (T e1, T e2);

/**
* Indica si un elemento es mayor que otro.
* @param e1 el primer elemento.
* @param e2 el segundo elemento.
* @return true si un elemento es mayor que otro.
*/
public boolean isGreater (T e1, T e2);
}

public interface ComparatorIF<T>


{
public static int LESS = -1;
public static int EQUAL = 0;
public static int GREATER = 1;

/**
* Compara dos elementos para indicar si el primero es
* menor, igual o mayor que el segundo elemento.
* @param e1 el primer elemento.
* @param e2 el segundo elemento.
* @return el orden de los elementos.
*/
public int compare (T e1, T e2);

/**
* Indica si un elemento es menor que otro.
* @param e1 el primer elemento.
* @param e2 el segundo elemento.
* @return true si un elemento es menor que otro.
*/
public boolean isLess (T e1, T e2);

Tambin se utilizar una clase abstracta


ComparatorBase que implementa esta interfaz.
En ella, el primer mtodo es abstracto y el resto
se implementa delegando en ste.

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Tipos abstractos de datos lineales. Listas


Algoritmos sobre listas

Ordenacin de los elementos de una lista


Los algoritmos de ordenacin que pueden aplicarse sobre listas, son rela6vamente pocos,
en comparacin con los que pueden aplicarse sobre estructuras de indexacin. En concreto
nosotros discu6remos en este captulo la ordenacin por insercin y la ordenacin por
mezcla

Ordenacin por insercin

Comparator

/**
Se proporciona un comparador cuya
* Ordena los elementos de la lista.
implementacin codifica el criterio de orden entre
* @param comparator El comparador de elementos.
dos elementos de la lista
* @return la lista ordenada.
*/
@Override
Ordenacin
public ListIF<T> sort (ComparatorIF<T> comparator)
{
Si la lista es vaca se devuelve sta. Sino, se
if (isEmpty ()) return this;
ordena el resto de la lista recursivamente y se
else return ((ListDynamic<T>) tail.sort (comparator))
.sortInsert (first, comparator);
inserta en ella el primer elemento en la posicin
}
adecuada segn el criterio de orden

/**
* Inserta un elemento en orden en una lista ordenada.
* @param element El elemento a insertar
* @param comparator El comparador de elementos.
* @return la lista ordenada.
*/
private ListIF<T> sortInsert (T element, ComparatorIF<T> comparator)
Insercin en orden
{
if (isEmpty ()) return this.insert (element);
Si la lista es vaca se devuelve. Si no, si el
else if (comparator.isLess (element, first))
elemento es menor que el primero, se inserta por
return this.insert(element);
el principio. Si no, se inserta en el resto el
else return ((ListDynamic<T>) tail)
.sortInsert (element, comparator).insert (first);
elemento a insertar
}

5 7 3 2

4 - 20

2 3

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Tipos abstractos de datos lineales. Listas


Algoritmos sobre listas

Ordenacin de los elementos de una lista


Los algoritmos de ordenacin que pueden aplicarse sobre listas, son rela6vamente pocos,
en comparacin con los que pueden aplicarse sobre estructuras de indexacin. En concreto
nosotros discu6remos en este captulo la ordenacin por insercin y la ordenacin por
mezcla

Ordenacin por mezcla


/**
* Ordena los elementos de la lista.
* @param element El comparador de elementos.
* @return la lista ordenada.
*/
@Override
public ListIF<T> sort (ComparatorIF<T> comparator)
{
if (getLength () <= 1) return this;
else {
int middle = (int) (getLength () / 2);
int index = 0;
ListIF<T> lLeft = new ListDynamic<T> ();
ListIF<T> lRight = new ListDynamic<T> ();
IteratorIF<T> listIt = getIterator ();
while (listIt.hasNext ()) {
T element = listIt.getNext ();
if (index < middle) lLeft.insert (element);
if (index >= middle) lRight.insert (element);
index = index + 1;
}
lLeft = lLeft.sort (comparator);
lRight = lRight.sort (comparator);
return sortMerge (lLeft, lRight, comparator);
}
}

4 - 21

I. Fase de divisin
Durante la primera fase, el algoritmo divide
recursivamente el problema en subproblemas de
la mitad de tamao. Este proceso requiere
recorrer la lista y tiene un coste de complejidad
lineal

5 7 3 2
5 7
5

3 2
3

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Tipos abstractos de datos lineales. Listas


Algoritmos sobre listas

Ordenacin de los elementos de una lista


Los algoritmos de ordenacin que pueden aplicarse sobre listas, son rela6vamente pocos,
en comparacin con los que pueden aplicarse sobre estructuras de indexacin. En concreto
nosotros discu6remos en este captulo la ordenacin por insercin y la ordenacin por
mezcla

Ordenacin por mezcla


private ListIF<T> sortMerge (ListIF<T> lLeft,
ListIF<T> lRight,
ComparatorIF<T> comparator)
{
ListDynamic<T> result = new ListDynamic<T> ();
while (lLeft.getLength () > 0 || lRight.getLength () > 0) {
if (lLeft.getLength () > 0 && lRight.getLength () > 0) {
T eLeft = lLeft.getFirst ();
T eRight = lRight.getFirst ();
if (comparator.isGreater (eLeft, eRight)) {
result.append (eLeft);
lLeft = lLeft.getTail ();
} else {
result.append (eRight);
lRight = lRight.getTail ();
}
} else if (lLeft.getLength () > 0) {
T eLeft = lLeft.getFirst ();
result.append (eLeft);
lLeft = lLeft.getTail ();
} else if (lRight.getLength () > 0) {
T eRight = lRight.getFirst ();
result.append (eRight);
lRight = lRight.getTail ();
}
}
return result;
}

4 - 22

II. Fase de mezcla


Una vez alcanzado elementos atmicos, la fase
de mezcla combina las soluciones ordenando
cada subproblema por combinacin de sus
elementos. De esta forma, se obtiene, al final, el
array completamente ordenado

5 7

2 3
2 3 5 7

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Tipos abstractos de datos lineales. Listas


Ejercicios

Ejercicios
Dado el carcter recursivo de la denicin del 6po abstracto de datos ListIF, la mayora de
algoritmos sobre listan 6enen un planteamiento recursivo. A con6nuacin se presentan una
coleccin de problemas `picos sobre listas para que se resuelvan de esta manera
I. Longitud de una lista
Disee una funcin recursiva que
calcule el nmero de elementos que
con6ene una lista

IV. ltimo elemento

Disee una funcin recursiva que


compare lexicogrcamente 2 listas
de caracteres.

V. Insertar al final

Disee una funcin recursiva


devuelva el l6mo elemento de una
lista

VII. Lista inversa

Disee una funcin recursiva que


inserte un dato como l6mo
elemento de una lista

VIII. Borrado de un elemento

Disee una funcin recursiva que


devuelva una lista con los elementos
colocados de forma inversa a otra

X. Lista prefijo

Disee una funcin recursiva que


devuelva una lista que elimine la
primera aparicin de un elemento

XI. Lista sufijo

Disee una funcin recursiva que


devuelva una sublista prejo que
precede a un elemento dado

4 - 23

II. Comparar dos listas

Disee una funcin recursiva que


devuelva la lista sujo que sucede a
un elemento dado

III. Sublista
Disee una funcin que dada una
lista determine si una lista es sublista
de otra dada de mayor tamao

VI. Concatenar dos listas


Disee una funcin recursiva que
devuelve la lista resultante de
concatenar dos listas

IX. Borrar todos


Disee una funcin que devuelva una
lista donde se hayan eliminado todas
las apariciones de un elemento

XII. Lista mayores


Disee una funcin recursiva que
devuelva una lista con todos los
elementos mayores a uno dado

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Tipos abstractos de datos lineales. Listas


Ejercicios

Ejercicios
Dado el carcter recursivo de la denicin del 6po abstracto de datos ListIF, la mayora de
algoritmos sobre listan 6enen un planteamiento recursivo. A con6nuacin se presentan una
coleccin de problemas `picos sobre listas para que se resuelvan de esta manera
XIII. Sumar 1

XIV. Pertenecen 2

Disee una funcin recursiva que


sume 1 a todo los elementos de una
lista de enteros

XVI. Interseccin de listas


Disee una funcin que dadas dos
listas devuelva los elementos
comunes a ambas

XIX. Contador

XVII. Partes de un conjunto


Disee una funcin que recibiendo
un conjunto en forma de lista genere
una lista de listas con las partes del
conjunto

XX. Lista contador

Disee una funcin que cuente el


numero de veces que determinado
elemento aparece en una lista

XXII. Suma de listas

Disee una funcin que genere una


lista con el nmero de veces que
aparece cada elemento de una lista

XXIII. Convertir a nmero

Dadas dos listas que representan


nmeros naturales, implemente el
algoritmo de suma generando una
lista resultado

4 - 24

Disee una funcin que indique si dos


elementos pertenecen a una lista
dada

Disee una funcin que dada una


lista de dgitos construya el nmero
natural que representa

XV. Unin de conjuntos


Disee una funcin que dadas dos
listas que representan 2 conjuntos
devuelva la lista del conjunto unin

XVIII. Complemento a 1
Disee una funcin recursiva que
dada una lista de ceros y unos
devuelva el complemento a 1

XXI. Producto escalar


Disee una funcin recursiva que
calcule el producto escalar de dos
vectores expresados en listas

XXIV. Convertir a lista


Disee una funcin que dado un
nmero genere una lista de dgitos
que lo represente

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Tipos abstractos de datos lineales. Listas


Bibliograba

BibliograUa
Bibliografa bsica
Estructuras de datos en java. Weiss, Mark
Allen. Pearson Addison Wesley. ISBN
9788478290352

4 - 25

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Tipos abstractos de datos lineales. Listas


Bibliograba

BibliograUa
Bibliografa complementaria
Estructura de datos y algoritmos en java. A.
Drozdek. Thomsom. ISBN: 9706866116. 2007

4 - 26

Estructuras de datos con Java. J. Lewis, J.


Chase. Pearson Addison Wesley. ISBN 13:
9788420541914

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Estrategias de programacin y estructuras de datos


Grado en Ingeniera Inform8ca
Grado en Tecnologas de la Informacin

Departamento de Lenguajes y Sistemas inform6cos

Tipos abstractos de
datos lineales
Pilas

Javier Vlez Reyes Jos Ignacio Mayorga Toledano


jvelez@lsi.uned.es
nmayorga@lsi.uned.es
Departamento de Lenguajes Y Sistemas InformDcos
UNED

Tipos abstractos de datos lineales. Pilas


ndice

ndice

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

5-2

Introduccin

Implementacin dinmica

Implementacin esttica

Implementacin con Lista

Algoritmos sobre Pilas

Recorrido de los elementos de una Pila

Bsqueda de un elemento sobre una Pila

Problemas y ejercicios

Bibliografa

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Tipos abstractos de datos lineales. Pilas


Obje6vos generales

Obje8vos

Conocer la interfaz del tipo abstracto de datos Pila

Aprender a implementar el TAD Pila mediante la interfaz StackIF

5-3

En versin esttica (con limitacin explcita de capacidad mxima)

En versin dinmica (sin limitacin explcita de capacidad mxima)

Utilizando una lista

Conocer los principales problemas algortmicos sobre pilas

Recorrido de los elementos de una pila

Bsqueda de un elemento sobre una pila

Practicar el diseo de funciones recursivas sobre pilas

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Tipos abstractos de datos lineales. Pilas


Introduccin

Tipos abstractos de datos lineales


Los 6pos abstractos de datos lineales representan abstracciones en las que los datos son
organizados de forma secuencial. A con6nuacin se muestran los diferentes TADs que caen
dentro de esta categora y que se diferencian, esencialmente, en la forma en que se ofrecen
acceso a sus datos
I. Listas
Tema 4

Tema 5

Tipos abstractos
de datos lineales

El tipo abstracto de datos Lista representa una estructuras de datos


donde los elementos se disponen de forma secuencial y las
operaciones de insercin y extraccin se aplican por el principio,
que puede moverse recursivamente haciendo referencia a otras
sublistas

Tema 6

II. Pilas
El tipo abstracto de dato Pila representa una estructuras de datos
donde los elementos se disponen de forma secuencial y las
operaciones de insercin y extraccin se aplican por el principio
segn la poltica de acceso ltimo en entrar, primero en salir

III. Colas
El tipo abstracto de dato Cola representa una estructuras de datos
donde los elementos se disponen de forma secuencial y las
operaciones de insercin y extraccin se aplican por el final y por el
principio respectivamente de acuerdo a la poltica de primero en
entrar, primero en salir

5-4

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Tipos abstractos de datos lineales. Pilas


Introduccin

El 8po abstracto de datos Pila


Las pilas son abstracciones de datos que organizan una coleccin de elementos de manera
secuencial, donde existe un nico punto de inters llamado cima por donde se realizan las
operaciones de acceso. La pol6ca de acceso indica que el l6mo elemento en entrar en una
pila es el primero en salir de ella (Last In First Out, LIFO).
Una pila es un 6po abstractos de datos que organiza una coleccin de elementos
de forma secuencial. Las operaciones de acceso se realizan por un extremo
llamado cima y la pol6ca de acceso es l6mo en entrar primero en salir (LIFO)

4
Cima
Las operaciones de
insercin y
extraccin se
realizan por un
extremo llamado
cima

5-5

3
2
1

Pila
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

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Tipos abstractos de datos lineales. Pilas


Interfaz del 6po abstracto de datos Pila

La interfaz del 8po abstracto de datos Pila StackIF <T>


El interfaz de Pila que u6lizaremos a lo largo de este
curso, StackIF est compuesto por las operaciones que
describimos a con6nuacin
1

2
3
1
2
3

push (1)

pop ()

1
2
3
1
2
3

5-6

Insertar
La operacin push inserta un elemento encima
de la cima de manera que el elemento
insertado pasa a ser la nueva cima

Extraer
2
3

La operacin 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

Es vaca

1
2
3
falso

cima
Todas las operaciones de una pila se atacan
por la cima. Este mtodo devuelve el elemento
en la cima sin extraerlo

cierto

Este predicado indica si la pila no contiene


ningn elemento. Semnticamente equivale a
preguntar si el nmero de elementos es 0 (ver
despus)

public interface StackIF <T>


{
/**
* Devuelve la cima de la pila.
* @return la cima de la pila.
*/
public T getTop ();

/**
* Inserta un elemento a la pida.
* @param element El elemento a ser aadido.
* @return la pila incluyendo el elemento.
*/
public StackIF<T> push (T element);

/**
* Extrae de la pila el elemento en la cima.
* @return la pila excluyendo la cabeza.
*/
public StackIF<T> pop ();

/**
* Devuelve cierto si la pila esta vacia.
* @return cierto si la pila esta vacia.
*/
public boolean isEmpty ();

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Tipos abstractos de datos lineales. Pilas


Interfaz del 6po abstracto de datos Pila

La interfaz del 8po abstracto de datos Pila StackIF <T>


El interfaz de Pila que u6lizaremos a lo largo de este
curso, StackIF est compuesto por las operaciones que
describimos a con6nuacin
Est llena

1
2
3

2
3

cierto

falso

1
2
3
1
2
3

getLength ()

contains (3)
cierto
contains (7)
falso

1
2
3

5-7

En implementaciones con capacidad mxima


limitada tiene sentido preguntar si una pila ha
alcanzado el nmero mximo de elementos
que puede albergar

Longitud
La longitud de una pila devuelve el nmero de
elementos que esta contiene. Si la pila esta
vaca devuelve 0. Si esta llena devuelve la
capacidad de la pila

Bsqueda
La operacin contains busca un elemento en la
pila e indica si est contenido dentro de la
misma

Recorrido
1
2
3

El recorrido de una pila devuelve un iterador


que permite visitar todos los elementos de la
pila segn aparecen desde la cima hasta la
base de la misma

/**
* Devuelve cierto si la pila esta llena.
* @return cierto si la pila esta llena.
*/
public boolean isFull();

/**
* Devuelve el numero de elementos de la pila.
* @return el numero de elementos de la pila.
*/
public int getLength ();

/**
* Devuelve cierto si la pila contiene el elemento.
* @param element El elemento buscado.
* @return cierto si la pila contiene el elemento.
*/
public boolean contains (T element);

/**
* Devuelve un iterador para la pila.
* @return un iterador para la pila.
*/
public IteratorIF<T> getIterator ();

}

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Tipos abstractos de datos lineales. Pilas


Implementacin del 6po abstracto de datos Pila

Implementacin del 8po abstracto de datos Pila StackIF <T>


Existen varias estrategias para implementar pilas que responden al interfaz StackIF anterior.
En general, stas se dividen en implementaciones dinmicas, que ar6culan pilas de
capacidad indenida e implementaciones est6cas, con una capacidad mxima limitada y
establecida como parmetro. A con6nuacin presentamos varias implementaciones

Implementacin dinmica basada en elemento y siguiente


Segn esta estrategia de implementacin, una pila est formada por un atributo que
representa la cima y otro que es una referencia a una pila y representa el resto de la pila.
De esta manera una pila es una coleccin encadenada de pares (elemento, siguiente)
Pila

Cima y siguiente

Ul8mo, elemento fantasma

Cada 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

5-8

La pila es una secuencia


de pares (elemento,
siguiente) acabada en un
par fantasma

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

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Tipos abstractos de datos lineales. Pilas


Implementacin del 6po abstracto de datos Pila

Implementacin dinmica basada en elemento y siguiente


Segn esta estrategia de implementacin, una pila est formada por un atributo que
representa la cima y otro que es una referencia a una pila y representa el resto de la pila.
De esta manera una pila es una coleccin encadenada de pares (elemento, siguiente)
public class StackDynamic <T> implements StackIF<T> *
{
private T element;
private StackDynamic<T> next;

public StackDynamic ()
{
element = null;
next = null;
}

public StackDynamic (StackIF<T> stack)
{
this ();
if (stack != null)
if (!stack.isEmpty ())
{
element = stack.getTop ();
next = new StackDynamic<T> (stack.pop ());
stack.push (element);
}
}

public StackDynamic (ListIF<T> list)
{
this ();
if (list != null)
if (!list.isEmpty () {
element = list.getFirst ();
next = new StackDynamic<T> (list.getTail ());
}
}

5-9

@Override
public T getTop ()
{
return element;
}

@Override
public StackIF<T> push (T element)
{
if (element != null) {
StackDynamic<T> stack = new StackDynamic<T> ();
stack.element = this.element;
stack.next = this.next;
this.element = element;
this.next = stack;
}
return this;
}

@Override
public StackIF<T> pop ()
{
if (!isEmpty ()) {
element = next.element;
next = next.next;
}
return this;
}

* Los comentarios de las cabeceras se


han omitido por cuestiones de espacio

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Tipos abstractos de datos lineales. Pilas


Implementacin del 6po abstracto de datos Pila

Implementacin dinmica basada en elemento y siguiente


Segn esta estrategia de implementacin, una pila est formada por un atributo que
representa la cima y otro que es una referencia a una pila y representa el resto de la pila.
De esta manera una pila es una coleccin encadenada de pares (elemento, siguiente)
@Override
public boolean isEmpty ()
{
return element == null &&
next == null;
}

@Override
public boolean isFull()
{
return false;
}

@Override
public int getLength ()
{
if (isEmpty ()) return 0;
return 1 + next.getLength ();
}

@Override
public boolean contains (T element)
{
if (isEmpty ()) return false;
else return this.element.equals (element) ||
next.contains (element);
}

@Override
public IteratorIF<T> getIterator ()
{
StackIF<T> handler = new StackDynamic<T> (this);
return new StackIterator<T> (handler);
}

@Override
public int hashCode ()
{
return 31 * ((element == null) ? 0 : element.hashCode ()) +
((next == null) ? 0 : next.hashCode ());
}

@SuppressWarnings("unchecked")
@Override
public boolean equals (Object o) {
...
}

@Override
public String toString () {
...
}
}

* Los comentarios de las cabeceras se


han omitido por cuestiones de espacio

5 - 10

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Tipos abstractos de datos lineales. Pilas


Implementacin del 6po abstracto de datos Pila

Implementacin del 8po abstracto de datos Pila StackIF <T>


Existen varias estrategias para implementar pilas que responden al interfaz StackIF anterior.
En general, stas se dividen en implementaciones dinmicas, que ar6culan pilas de
capacidad indenida e implementaciones est6cas, con una capacidad mxima limitada y
establecida como parmetro.

Implementacin est8ca basada en array


Segn esta estrategia de implementacin, una pila est cons6tuida por un array de
capacidad limitada y especicada mediante un parmetro y un ndice que apunta a la
cima de la pila. La pila empieza por la posicin 0 y avanza hacia posiciones crecientes
Pila
La pila est formada por los
elementos que van desde la
posicin 0 hasta cima

Extraer
Extraer mueve la cima de la pila
una posicin hacia atrs con lo
que la posicin anterior pasa a
ser la nueva cima. Cima == 0
indica una pila vaca luego esa
posicin se desaprovecha

5 - 11

Basura

Capacidad = 10

1 2 3 3 7 0 0 0 0
cima
Este ndice apunta siempre
al elemento que se
encuentra en la cima de la
pila. El ndice comienza en
0 y llega hasta capacidad1
para valores de la pila

El resto de elementos del


array que no pertenecen a la
pila son basura, resultado
del trabajo con el tipo

Insertar
Las inserciones mueven la cima
una posicin hacia adelante e
insertan el elemento. Si cima
llega a valer capacidad - 1 el
array est lleno y no se puede
insertar

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Tipos abstractos de datos lineales. Pilas


Implementacin del 6po abstracto de datos Pila

Implementacin est8ca basada en array


Segn esta estrategia de implementacin, una pila est cons6tuida por un array de
capacidad limitada y especicada mediante un parmetro y un ndice que apunta a la
cima de la pila. La pila empieza por la posicin 0 y avanza hacia posiciones crecientes
public class StackStatic <T> implements StackIF<T> *
{
private Object[] elements;
private int capacity;
private int top;

public StackStatic (int capacity)
{
this.elements = new Object[capacity];
this.capacity = capacity;
this.top = -1;
}

public StackStatic (StackIF<T> stack)
{
if (stack != null) {
this.capacity = stack.getLength ();
this.elements = new Object[this.capacity];
this.top = -1;

for (int i = capacity - 1; i >= 0; i--) {
T element = stack.getTop ();
elements [i] = element;
stack.pop ();
top ++;
}
for (int i = 0; i <= capacity - 1; i++) {
T element = (T) elements [i];
stack.push (element);
}
}
}

5 - 12

public StackStatic (ListIF<T> list)


{
if (list != null) {
this.capacity = list.getLength ();
this.elements = new Object[this.capacity];
this.top = -1;

ListIF<T> aList = list;
for (int index = 0; index < list.getLength (); index++) {
this.elements [index] = aList.getFirst ();
aList = list.getTail ();
}
}
}

public T getTop ()
{
if (isEmpty ()) return null;
return (T) elements [top];
}

public StackIF<T> push (T element)
{
if (element != null)
if (!isFull ()) {
top = top + 1;
elements [top] = element;
}
return this;
}
* Los comentarios de las cabeceras se

han omitido por cuestiones de espacio

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Tipos abstractos de datos lineales. Pilas


Implementacin del 6po abstracto de datos Pila

Implementacin est8ca basada en array


Segn esta estrategia de implementacin, una pila est cons6tuida por un array de
capacidad limitada y especicada mediante un parmetro y un ndice que apunta a la
cima de la pila. La pila empieza por la posicin 0 y avanza hacia posiciones crecientes
@Override
public StackIF<T> pop ()
{
if (!isEmpty ()) {
top = top - 1;
}
return this;
}

@Override
public boolean isEmpty ()
{
return top == -1;
}

@Override
public boolean isFull()
{
return top == (capacity 1);
}

@Override
public int getLength ()
{
return top + 1;
}

@Override
public boolean contains (T element)
{
IteratorIF<T> stackIt = this.getIterator ();
boolean found = false;
while (!found && stackIt.hasNext ()) {
T anElement = stackIt.getNext ();
found = anElement.equals (element);
}
return found;
}

@Override
public IteratorIF<T> getIterator ()
{
StackIF<T> handler = new StackStatic<T> (this, capacity);
return new StackIterator<T> (handler);
}

@Override
public int hashCode () {...}

@SuppressWarnings("unchecked")
@Override
public boolean equals (Object o) {...}

@Override
public String toString () {...}
}

* Los comentarios de las cabeceras se


han omitido por cuestiones de espacio

5 - 13

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Tipos abstractos de datos lineales. Pilas


Implementacin del 6po abstracto de datos Pila

Implementacin del 8po abstracto de datos Pila StackIF <T>


Existen varias estrategias para implementar pilas que responden al interfaz StackIF anterior.
En general, stas se dividen en implementaciones dinmicas, que ar6culan pilas de
capacidad indenida e implementaciones est6cas, con una capacidad mxima limitada y
establecida como parmetro.

Implementacin basada en lista


Dado que las implementaciones de pilas que hemos visto son bastante similares a las de
listas, es posible implementar una pila a par6r de una lista. El carcter est6co o
dinmico de la implementacin depender del 6po de implementacin de lista u6lizada
Resto es resto de pila
El resto de elementos de la lista
corresponde con la subpila que hay
debajo de la cima

Primero es cima
El primer elemento
de una lista se
corresponde con la
cima de la pila

2 3 4 5 6 7 8 9

ListIF

Pila
La pila se implementa a partir de cualquier implementacin del
TAD Lista con interfaz ListIF. La operacin de insertar se
implementa con la insercin en la lista y la de extraccin con la
operacin de obtener resto de la lista

5 - 14

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Tipos abstractos de datos lineales. Pilas


Implementacin del 6po abstracto de datos Pila

Implementacin basada en lista


Dado que las implementaciones de pilas que hemos visto son bastante similares a las de
listas, es posible implementar una pila a par6r de una lista. El carcter est6co o
dinmico de la implementacin depender del 6po de implementacin de lista u6lizada
public class StackList <T> implements StackIF<T> *
{
private ListIF<T> list;

public StackList ()
{
this.list = new ListDynamic<T> ();
}

public StackList (StackIF<T> stack) {...}

public StackList (ListIF<T> list)
{
this.list = new ListDynamic<T> (list);
}

@Override
public T getTop ()
{
return list.getFirst ();
}

@Override
public StackIF<T> push (T element)
{
list.insert (element);
return this;
}

@Override
public StackIF<T> pop ()
{
list = list.getTail ();
return this;
}

@Override
public boolean isEmpty ()
{
return list.isEmpty ();
}

@Override
public boolean isFull()
{
return list.isFull ();
}

@Override
public int getLength ()
{
return list.getLength ();
}

@Override
public boolean contains (T element)
{
return list.contains (element);
}
*

Los comentarios de las cabeceras se


han omitido por cuestiones de espacio

5 - 15

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Tipos abstractos de datos lineales. Pilas


Implementacin del 6po abstracto de datos Pila

Implementacin basada en lista


Dado que las implementaciones de pilas que hemos visto son bastante similares a las de listas,
es posible implementar una pila a partir de una lista. El carcter esttico o dinmico de la
implementacin depender del tipo de implementacin de lista utilizada
@Override
public IteratorIF<T> getIterator ()
{
StackIF<T> handler = new StackList<T> (list);
return new StackIterator<T> (handler);
}

@Override
public int hashCode ()
{
return 31 * ((list == null) ? 0 : list.hashCode ());
}

@SuppressWarnings("unchecked")
@Override
public boolean equals (Object o)
{
if (o == this) return true;
if (o == null) return false;

if (o.getClass () != this.getClass ()) return false;
else {
StackList<T> s = (StackList<T>) o;
return s.list.equals (list);
}
}

@Override
public String toString ()
{
StringBuffer buff = new StringBuffer ();
buff.append ("StackList - [");

IteratorIF<T> stackIt = getIterator ();
while (stackIt.hasNext ()) {
T element = stackIt.getNext ();
buff.append (element);
if (stackIt.hasNext ())
buff.append (", ");
}

buff.append ("]");
return buff.toString ();
}
}

* Los comentarios de las cabeceras se


han omitido por cuestiones de espacio

5 - 16

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Tipos abstractos de datos lineales. Pilas


Algoritmos sobre pilas

Algoritmos sobre pilas


A diferencia de lo que ocurra en el caso de las listas donde estudiamos que la ordenacin
era uno de los problemas recurrentes, en el caso de las pilas se considera que tal 6po de
manipulaciones no son de inters ya que iran en contra de la esencia organiza6va del 6po
mantener a los elementos dispuestos en el orden de llegada de acuerdo a una pol6ca LIFO.
Por ello, en esta seccin nos centraremos en discu6r el problema del recorrido de los
elementos de una pila y la bsqueda de un elemento dentro de una pila.
I. Recorrido

II. Bsqueda
La bsqueda de un elemento sobre los elementos de una pila se realiza de
forma secuencial dada la definicin del tipo lo que imprime un coste lineal al
algoritmo. Si esta operacin no fuese una operacin interna del tipo dicha
bsqueda sera destructiva o requerira utilizar un iterador (con copia) o
reconstruir la estructura tras el algoritmo. La bsqueda como operacin
interna permite implementar el algoritmo no destructivamente sobre la
estructura interna.

5 - 17

Independencia de la
implementacin

Algoritmos
sobre pilas

El recorrido de los elementos de una pila devuelve un iterador que permite


acceder secuencialmente a los mismos segn aparecen almacenados en la
estructura, en sentido desde la cima hasta la base de la pila. El recorrido en
sentido contrario es fcilmente implementable y se deja como ejercicio

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Tipos abstractos de datos lineales. Pilas


Algoritmos sobre pilas

Recorrido de los elementos de una pila


Para ar6cular el recorrido secuencial de los elementos de una pila debe implementarse el
interfaz IteratorIF. Las implementaciones de StackIF anteriores construyen una copia de la
pila como manejador para garan6zar que la iteracin no modique el estado del 6po
class StackIterator<T> implements IteratorIF<T>
{
private StackIF<T> handler;
Iteracin con reset
private StackIF<T> restart;
Se mantienen 2 manejadores constantemente,

/**
uno para articular el recorrido de la pila. El otro
* Constructor para StackIterator.
siempre apunta a la cima de la pila y se utiliza
* @param handler el manejador de pilas.
para implementar la operacin de reset del
*/
public StackIterator (StackIF<T> handler)
iterador
{
this.handler = handler;
this.restart = new StackDynamic<T> (handler);
}

getNext()
/**
* Devuelve el siguiente elemento de la iteracion.
* @return el siguiente elemento de la iteracion.
*/
handler
restart
@Override
public T getNext ()
Avance
{
T top = handler.getTop ();
La operacin de avance devuelve el elemento en
handler.pop ();
cima de la pila y actualiza el manejador de
return top;
recorrido extrayendo la cima. Para invocar esta
}

4
3
2
1

operacin con seguridad hay que asegurarse de


que el manejador no apunta a la cola vaca

5 - 18

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Tipos abstractos de datos lineales. Pilas


Algoritmos sobre pilas

Recorrido de los elementos de una pila


Para ar6cular el recorrido secuencial de los elementos de una pila debe implementarse el
interfaz IteratorIF. Las implementaciones de StackIF anteriores construyen una copia de la
pila como manejador para garan6zar que la iteracin no modique el estado del 6po
/**
* Devuelve cierto si existen mas elementos a iterar.
* @return cierto si existen mas elementos a iterar.
*/
@Override
public boolean hasNext ()
{
return !handler.isEmpty ();
}

/**
* Restablece el iterador para volver al inicio
*/
@Override
public void reset ()
{
handler = new StackDynamic<T> (restart);
}

@Override
public int hashCode () { ... }

@Override
public boolean equals (Object o) { ... }

@Override
public String toString () {...}
}

5 - 19

Hay siguiente
Para saber si el iterador contiene ms elementos y por
tanto puede volver a invocarse la operacin de avance o
no, hay que preguntar si el manejador ha alcanzado el final
de la pila

Reset
Una vez que un iterador ha llegado a su fin slo se puede
construir otro iterador, o resetear este a su valor inicial. En
este caso sin embargo, la operacin de reset requiere una
copia con lo que el coste es idntico al de construir un
nuevo iterador.

handler
reset ()
handler

4
3
2
1

restart

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Tipos abstractos de datos lineales. Pilas


Algoritmos sobre pilas

Bsqueda de un elemento sobre una pila


La bsqueda de un dato sobre los elementos contenidos en una pila es un problema de
recorrido secuencial que termina cuando se encuentra una cima que corresponde con el
dato buscado. El problema es que la bsqueda sobre el 6po es destruc6va a no ser que se
aplique sobre la implementacin o se u6lice un iterador

Bsqueda itera8va con cen8nela


En la bsqueda con cen6nela se itera sobre
la pila y se u6liza una guarda (cen6nela) para
indicar el momento en que se ha encontrado
el elemento y la bsqueda puede parar
/**
* Devuelve cierto si la pila contiene el elemento.
* @param element El elemento buscado.
* @return cierto si la pila contiene el elemento.
*/
@Override
public boolean contains (T element)
{
IteratorIF<T> stackIt = this.getIterator ();
boolean found = false;
while (!found && stackIt.hasNext ()) {
T anElement = stackIt.getNext ();
found = anElement.equals (element);
}
return found;
}

5 - 20

Bsqueda recursiva
En la bsqueda recursiva se comprueba si la
cabeza se corresponde con el elemento
buscado. Si es as el algoritmo termina
devolviendo cierto y si no, se recurre sobre
el resto de la pila para buscar el elemento
/**
* Devuelve cierto si la lista contiene el elemento.
* @param element El elemento buscado.
* @return cierto si la lista contiene el elemento.
*/
@Override
public boolean contains (T element)
{
if (isEmpty ()) return false;
return this.element.equals (element) ||
next.contains (element);
}

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Tipos abstractos de datos lineales. Pilas


Problemas y ejercicios

Ejercicios
Dado el carcter destruc6vo de las operaciones sobre pilas para avanzar en una pila es
necesario extraer su cima con pop la realizacin de muchos de sus algoritmos requiere de
un proceso de proteccin consistente en hacer una copia de la misma. Ignorando el
problema de destruccin resuelva los siguientes problemas
I. Longitud de una pila
Disee una funcin que calcule el
nmero de elementos que con6ene
una pila

IV. Elemento base

Devolver una lista con los elementos


de una pila segn aparecen en sta
desde la cima hasta la base

V. Insertar en la base

Disee una funcin que devuelva el


elemento base de una pila

VII. Pila inversa

Disee una funcin que inserte un


dato como elemento en la base de
una pila

VIII. Borrado de un elemento

Disee una funcin recursiva que


devuelva una pila con los elementos
colocados de forma inversa a otra

X. Pila prefijo

Disee una funcin que devuelva una


pila que elimine la primera aparicin
de un elemento

XI. Pila sufijo

Disee una funcin que devuelva una


pila con los elementos que preceden
a (estn encima de) un elemento
dado

5 - 21

II. Pasar a lista

Disee una funcin que devuelva la


pila con los elementos que suceden a
(estn debajo de) un elemento dado

III. Subpila
Disee una funcin que dada una
lista determine si sta est contenida
en una pila como subpila

VI. Concatenar dos pilas


Disee una funcin recursiva que
devuelva la pila resultante de
concatenar dos pilas

IX. Borrar todos


Disee una funcin que devuelva una
pila donde se hayan eliminado todas
las apariciones de un elemento

XII. Pila mayores


Disee una funcin recursiva que
devuelva una pila con todos los
elementos mayores a uno dado

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Tipos abstractos de datos lineales. Pilas


Problemas y ejercicios

Problemas
Las pilas son un 6po abstracto de datos que se u6liza recurrentemente en los problemas de
cierta complejidad de programacin. A con6nuacin planteamos algunos ejemplos de
problemas que se resuelven con el uso de pilas.
Las torres de Hanoi

El juego, en su forma ms tradicional, consiste en


tres varillas ver6cales. En una de las varillas se apila
un nmero n de discos. Los discos se apilan sobre
una varilla en tamao decreciente. No hay dos
discos iguales, y todos ellos estn apilados de
mayor a menor radio en una de las varillas,
quedando las otras dos varillas vacantes.
El juego consiste en pasar todos los discos de la varilla ocupada a una de las otras varillas
vacantes. Para realizar este obje6vo, es necesario seguir tres simples reglas:
1.
2.
3.

5 - 22

Slo se puede mover un disco cada vez.


Un disco de mayor tamao no puede descansar sobre uno ms pequeo que l mismo.
Slo puedes desplazar el disco que se encuentre arriba en cada varilla.

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Tipos abstractos de datos lineales. Pilas


Problemas y ejercicios

Problemas
Las pilas son un 6po abstracto de datos que se u6liza recurrentemente en los problemas de
cierta complejidad de programacin. A con6nuacin planteamos algunos ejemplos de
problemas que se resuelven con el uso de pilas.
La carta blanca

La nalidad del Solitario Carta blanca es


mover todas las cartas desde la zona del
tablero a las casillas de palo: los cuatro
recuadros situados en la parte superior
derecha del tablero. Para ganar, el jugador
6ene que hacer cuatro montones de
cartas en las casillas, uno por cada palo, y
amontonarlas en orden ascendente desde
el AS hasta el REY. Puedes mover las cartas
de una columna a otra ordenando las
cartas de mayor a menor y alternando los
colores de los palos, as como u6lizar las casillas libres para apartar cartas de las columnas y
as acceder a la carta que hay debajo. La par6da naliza cuando el jugador ha movido todas
las cartas a las casillas de palo o cuando ya no puede realizar ningn movimiento ms. Se dice
que todas las par6das de Carta blanca pueden ganarse.

5 - 23

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Tipos abstractos de datos lineales. Pilas


Problemas y ejercicios

Problemas
Las pilas son un 6po abstracto de datos que se u6liza recurrentemente en los problemas de
cierta complejidad de programacin. A con6nuacin planteamos algunos ejemplos de
problemas que se resuelven con el uso de pilas.
Calculadora en notacin postfija

Aunque actualmente las calculadores permiten


operar con expresiones en notacin inja,
tradicionalmente ha sido frecuente encontrar
mquinas que requeran introducir las
expresiones en notacin posdija. Esto facilita la
forma de calculo y evita el uso de paren6zacin
para desambiguar. De esta manera, 2 + 3 * 5 se
expresa en notacin posdija como 2 3 + 5 * y
debe interpretarse como que a los operandos

5 - 24

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Tipos abstractos de datos lineales. Pilas


Bibliograia

BibliograTa
Bibliografa bsica
Estructuras de datos en java. Weiss, Mark
Allen. Pearson Addison Wesley. ISBN
9788478290352

5 - 25

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Tipos abstractos de datos lineales. Pilas


Bibliograia

BibliograTa
Bibliografa complementaria
Estructura de datos y algoritmos en java. A.
Drozdek. Thomsom. ISBN: 9706866116. 2007

5 - 26

Estructuras de datos con Java. J. Lewis, J.


Chase. Pearson Addison Wesley. ISBN 13:
9788420541914

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Estrategias de programacin y estructuras de datos


Grado en Ingeniera Inform8ca
Grado en Tecnologas de la Informacin

Departamento de Lenguajes y Sistemas inform6cos

Tipos abstractos de
datos lineales
Colas

Javier Vlez Reyes Jos Ignacio Mayorga Toledano


jvelez@lsi.uned.es
nmayorga@lsi.uned.es
Departamento de Lenguajes Y Sistemas InformDcos
UNED

Tipos abstractos de datos lineales. Colas


ndice

ndice

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

6-2

Introduccin

Implementacin dinmica

Implementacin esttica

Implementacin con Lista

Algoritmos sobre Colas

Recorrido de los elementos de una Cola

Bsqueda de un elemento sobre una Cola

Problemas y ejercicios

Bibliografa

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Tipos abstractos de datos lineales. Colas


Obje6vos generales

Obje8vos

Conocer la interfaz del tipo abstracto de datos Cola

Aprender a implementar el TAD Cola mediante la interfaz QueueIF

6-3

En versin esttica (con limitacin explcita de capacidad mxima)

En versin dinmica (sin limitacin explcita de capacidad mxima)

Utilizando una lista

Conocer los principales problemas algortmicos sobre colas

Recorrido de los elementos de una cola

Bsqueda de un elemento sobre una cola

Practicar el diseo de funciones recursivas sobre cola

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Tipos abstractos de datos lineales. Colas


Introduccin

Tipos abstractos de datos lineales


Los 6pos abstractos de datos lineales representan abstracciones en las que los datos son
organizados de forma secuencial. A con6nuacin se muestran los diferentes TADs que caen
dentro de esta categora y que se diferencian, esencialmente, en la forma en que se ofrecen
acceso a sus datos
I. Listas
Tema 4

Tema 5

Tipos abstractos
de datos lineales

El tipo abstracto de datos Lista representa una estructuras de datos


donde los elementos se disponen de forma secuencial y las
operaciones de insercin y extraccin se aplican por el principio,
que puede moverse recursivamente haciendo referencia a otras
sublistas

Tema 6

II. Pilas
El tipo abstracto de dato Pila representa una estructuras de datos
donde los elementos se disponen de forma secuencial y las
operaciones de insercin y extraccin se aplican por el principio
segn la poltica de acceso ltimo en entrar, primero en salir

III. Colas
El tipo abstracto de dato Cola representa una estructuras de datos
donde los elementos se disponen de forma secuencial y las
operaciones de insercin y extraccin se aplican por el final y por el
principio respectivamente de acuerdo a la poltica de primero en
entrar, primero en salir

6-4

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Tipos abstractos de datos lineales. Colas


Introduccin

El 8po abstracto de datos Cola


Las colas son abstracciones de datos que organizan una coleccin de elementos de manera
secuencial, donde existen dos puntos de inters llamados comienzo y nal. Por el comienzo
se realizan las operaciones de extraccin mientras que por el nal se realizan las
inserciones. Segn esto, la pol6ca de acceso prescribe que el primer elemento en entrar en
una cola es el primero en salir de ella (First In First Out, FIFO).
Una cola es un 6po abstractos de datos que organiza una coleccin de elementos
de forma secuencial. Las operaciones de extraccin se realizan por el principio y
las de insercin por el nal de acuerdo a la pol6ca de acceso FIFO que prescribe
que el primero en entrar es el primero en salir

1
Primero
El primero marca el
siguiente elemento a
extraer. Tras una
extraccin, primero
avanza al siguiente en
la cola

6-5

Ul8mo
El ltimo marca el
ltimo elemento que se
ha insertado. Tras una
insercin, ltimo apunta
al elemento insertado

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Tipos abstractos de datos lineales. Colas


Interfaz del 6po abstracto de datos Cola

La interfaz del 8po abstracto de datos Cola QueueIF <T>


El interfaz de Cola que u6lizaremos a lo largo de este
curso, QueueIF est compuesto por las operaciones que
describimos a con6nuacin
primero
1

Devuelve el elemento que se encuentra en la


cabeza de la cola sin extraerlo de la misma.
Esta es una operacin consultora

Insertar
1

La operacin add inserta un elemento detrs


del ltimo elemento de la cola de manera que
este pasa a ser el nuevo ltimo

borrar
1

La operacin remove extrae el elemento que


se encuentra en la cabeza de la cola dejando
al siguiente a ste como nueva cabeza

Es vaca
falso

1
cierto

6-6

Este predicado indica si la cola no contiene


ningn elemento. Semnticamente equivale a
preguntar si el nmero de elementos es 0 (ver
despus)

public interface QueueIF <T>


{
/**
* Devuelve la cabeza de la cola.
* @return la cabeza de la cola.
*/
public T getFirst ();

/**
* Inserta un nuevo elemento a la cola.
* @param element El elemento a aadir.
* @return la cola incluyendo el elemento.
*/
public QueueIF<T> add (T element);

/**
* Borra la cabeza de la cola.
* la cola excluyendo la cabeza.
*/
public QueueIF<T> remove ();

/**
* Devuelve cierto si la cola esta vacia.
* @return cierto si la cola esta vacia.
*/
public boolean isEmpty ();

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Tipos abstractos de datos lineales. Colas


Interfaz del 6po abstracto de datos Cola

La interfaz del 8po abstracto de datos Cola QueueIF <T>


El interfaz de Cola que u6lizaremos a lo largo de este
curso, QueueIF est compuesto por las operaciones que
describimos a con6nuacin
Est llena
falso
cierto

En implementaciones con capacidad mxima


limitada tiene sentido preguntar si una cola ha
alcanzado el nmero mximo de elementos
que puede albergar

Longitud
3

contains (3)
falso
contains (1)
cierto

La longitud de una cola devuelve el nmero de


elementos que sta contiene. Si la cola esta
vaca devuelve 0. Si esta llena devuelve lsu
capacidad mxima

Bsqueda
La operacin contains busca un elemento en la
cola e indica si est contenido dentro de la
misma

Recorrido
1, 2, 3

6-7

El recorrido de una cola devuelve un iterador


que permite visitar todos los elementos de la
misma segn aparecen desde el primero hasta
el ltimo

/**
* Devuelve cierto si la cola esta llena.
* @return cierto si la cola esta llena.
*/
public boolean isFull();

/**
* Devuelve el numero de elementos de la cola.
* @return el numero de elementos de la cola.
*/
public int getLength ();

/**
* Devuelve cierto si la cola contiene el elemento.
* @param element El elemento buscado.
* @return cierto si la cola contiene el elemento.
*/
public boolean contains (T element);

/**
* Devuelve un iterador para la cola.
* @return un iterador para la cola.
*/
public IteratorIF<T> getIterator ();
}

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Tipos abstractos de datos lineales. Colas


Implementacin del 6po abstracto de datos Cola

Implementacin del 8po abstracto de datos Cola QueueIF <T>


Existen varias estrategias para implementar colas que responden al interfaz QueueIF
anterior. En general, stas se dividen en implementaciones dinmicas, que ar6culan colas
de capacidad indenida e implementaciones est6cas, con una capacidad mxima limitada
y establecida como parmetro. A con6nuacin presentamos varias implementaciones

Implementacin dinmica basada en primero y l8mo


Segn esta estrategia de implementacin, una cola est formada por una cadena de
nodos enlazados con referencias al siguiente y dos referencias que apuntan al primer y
l6mo elemento de la cola. La desventaja de esta implementacin es que hay que
separar la abstraccin de la cadena de nodos
cola
ul8mo

primero

La referencia al ltimo se
mantiene para saber detrs
de quin se debe hacer la
siguiente insercin

La referencia al primero se
mantiene para saber que
elemento extraer en cada
paso

4 -

Datos Los elementos de la cola se representan


mediante una estructura de nodos
encadenados por referencias al siguiente

6-8

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Tipos abstractos de datos lineales. Colas


Implementacin del 6po abstracto de datos Cola

Implementacin dinmica basada en primero y siguiente


Una cola est formada por una cadena de nodos enlazados con referencias al siguiente y
dos referencias que apuntan al primer y l6mo elemento de la cola. La desventaja de
esta implementacin es que hay que separar la abstraccin de la cadena de nodos
public class QueueDynamic <T> implements QueueIF <T> *
{
private Node<T> first;
private Node<T> last;

public QueueDynamic () {
first = null;
last = null;
}

public QueueDynamic (QueueIF<T> queue) {
this ();
if (queue != null)
for (int i = 0; i < queue.getLength (); i++) {
T element = queue.getFirst ();
add (element);
queue.remove ();
queue.add (element);
}
}

public QueueDynamic (ListIF<T> list)
{
this ();
if (list != null) {
ListIF<T> l = list;
while (!l.isEmpty ()){
add (l.getFirst ());
l = l.getTail ();
}
}
}

6-9

@Override
public T getFirst () {
return first.getElement ();
}

@Override
public QueueDynamic<T> add (T element) {
if (element != null) {
if (isEmpty ()) {
Node<T> aNode = new Node<T> (element);
first = aNode;
last = aNode;
} else {
Node<T> aNode = new Node<T> (element);
last.setNext (aNode);
last = aNode;
}
}
return this;
}

@Override
public QueueDynamic<T> remove () {
if (getLength () == 1) {
first = null;
last = null;
}
if (getLength () > 1) {
first = first.getNext ();
}
* Los comentarios de las cabeceras se
return this;
}
han omitido por cuestiones de espacio

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Tipos abstractos de datos lineales. Colas


Implementacin del 6po abstracto de datos Cola

Implementacin dinmica basada en primero y siguiente


Una cola est formada por una cadena de nodos enlazados con referencias al siguiente y
dos referencias que apuntan al primer y l6mo elemento de la cola. La desventaja de
esta implementacin es que hay que separar la abstraccin de la cadena de nodos
@Override
public boolean isEmpty () {
return first == null &&
last == null;
}

@Override
public boolean isFull() {
return false;
}

@Override
public int getLength () {
int length = 0;
Node<T> node = first;
while (node != null) {
length ++;
node = node.getNext ();
}
return length;
}

@Override
public boolean contains (T element){
boolean found = false;
Node<T> node = first;
while (!found && node != null) {
found = node.getElement ().equals (element);
node = node.getNext ();
}
return found;
}

6 - 10

@Override
public IteratorIF<T> getIterator ()
{
QueueIF<T> handler = new QueueDynamic<T> (this);
return new QueueIterator<T> (handler);
}

@Override
public int hashCode ()
{
return 31 * ((first == null) ? 0 : first.hashCode ()) +
((last == null) ? 0 : last.hashCode ());
}

@SuppressWarnings("unchecked")
@Override
public boolean equals (Object o)
{
if (o == this) return true;
if (o == null) return false;

if (o.getClass () != this.getClass ()) return false;
else {
QueueDynamic<T> q = (QueueDynamic<T>) o;
return q.first.equals (first) &&
q.last.equals (last);
}
}

* Los comentarios de las cabeceras se


han omitido por cuestiones de espacio

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Tipos abstractos de datos lineales. Colas


Implementacin del 6po abstracto de datos Cola

Implementacin dinmica basada en primero y siguiente


Una cola est formada por una cadena de nodos enlazados con referencias al siguiente y
dos referencias que apuntan al primer y l6mo elemento de la cola. La desventaja de
esta implementacin es que hay que separar la abstraccin de la cadena de nodos
@Override
public String toString ()
{
StringBuffer buff = new StringBuffer ();
buff.append ("QueueDynamic - [");

IteratorIF<T> queueIt = getIterator ();
while (queueIt.hasNext ()) {
T element = queueIt.getNext ();
buff.append (element);
if (queueIt.hasNext ())
buff.append (", ");
}

buff.append ("]");
return buff.toString ();
}
}

class Node <T>
{
private T element;
private Node<T> next;

public Node ()
{
this.element = null;
this.next = null;
}

6 - 11

public Node (T element) {


this ();
this.element = element;
}

public Node (T element, Node<T> next) {
this ();
this.element = element;
this.next = next;
}

public T getElement ()
{
return element;
}

public void setElement (T element)
{
this.element = element;
}

public Node<T> getNext ()
{
return next;
}

public void setNext (Node<T> next)
{
this.next = next;
}
* Los comentarios de las cabeceras se
}

han omitido por cuestiones de espacio

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Tipos abstractos de datos lineales. Colas


Implementacin del 6po abstracto de datos Cola

Implementacin del 8po abstracto de datos Cola QueueIF <T>


Existen varias estrategias para implementar colas que responden al interfaz QueueIF
anterior. En general, stas se dividen en implementaciones dinmicas, que ar6culan colas
de capacidad indenida e implementaciones est6cas, con una capacidad mxima limitada
y establecida como parmetro. A con6nuacin presentamos varias implementaciones

Implementacin est8ca basada en array circular


Segn esta estrategia de implementacin, una cola se almacena en un array de
capacidad limitada accedido circularmente mediante dos ndices en aritm6ca modular
que apuntan al primer y ul6mo elemento
Las inserciones se realizan en la
posicin ltimo y avanzan el
ndice ltimo una posicin en
aritmtica modular Insertar

Las extracciones avanzan el


ndice primero una posicin en
aritmtica modular

extraer

4 5 2 3 3 7 0 1 2 3
l8mo
El ndice ltimo apunta siempre al primer
hueco libre tras el ltimo elemento de la
cola. . Cuando ste llega al ndice mximo
del array continua modularmente por 0

6 - 12

Capacidad = 10

primero
El ndice primero apunta siempre al
elemento en cabeza de la cola. Cuando
ste llega al ndice mximo del array
continua modularmente por 0

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Tipos abstractos de datos lineales. Colas


Implementacin del 6po abstracto de datos Cola

Implementacin est8ca basada en array circular


Segn esta estrategia de implementacin, una cola se almacena en un array de
capacidad limitada accedido circularmente mediante dos ndices en aritm6ca modular
que apuntan al primer y ul6mo elemento
public class QueueStatic <T> implements QueueIF <T> *
{
private Object[] elements;
private int capacity;
private int first;
private int last;

public QueueStatic (int capacity)
{
this.elements = new Object [capacity + 1];
this.capacity = capacity + 1;
this.first = 0;
this.last = 0;
}

public QueueStatic (QueueIF<T> queue)
{
if (queue != null) {
this.capacity = queue.getLength () + 1;
this.elements = new Object [this.capacity + 1];
this.first = 0;
this.last = 0;

for (int i = 0; i < queue.getLength (); i++) {
T element = queue.getFirst ();
add (element);
queue.remove ();
queue.add (element);
}
}
}

6 - 13

public QueueStatic (ListIF<T> list)


{
if (list != null) {
this.capacity = queue.getLength () + 1;
this.elements = new Object [this.capacity + 1];
this.first = 0;
this.last = 0;

ListIF<T> l = list;
while (!l.isEmpty ()){
add (l.getFirst ());
l = l.getTail ();
}
}
}

public T getFirst () {
if (isEmpty ()) return null;
return (T) elements [first];
}

public QueueStatic<T> add (T element) {
if (element != null)
if (!isFull ()) {
elements [last] = element;
last = next (last);
}
return this;
}

* Los comentarios de las cabeceras se


han omitido por cuestiones de espacio

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Tipos abstractos de datos lineales. Colas


Implementacin del 6po abstracto de datos Cola

Implementacin est8ca basada en array circular


Segn esta estrategia de implementacin, una cola se almacena en un array de
capacidad limitada accedido circularmente mediante dos ndices en aritm6ca modular
que apuntan al primer y ul6mo elemento
@Override
public QueueStatic<T> remove () {
if (! isEmpty ()) {
first = next (first);
}
return this;
}

@Override
public boolean isEmpty () {
return first == last;
}

@Override
public boolean isFull() {
return next(last) == first;
}

@Override
public int getLength () {
if (first <= last) return last - first;
else return capacity - (first - last);
}

private int next (int index)
{
return (index + 1) % capacity;
}


6 - 14

@Override
public boolean contains (T element)
{
boolean found = false;
int index = first;
while (!found && Math.abs (last - index) > 0) {
found = elements [index].equals (element);
index = next (index);
}
return found;
}

@Override
public IteratorIF<T> getIterator ()
{
QueueIF<T> handler = new QueueStatic<T> (this, capacity);
return new QueueIterator<T> (handler);
}

@Override
public int hashCode () {...}

@SuppressWarnings("unchecked")
@Override
public boolean equals (Object o) {...}

@Override
public String toString () {...}
}

* Los comentarios de las cabeceras se


han omitido por cuestiones de espacio

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Tipos abstractos de datos lineales. Colas


Implementacin del 6po abstracto de datos Cola

Implementacin del 8po abstracto de datos Cola QueueIF <T>


Existen varias estrategias para implementar colas que responden al interfaz QueueIF
anterior. En general, stas se dividen en implementaciones dinmicas, que ar6culan colas
de capacidad indenida e implementaciones est6cas, con una capacidad mxima limitada
y establecida como parmetro. A con6nuacin presentamos varias implementaciones

Implementacin basada en lista


Dado que la implementacin dinmica de colas que hemos visto es bastante similar a la
de listas, es posible implementar una cola a par6r de una lista. El carcter est6co o
dinmico de la implementacin depender del 6po de implementacin de lista u6lizada
cola
ul8mo

primero

La referencia al ltimo se
mantiene para garantizar
una insercin en coste
constante

La referencia al primero se
mantiene para saber que
elemento extraer encada
paso

1
Primero
El primer elemento de la lista se
corresponde con el primero de la cola

6 - 15

2 3 4 5 6 7 8 9

ListIF

Resto
En listas la definicin recursiva del tipo parte la
lista en un primero y una lista de tamao n - 1

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Tipos abstractos de datos lineales. Colas


Implementacin del 6po abstracto de datos Cola

Implementacin est8ca basada en lista


Dado que la implementacin dinmica de colas que hemos visto es bastante similar a la
de listas, es posible implementar una cola a par6r de una lista. El carcter est6co o
dinmico de la implementacin depender del 6po de implementacin de lista u6lizada
public class QueueList <T> implements QueueIF <T>
{
private ListIF<T> first;
private ListIF<T> last;

public QueueList ()
{
first = new ListDynamic<T> ();
last = first;
}

public QueueList (QueueIF<T> queue)
{
this ();
if (queue != null)
for (int i = 0; i < queue.getLength (); i++) {
T element = queue.getFirst ();
add (element);
queue.remove ();
queue.add (element);
}
}

public QueueList (ListIF<T> list)
{
first = new ListDynamic<T> (list);
ListIF<T> l = list;
while (!l.isEmpty ()) l = l.getTail ();
last = l;
}

6 - 16

@Override
public T getFirst ()
{
return first.getFirst ();
}

@Override
public QueueList<T> add (T element)
{
last.insert (element);
last = last.getTail ();
return this;
}

@Override
public QueueList<T> remove ()
{
first = first.getTail ();
return this;
}

@Override
public boolean isEmpty ()
{
return first.isEmpty ();
}

* Los comentarios de las cabeceras se


han omitido por cuestiones de espacio

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Tipos abstractos de datos lineales. Colas


Implementacin del 6po abstracto de datos Cola

Implementacin est8ca basada en lista


Dado que la implementacin dinmica de colas que hemos visto es bastante similar a la
de listas, es posible implementar una cola a par6r de una lista. El carcter est6co o
dinmico de la implementacin depender del 6po de implementacin de lista u6lizada
@Override
@SuppressWarnings("unchecked")
public boolean isFull()
@Override
{
public boolean equals (Object o)
return false;
{
}
if (o == this) return true;

if (o == null) return false;
@Override

public int getLength ()
if (o.getClass () != this.getClass ()) return false;
{
else {
return first.getLength ();
QueueList<T> q = (QueueList<T>) o;
}
return q.first.equals (first) &&

q.last.equals (last);
@Override
}
public boolean contains (T element)
}
{

return first.contains (element);
@Override
}
public String toString () {

StringBuffer buff = new StringBuffer ();
@Override
buff.append ("QueueList - [");
public IteratorIF<T> getIterator ()

{
IteratorIF<T> queueIt = getIterator ();
return first.getIterator ();
while (queueIt.hasNext ()) {
}
T element = queueIt.getNext ();

buff.append (element);
@Override
if (queueIt.hasNext ())
public int hashCode ()
buff.append (", ");
{
}
return 31 * ((first == null) ? 0 : first.hashCode ())
+ ((last == null) ? 0 : last.hashCode ()); buff.append ("]");
}
return buff.toString ();
* Los comentarios de las cabeceras se

}
}
han omitido por cuestiones de espacio

6 - 17

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Tipos abstractos de datos lineales. Colas


Algoritmos sobre colas

Algoritmos sobre colas


A diferencia de lo que ocurra en el caso de las listas donde estudiamos que la ordenacin
era uno de los problemas recurrentes, en el caso de las colas se considera que tal 6po de
manipulaciones no son de inters ya que iran en contra de la esencia organiza6va del 6po
mantener a los elementos dispuestos en el orden de llegada de acuerdo a una pol6ca FIFO.
Por ello, en esta seccin nos centraremos en discu6r el problema del recorrido de los
elementos de una cola y la bsqueda de un elemento dentro de una cola.
I. Recorrido

II. Bsqueda
La bsqueda de un elemento sobre los elementos de una cola se realiza de
forma secuencial dada la definicin del tipo lo que imprime un coste lineal al
algoritmo. El problema fundamental en este tipo de algoritmos es que dicha
bsqueda es destructiva y requiere o utilizar un iterador (con copia) o
reconstruir la estructura tras el algoritmo

6 - 18

Independencia de la
implementacin

Algoritmos
sobre colas

El recorrido de los elementos de una cola devuelve un iterador que permite


acceder secuencialmente a los mismos segn aparecen almacenados en la
estructura, desde el primero hasta el ltimo de la cola. El recorrido en sentido
contrario es fcilmente implementable y se deja como ejercicio

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Tipos abstractos de datos lineales. Colas


Algoritmos sobre colas

Recorrido de los elementos de una cola


Para ar6cular el recorrido secuencial de los elementos de una cola debe implementarse el
interfaz IteratorIF. Las implementaciones de QueueIF anteriores construyen una copia de la
cola como manejador para garan6zar que la iteracin no modique el estado del 6po
class QueueIterator<T> implements IteratorIF<T>
{
private QueueIF<T> handler;
Iteracin con reset
private QueueIF<T> restart;
Se mantienen 2 manejadores constantemente,

/**
uno para articular el recorrido de la cola. El otro
* Constructor para QueueIterator.
siempre apunta a la cabeza de la cola y se utiliza
* @param handler el manejador de colas.
para implementar la operacin de reset del
*/
public QueueIterator (QueueIF<T> handler)
iterador
restart
{
this.handler = handler;
this.restart = new QueueDynamic<T> (handler);
}

/**
* Devuelve el siguiente elemento de la iteracion.
* @return el siguiente elemento de la iteracion.
*/
getNext()
@Override
handler
public T getNext ()
Avance
{
T element = handler.getFirst ();
La operacin de avance devuelve el elemento en
handler.remove ();
cabeza de la cola y actualiza el manejador de
return element;
recorrido extrayendo la cima. Para invocar esta
}

1 2 3 4

operacin con seguridad hay que asegurarse de


que el manejador no apunta a la cola vaca

6 - 19

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Tipos abstractos de datos lineales. Colas


Algoritmos sobre colas

Recorrido de los elementos de una cola


Para ar6cular el recorrido secuencial de los elementos de una cola debe implementarse el
interfaz IteratorIF. Las implementaciones de QueueIF anteriores construyen una copia de la
cola como manejador para garan6zar que la iteracin no modique el estado del 6po
/**
* Devuelve cierto si existen mas elementos a iterar.
* @return cierto si existen mas elementos a iterar.
*/
@Override
public boolean hasNext ()
{
return !handler.isEmpty ();
}

/**
* Restablece el iterador para volver iterar.
*/
@Override
public void reset ()
{
handler = new QueueDynamic<T> (restart);
}
}

Hay siguiente
Para saber si el iterador contiene ms elementos y por
tanto puede volver a invocarse la operacin de avance o
no, hay que preguntar si el manejador ha alcanzado el final
de la cola

Reset
Una vez que un iterador ha llegado a su fin slo se puede
construir otro iterador, o resetear ste a su valor inicial. En
este caso sin embargo, la operacin de reset requiere una
copia con lo que el coste es idntico al de construir un
nuevo iterador.

restart

1 2 3 4
reset()
handler
6 - 20

handler

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Tipos abstractos de datos lineales. Colas


Algoritmos sobre colas

Bsqueda de un elemento sobre una cola


La bsqueda de un dato sobre los elementos contenidos en una cola es un problema de
recorrido secuencial que termina cuando se encuentra una cabeza que corresponde con el
dato buscado. Dado que el 6po no 6ene una denicin recursiva, el problema de bsqueda
no se presta a este 6po de resolucin algortmica. A con6nuacin presentamos dos
versiones de la bsqueda itera6va con cen6nela que aprovechan la estructura interna de la
implementacin del 6po

Bsqueda en QueueDynamic
Es esta implementacin se realiza una
bsqueda con cen6nela sobre la estructura
de nodos enlazados que implementar el 6po
cola
@Override
public boolean contains (T element){
boolean found = false;
Node<T> node = first;
while (!found && node != null) {
found = node.getElement ().equals (element);
node = node.getNext ();
}
return found;
}

6 - 21

Bsqueda en QueueSta8c
En la implementacin est6ca los datos son
almacenados sobre una estructura vectorial
que debe ser recorrida circularmente desde
el primero hasta el l6mo elemento, si el
cen6nela no lo impide
@Override
public boolean contains (T element)
{
boolean found = false;
int index = first;
while (!found && Math.abs (last - index) > 0) {
found = elements [index].equals (element);
index = next (index);
}
return found;
}

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Tipos abstractos de datos lineales. Colas


Problemas y ejercicios

Ejercicios
Dado el carcter destruc6vo de las operaciones sobre colas para avanzar en una cola es
necesario extraer su cabeza con invocando a remove la realizacin de muchos de sus
algoritmos requiere de un proceso de proteccin consistente en hacer una copia de la
misma. Ignorando el problema de destruccin resuelva los siguientes problemas
I. Longitud de una cola
Disee una funcin que calcule el
nmero de elementos que con6ene
una cola

IV. Extraer pares

Devolver una lista con los elementos


de una cola segn aparecen en sta
desde el primero al l6mo

V. Insertar en orden

Funcin que extrae los nmeros


pares de una cola de enteros. Repita
el ejercicio para extraer los de
posicin par en la cola

VII. Cola inversa

Disee una funcin que inserte en


una cola de enteros los elementos de
forma ordenada crecientemente

VIII. Borrado de un elemento

Disee una funcin recursiva que


devuelva una cola con los elementos
colocados de forma inversa a otra

X. Cola prefijo

Disee una funcin que devuelva una


cola que elimine la primera aparicin
de un elemento

XI. Cola sufijo

Disee una funcin que devuelva una


cola con los elementos que preceden
a un elemento dado

6 - 22

II. Pasar a lista

Disee una funcin que devuelva la


cola sujo que sucede a un elemento
dado

III. Subcola
Disee una funcin que dada una cola
determine si es subcola de otra dada
de mayor tamao

VI. Concatenar dos colas


Disee una funcin recursiva que
devuelve la cola resultante de
concatenar dos colas

IX. Borrar todos


Disee una funcin que devuelva una
cola donde se hayan eliminado todas
las apariciones de un elemento

XII. Cola mayores


Disee una funcin recursiva que
devuelva una cola con todos los
elementos mayores a uno dado

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Tipos abstractos de datos lineales. Colas


Problemas y ejercicios

Problemas
Las colas son un 6po abstracto de datos que se u6liza recurrentemente en los problemas de
cierta complejidad de programacin. A con6nuacin planteamos algunos ejemplos de
problemas que se resuelven con el uso de colas.
Competicin de procesos por un recurso

Diferentes procesos de un sistema opera6vo


compiten en ejecucin por adquirir el uso de una
impresora que esta a su vez conectada a varios
equipos dispuestos en una red de rea local. La
cola de impresin es una abstraccin donde se
encolan los procesos a la espera de ser atendidos
por el servidor de impresin
Competicin de procesos por un recurso

En escenarios concurrentes los procesos


productores deben comunicarse con los
consumidores de informacin. Dado que el ritmo
de trabajo de unos y otros no es el mismo se
u6lizan colas de almacenamiento de mensajes
como mecanismo de amor6guacin

6 - 23

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Tipos abstractos de datos lineales. Colas


Problemas y ejercicios

Problemas
Las colas son un 6po abstracto de datos que se u6liza recurrentemente en los problemas de
cierta complejidad de programacin. A con6nuacin planteamos algunos ejemplos de
problemas que se resuelven con el uso de colas.
Enrutamiento de paquetes IP

En las redes de computadoras los disposi6vos de


interconexin u6lizan colas para almacenar la
informacin entrante y entregarla a sus
des6natarios al ritmo que ellos requieran.
Asimismo se u6liza esta tcnica para realizan
propagacin en broadcast o mul6cast
Computacin distribuida

En computacin distribuida se u6lizan sistemas de


mensajera encargados de mover la informacin.
En comunicacin punto a punto las colas se u6lizan
para persis6r los mensajes y garan6zar la entrega.
En comunicacin de eventos varios procesos se
registran como escuchadores de una cola donde
otros se publican eventos de un determinado
tpico
6 - 24

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Tipos abstractos de datos lineales. Colas


Bibliograba

BibliograTa
Bibliografa bsica
Estructuras de datos en java. Weiss, Mark
Allen. Pearson Addison Wesley. ISBN
9788478290352

6 - 25

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Tipos abstractos de datos lineales. Colas


Bibliograba

BibliograTa
Bibliografa complementaria
Estructura de datos y algoritmos en java. A.
Drozdek. Thomsom. ISBN: 9706866116. 2007

6 - 26

Estructuras de datos con Java. J. Lewis, J.


Chase. Pearson Addison Wesley. ISBN 13:
9788420541914

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Grado en Ingeniera Inform8ca . Grado en tecnologas de la


Departamento de Lenguajes y Sistemas informacin
inform6cos

Parte
Tipos abstractos de
III
datos jerrquicos

Estrategias de programacin y estructuras de datos

Javier Vlez Reyes


Jos Ignacio Mayorga Toledano
jvelez@lsi.uned.es nmayorga@lsi.uned.es
Departamento de Lenguajes Y Sistemas InformDcos
UNED

Estrategias de programacin y estructuras de datos


Grado en Ingeniera Inform8ca
Grado en Tecnologas de la Informacin

Departamento de Lenguajes y Sistemas inform6cos

Tipos abstractos de
datos jerrquicos
rboles generales

Javier Vlez Reyes Jos Ignacio Mayorga Toledano


jvelez@lsi.uned.es
nmayorga@lsi.uned.es
Departamento de Lenguajes Y Sistemas InformDcos
UNED

Tipos abstractos de datos jerrquicos. rboles generales


ndice

ndice

Tipos abstractos de datos jerrquicos

El tipo abstracto de datos rbol general

Interfaz del tipo abstracto de datos rbol general

Implementaciones del tipo abstracto de datos rbol general

7-2

Introduccin

Implementacin dinmica

Implementacin esttica con array de posiciones variables

Algoritmos sobre rboles generales

Recorrido de los elementos de un rbol general

Bsqueda de un elemento sobre una rboles general

Problemas y ejercicios

Bibliografa

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Tipos abstractos de datos jerrquicos. rboles generales


Obje6vos generales

Obje8vos

Conocer la interfaz del tipo abstracto de datos rbol general

Aprender a implementar el TAD rbol general mediante la interfaz TreeIF

7-3

En versin esttica (con limitacin explcita de capacidad mxima)

En versin dinmica (sin limitacin explcita de capacidad mxima)

Conocer los principales problemas algortmicos sobre rboles generales

Recorrido de los elementos de un rboles generales

Bsqueda de un elemento sobre un rboles generales

Practicar el diseo de funciones recursivas sobre rboles generales

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Tipos abstractos de datos jerrquicos. rboles generales


Introduccin

Tipos abstractos de datos jerrquicos


Los 6pos abstractos de datos jerrquicos representan abstracciones en las que los datos se
distribuyen a travs de relaciones de parento-lialidad donde cada elemento 6ene un padre
y varios hijos. En funcin del nmero mximo de hijos que puede tener un elemento
dis6nguiremos entre rboles binarios (con 2 hijos como mximo) y rboles generales (sin
limitacin en el nmero de hijos). Aunque los segundos pueden considerarse una
generalizacin de los primeros, ambos presentan implementaciones y escenarios de uso
diferentes lo que jus6ca su consideracin como 6pos dis6ntos
I. rboles generales

Tema 7

Tipos abstractos
de datos lineales

Los rboles generales pueden considerarse a todos los efectos una


generalizacin de los rboles binarios donde el nmero de hijos est
limitado por una constante k > 2 (o no existe limitacin en el nmero
de hijos). Aunque, en principio, es posible expresar todo rbol
general como un rbol binario, existen situaciones en computacin
donde este tipo de abstracciones tiene usos interesantes

Tema 8

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
computacin no slo conjuntos de datos con una relacin de
dependencia padre-hijo sino tambin para articular esquemas de
bsqueda eficientes

7-4

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Tipos abstractos de datos jerrquicos. rboles generales


Introduccin

El 8po abstracto de datos rbol general


Un rbol general es una estructura que organiza una coleccin de elementos a travs de una relacin
de parento-lialidad donde cada elemento dispone a lo sumo de un padre y de un nmero de hijos
no prejado . Si un elemento no 6ene padre se llama nodo raz. En un rbol general hay siempre un y
slo un elemento raz. Si un elemento no 6ene hijos se llama elemento hoja. La denicin
computable del 6po se establece recursivamente de la siguiente manera
Un rbol general es un 6po abstracto de datos que da acceso directo a un
elemento llamado raz y, a un nmero indeterminado de subrboles que dependen
jerrquicamente de l como hijos
Niveles
El nmero de
niveles de un
rbol indica la
separacin
mxima que hay
entre la raz y la
hoja ms
alejada de sta
medida en
nmero de
arcos

7-5

Raz
La raz es el elemento del que
cuelga el resto de nodos

0
1
2
3

4
5

Subrboles
Los rboles generales
pueden tener cualquier
nmero de hijos

7
6

Elemento hoja
Cuando un elemento
no tiene hijos se llama
hoja

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Tipos abstractos de datos jerrquicos. rboles generales


Interfaz del 6po abstracto de datos rbol general

La interfaz del 8po abstracto de datos rbol general TreeIF <T>


El interfaz de rbol general que u6lizaremos a lo largo
de este curso, TreeIF est compuesto por las
operaciones que describimos a con6nuacin
Recorridos
Estas constantes sirven para identificar en el
mtodo getIterator distintas estrategias de
recorrido de los elementos del rbol
1

Obtener raz
Devuelve la raz del rbol. Este mtodo
devuelve un elemento de tipo T distinto de nulo

Establecer raz
Esta operacin establece el valor asignado a la
raz de un del rbol. Si el valor es null la
operacin no tiene efecto

Obtener hijos
Esta operacin consultora devuelve la lista de
todos los subrboles que son hijos del nodo en
curso

Aadir nuevo hijo


A travs de esta operacin se puede aadir un
nuevo subrbol como hijo ms a la derecha en
la coleccin de hijos

7-6

public interface TreeIF <T>


{

public int PREORDER = 0;
public int POSTORDER = 1;
public int LRBREADTH = 2;
public int RLBREADTH = 3;

/**
* Devuelve el elemento raiz del arbol.
* @return el elemento raiz del arbol.
*/
public T getRoot ();

/**
* Establece el elemento raiz.
* @param element El elemento a establecer.
*/
public void setRoot (T element);

/**
* Devuelve el primer los hijos de un arbol.
* @return los hijos de un arbol.
*/
public ListIF <TreeIF <T>> getChildren ();

/**
* Inserta un subarbol como ultimo hijo.
* @param child el hijo a insertar.
*/
public void addChild (TreeIF<T> child);

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Tipos abstractos de datos jerrquicos. rboles generales


Interfaz del 6po abstracto de datos rbol general

La interfaz del 8po abstracto de datos rbol general TreeIF <T>


El interfaz de rbol general que u6lizaremos a lo largo
de este curso, TreeIF est compuesto por las
operaciones que describimos a con6nuacin
Eliminar hijo

A travs de esta operacin se borra el hijo en


la posicin indicada por index en la coleccin

Es hoja

false

Esta operacin consultora indica si el nodo en


curso es un nodo hoja o no lo es

false

Esta operacin consultora indica si el rbol en


curso es vaco o no

true

Es vacio

false
true
true

1,2,3,4

7-7

Bsqueda
Esta operacin busca un elemento dentro de
la estructura jerrquica del rbol

Recorrido
Esta operacin devuelve un iterador que
permite acceder a todos los elementos del
rbol



/**
* Extrae un subarbol como hijo.
* @param index el indice del subarbol con base en 0.
*/
public void removeChild (int index);

/**
* Devuelce cierto si el arbol es un nodo hoja.
* @return cierto si el arbol es un nodo hoja.
*/
public boolean isLeaf ();

/**
* Devuelve cierto si el arbol es vacio.
* @return cierto si el arbol es vacio.
*/
public boolean isEmpty ();

/**
* Devuelve cierto si la lista contiene el elemento.
* @param element El elemento buscado.
* @return cierto si la lista contiene el elemento.
*/
public boolean contains (T element);

/**
* Devuelve un iterador para la lista.
* @param traversalType El tipo de recorrido.
* @return un iterador para la lista.
*/
public IteratorIF<T> getIterator (int traversalType);
}

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Tipos abstractos de datos jerrquicos. rboles generales


Implementacin del 6po abstracto de datos rbol general

Implementacin del 8po abstracto de datos rbol general TreeIF <T>


Existen varias estrategias de implementacin de rboles generales que responden al
interfaz TreeIF. stas se dividen en implementaciones dinmicas, con capacidad indenida
para almacenar elementos e implementaciones est6cas, con una capacidad mxima
limitada establecida por parmetro. A con6nuacin presentamos varias implementaciones

Implementacin dinmica basada en cola de hijos


Segn esta estrategia de implementacin, un rbol es un objeto que representa el nodo
raz del mismo. Cada nodo 6ene un atributo para almacenar el valor del elemento y una
cola de rboles que con6enen referencias a los hijos

1
2

Elemento

Almacena el valor
del dato en el nodo

e
Hijos

7-8

Lista de referencias
a subrboles hijo

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Tipos abstractos de datos jerrquicos. rboles generales


Implementacin del 6po abstracto de datos rbol general

Implementacin dinmica basada en cola de hijos


Segn esta estrategia de implementacin, un rbol es un objeto que representa el nodo
raz del mismo. Cada nodo 6ene un atributo para almacenar el valor del elemento y una
cola de rboles que con6enen referencias a los hijos
public class TreeDynamic <T> implements TreeIF <T> *
{
private T root;
private QueueIF<TreeIF <T>> children;

public TreeDynamic ()
{
this.root = null;
this.children = new QueueDynamic <TreeIF <T>> ();
}

public TreeDynamic (T element)
{
this ();
this.root = element;
}

public TreeDynamic (TreeIF<T> tree)
{
this.root = tree.getRoot ();
this.children = new QueueDynamic <TreeIF <T>> ();

ListIF <TreeIF <T>> tChildren = tree.getChildren ();
while (!tChildren.isEmpty ()) {
TreeIF <T> aChild = tChildren.getFirst ();
TreeIF <T> cChild = new TreeDynamic <T> (aChild);
children.add (cChild);
tChildren = tChildren.getTail ();
}
}

7-9

@Override
public T getRoot ()
{
return this.root;
}

@Override
public ListIF <TreeIF <T>> getChildren ()
{
ListIF <TreeIF <T>> lChildren = new ListDynamic <TreeIF <T>> ();;
StackIF <TreeIF <T>> sChildren = new StackDynamic <TreeIF <T>> ();
IteratorIF<TreeIF<T>> childrenIt = children.getIterator ();
while (childrenIt.hasNext ()) {
TreeIF<T> aChild = childrenIt.getNext ();
sChildren.push (aChild);
}
while (!sChildren.isEmpty ()) {
TreeIF<T> aChild = sChildren.getTop ();
lChildren.insert (aChild);
sChildren.pop ();
}
return lChildren;
}

@Override
public void setRoot (T element)
{
if (element != null) this.root = element;
}

* Los comentarios de las cabeceras se


han omitido por cuestiones de espacio

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Tipos abstractos de datos jerrquicos. rboles generales


Implementacin del 6po abstracto de datos rbol general

Implementacin dinmica basada en cola de hijos


Segn esta estrategia de implementacin, un rbol es un objeto que representa el nodo
raz del mismo. Cada nodo 6ene un atributo para almacenar el valor del elemento y una
cola de rboles que con6enen referencias a los hijos
@Override
public void addChild (TreeIF<T> child)
{
if (this.root != null) children.add (child);
}

@Override
public void removeChild (int index)
{
QueueIF <TreeIF<T>> aux = new QueueDynamic <TreeIF<T>> ();
for (int i = 0; i < children.getLength (); i++) {
TreeIF <T> aChild = children.getFirst ();
if (i != index) aux.add (aChild);
children.remove ();
}
children = aux;
}

@Override
public boolean isLeaf ()
{
return children.isEmpty ();
}

@Override
public boolean isEmpty ()
{
return this.root == null &&
children.isEmpty ();
}

7 - 10

@Override
public boolean contains (T element)
{
if (this.root.equals (element)) return true;
else {
IteratorIF <TreeIF <T>> childrenIt = children.getIterator ();
boolean found = false;
while (!found && childrenIt.hasNext ()) {
TreeIF <T> aChild = childrenIt.getNext ();
found = aChild.contains (element);
}
return found;
}
}

@Override
public IteratorIF<T> getIterator (int type)
{
TreeIF<T> handler = new TreeDynamic<T> (this);
return new TreeIterator<T> (handler, type);
}

@Override
public int hashCode () {...}

@Override
public boolean equals () {...}

@Override
public String toString () {...}
* Los comentarios de las cabeceras se

}
han omitido por cuestiones de espacio

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Tipos abstractos de datos jerrquicos. rboles generales


Implementacin del 6po abstracto de datos rbol general

Implementacin del 8po abstracto de datos rbol general TreeIF <T>


Existen varias estrategias de implementacin rboles generales que responden al interfaz
TreeIF anterior. stas se dividen en implementaciones dinmicas, con capacidad indenida
para almacenar elementos e implementaciones est6cas, con una capacidad mxima
limitada establecida por parmetro. A con6nuacin presentamos varias implementaciones

Implementacin est8ca mediante array de posiciones hijas variables


En esta implementacin un rbol se representa como un array de nodos. El valor del
nodo raz se encuentra en la posicin 0. Cada nodo 6ene el valor del elemento que porta
y la lista de ndices que indican las posiciones dentro del array donde estn los nodos
hijos
Capacidad mxima y longitud

La capacidad se expresa en
nmero de nodos
0

4
7

2
1

3
5
6

7 - 11

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Tipos abstractos de datos jerrquicos. rboles generales


Algoritmos sobre rboles generales

Algoritmos sobre rboles generales


Como viene siendo frecuente a lo largo de este curso, los tres 6pos de algoritmos cannicos
aplicables a cualquier estructura de datos son recorrido, bsqueda y ordenacin. En este
caso, la ordenacin debe entenderse como una reorganizacin de los nodos del rbol para
favorecer algn criterio (^picamente la bsqueda). Sin embargo, no estudiaremos ningn
algoritmo de ordenacin y nos centraremos slo en recorridos y bsquedas
I. Recorrido

II. Bsqueda
La bsqueda de un elemento sobre los nodos de un rbol general se realiza
de forma recursiva dada la definicin 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 aplicacin del algoritmo

7 - 12

Independencia de la
implementacin

Algoritmos
sobre rboles
generales

El recorrido de los elementos de un rbol general devuelve un iterador que


permite acceder secuencialmente a los mismos segn aparecen
almacenados en la estructura. Sin embargo, existen distintos criterios de
secuenciamiento que pueden aplicarse para construir un recorrido. Aqu
estudiaremos los ms tpicamente aplicados

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Tipos abstractos de datos jerrquicos. rboles generales


Algoritmos sobre rboles generales

Recorrido de los elementos de un rbol general


Los recorridos que pueden aplicarse sobre las estructuras arborescentes son varios en
funcin de la estrategia de secuenciamiento que se aplique sobre los elementos del 6po
abstracto de datos. En concreto es posible dis6nguir 4 estrategias organizados de la
siguiente manera
Preorden

Recorridos
sobre rboles

I. Recorridos en profundidad
Se recorre el rbol recursivamente
en profundidad. En funcin de
donde se aloje, relativamente cada
nodo con respecto a sus hijos se
distinguen 2 recorridos

II. Recorridos en anchura


Se recorre el rbol en anchura
colocando primero todos los
elementos del nivel k antes de
pasar a colocar los del nivel k + 1.
En funcin del orden en que se
disponen los elementos por niveles
se distinguen dos recorridos en
anchura

7 - 13

Cada nodo se inserta antes de


la coleccin de nodos
correspondiente a sus
descendentes

S A C O

Postorden
Cada nodo se inserta detrs de
la coleccin de nodos
correspondiente a sus
descendentes

C A O S

Anchura
Se disponen los elementos del
rbol por niveles de izquierda a
derecha y desde la raz a las
hojas

O C A S

Anchura inversa
Se disponen los elementos de
forma inversa a como establece
un recorrido en anchura

S A C O

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Tipos abstractos de datos jerrquicos. rboles generales


Algoritmos sobre rboles generales

Recorrido de los elementos de una rbol general


Para implementar el iterador de los rboles generales u6lizaremos una cola donde se
almacenarn en la construccin los elementos dispuestos adecuadamente segn el 6po de
recorrido seleccionado. La iteracin entonces se delegar en el iterador de esa cola
public class TreeIterator<T> implements IteratorIF<T>
{
private IteratorIF<T> iterator;

/**
* Constructor para TreeIterator.
* @param handler el manejador de arboles.
* @param type el tipo de recorrido.
*/
public TreeIterator (TreeIF<T> handler, int type)
{
QueueIF<T> traverse = null;
switch (type) {
case TreeIF.PREORDER: traverse = preorder (handler); break;
case TreeIF.POSTORDER: traverse = postorder (handler); break;
case TreeIF.LRBREADTH: traverse = lrBreadth (handler); break;
case TreeIF.RLBREADTH: traverse = rlBreadth (handler); break;
}
this.iterator = new QueueIterator<T> (traverse);
}

/**
* Devuelve el siguiente elemento de la iteracion.
* @return el siguiente elemento de la iteracion.
*/
@Override
public T getNext ()
{
return iterator.getNext ();
}

7 - 14

Iteracin con reset


La iteracin de los elementos del rbol se delega
en el iterador de cola que es construido en el
constructor. La funcin de reset est garantizada

Construccin
En funcin del valor del parmetro del tipo de
recorrido, el constructor invoca a una u otra
funcin privada que devuelve una cola con los
elementos dispuestos en el orden apropiado.
Despus se construye un iterador sobre la cola
resultante

Avance
La funcin de avance delega en el iterador de
cola que se ha construido previamente. Esta
aproximacin simplifica las operaciones pero
penaliza el tiempo de la construccin del iterador

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Tipos abstractos de datos jerrquicos. rboles generales


Algoritmos sobre rboles generales

Recorrido de los elementos de una rbol general


Para implementar el iterador de los rboles generales u6lizaremos una cola donde se
almacenarn en la construccin los elementos dispuestos adecuadamente segn el 6po de
recorrido seleccionado. La iteracin entonces se delegar en el iterador de esa cola
/**
* Devuelve cierto si existen mas elementos en el iterador.
* @return cierto si existen mas elementos en el iterador.
*/
@Override
public boolean hasNext ()
Siguiente
{
La funcin de siguiente se delega sobre el
return iterator.hasNext ();
}
iterador de cola. Habr siguientes elementos que

visitar si el iterador de cola an no ha finalizado
/**
* Restablece el iterador para volver a recorrer la estructura.
*/
@Override
Reset
public void reset () {
iterator.reset ();
La funcin de restablecimiento del iterador se
}
delega igualmente sobre el mtodo homnimo del

iterador de colas
private QueueIF<T> preorder (TreeIF<T> tree)
{
QueueIF<T> traverse = new QueueDynamic<T> ();
T element = tree.getRoot ();
Preorden
traverse.add (element);
El recorrido en preorden inserta primero en la
IteratorIF <TreeIF <T>> childrenIt = tree.getChildren ().getIterator ();
cola cada nodo y luego construye recursivamente
while (childrenIt.hasNext ()) {
TreeIF <T> aChild = childrenIt.getNext ();
las colas de los subrboles hijos. Mediante el
QueueIF <T> aTraverse = preorder (aChild);
mtodo addAll dichas colas se aaden, en ese
addAll (traverse, aTraverse);
orden a la cola principal.
}
return traverse;
}

7 - 15

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Tipos abstractos de datos jerrquicos. rboles generales


Algoritmos sobre rboles generales

Recorrido de los elementos de una rbol general


Para implementar el iterador de los rboles generales u6lizaremos una cola donde se
almacenarn en la construccin los elementos dispuestos adecuadamente segn el 6po de
recorrido seleccionado. La iteracin entonces se delegar en el iterador de esa cola
private QueueIF<T> postorder (TreeIF<T> tree)
{
QueueIF<T> traverse = new QueueDynamic<T> ();
T element = 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);
return traverse;
}

private QueueIF<T> lrBreadth (TreeIF<T> tree) {
QueueIF<T> traverse = new QueueDynamic <T> ();
QueueIF<TreeIF<T>> aux = new QueueDynamic <TreeIF<T>> ();

aux.add (tree);
while (!aux.isEmpty ()) {
TreeIF<T> aTree = aux.getFirst ();
T element = 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 ();
}
return traverse;
}

7 - 16

Postorden
El recorrido en postorden inserta
primero los elementos de los subrboles
hijos y despus anexa el nodo en curso.

Anchura
El recorrido en anchura utiliza dos colas
para su construccin. En una se van
insertando los elementos resultantes del
recorrido. La otra es una cola auxiliar
que sirve para almacenar los subrboles
pendientes de ser procesados en cada
paso

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Tipos abstractos de datos jerrquicos. rboles generales


Algoritmos sobre rboles generales

Recorrido de los elementos de una rbol general


Para implementar el iterador de los rboles generales u6lizaremos una cola donde se
almacenarn en la construccin los elementos dispuestos adecuadamente segn el 6po de
recorrido seleccionado. La iteracin entonces se delegar en el iterador de esa cola
private QueueIF<T> rlBreadth (TreeIF<T> tree)
{
QueueIF<T> traverse = lrBreadth (tree);
StackIF<T> aux = new StackDynamic<T> ();
while (!traverse.isEmpty ()) {
T element = traverse.getFirst ();
aux.push (element);
traverse.remove ();
}
while (!aux.isEmpty ()) {
T element = aux.getTop ();
traverse.add (element);
aux.pop ();
}
return traverse;
}

private void addAll (QueueIF<T> q, QueueIF<T> p)
{
while (!p.isEmpty ()) {
T element = p.getFirst ();
q.add (element);
p.remove ();
}
}
}

7 - 17

Anchura inversa
La anchura inversa es el recorrido inverso al
anterior por tanto la implementacin ms 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. Despus se extraen de la
cola para insertarlos en una pilla. Finalmente se
extraen de la pila para insertarlos nuevamente en
la cola

Encolar todos
La funcin addAll inserta en una cola todos los
elementos de una segunda cola

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Tipos abstractos de datos jerrquicos. rboles generales


Algoritmos sobre rboles generales

Bsqueda de un elemento sobre un rbol general


La bsqueda de un dato sobre los elementos contenidos en un rbol general es un
problema de recorrido que termina cuando se encuentra el elemento buscado dentro de la
estructura de datos. Dado que se trata de un 6po con denicin recursiva el algoritmo ser
esencialmente iterar sobre cada hijo para aplicar sobre l recursivamente el algoritmo

Bsqueda recursiva iterada


Como puede apreciarse este algoritmo es agns6co de la estructura de implementacin
subyacente ya que se apoya en operaciones denidas en el interfaz de rbol general
TreeIF. En primer lugar, se comprueba si el nodo raiz coincide con el elemento buscado. Si
es as, hemos terminado. Si no, debemos iterar sobre cada uno de los hijos realizando una
bsqueda con cen6nela en la coleccin de hijos pero recursiva en cada hijo
public boolean contains (T element)
{
if (this.element.equals (element)) return true;
else {
IteratorIF <TreeIF <T>> childrenIt = children.getIterator ();
boolean found = false;
while (!found && childrenIt.hasNext ()) {
TreeIF <T> aChild = childrenIt.getNext ();
found = aChild.contains (element);
}
return found;
}
}

7 - 18

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Tipos abstractos de datos jerrquicos. rboles generales


Problemas y ejercicios

Ejercicios
Pueden encontrarse mul6tud de situaciones donde es necesario manipular la estructura
interna de los elementos de un rbol general. A con6nuacin presentamos algunos
ejercicios que vienen a ejemplicar tales situaciones
I. Contar elementos

II. Sumar elementos

Disee una funcin devuelva el


nmero de elementos que con6ene
un rbol general

IV. Eliminar impares

V. Alturas

Disee una funcin recursiva que


dado un rbol de enteros devuelva
otro rbol solamente con los
elementos pares

VII. Imagen especular

Disee una funcin dado un rbol de


enteros mul6plique el valor en cada
nodo por su altura

Disee una funcin recursiva que


devuelva una lista con todos los
elementos pares de un rbol de
enteros

VI. Comparacin de rboles


Disee una funcin recursiva que
determine si dos rboles generales
son estructuralmente idn6cos

VIII. Sumar anteriores

Disee una funcin recursiva que


indique si dos rboles son la imagen
especular el uno del otro

7 - 19

Disee una funcin que devuelve la


suma de todos los elementos de un
rbol general de enteros

III. Encontrar pares

Disee una funcin que dado un


rbol general de enteros sus6tuya el
valor en cada nodo por el valor
acumulado de todos los nodos
anteriores a el en un recorrido en
profundidad

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Tipos abstractos de datos jerrquicos. rboles generales


Problemas y ejercicios

Problemas
Los rboles generales son un 6po abstracto de datos que se u6liza recurrentemente en los
problemas de cierta complejidad de programacin. A con6nuacin planteamos algunos
ejemplos de problemas que se resuelven con el uso de este 6po abstracto de datos.
Colas de prioridad

Una cola de prioridad es un 6po especial de cola


donde las inserciones se realizan por orden de
acuerdo a un criterio compara6vo entre los
elementos de la cola. La implementacin ms
eciente se realiza con rboles generales donde en
el nivel k estn los elementos de prioridad k
rboles de decisin

En inteligencia ar6cial y minera de datos se


u6lizan rboles de decisin para representar
problemas de decisin. Cada nodo representa un
criterio de decisin y las ramas de ste las posibles
alterna6vas

7 - 20

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Tipos abstractos de datos jerrquicos. rboles generales


Problemas y ejercicios

Problemas
Las rboles generales son un 6po abstracto de datos que se u6liza recurrentemente en los
problemas de cierta complejidad de programacin. A con6nuacin planteamos algunos
ejemplos de problemas que se resuelven con el uso de este 6po abstracto de datos.
Bases de datos

Los datos almacenados en una base de datos


suelen mantenerse ges6onados mediante
estructuras arbreas complejas de un nivel jo de
profundidad (nivel raiz, nivel de pgina, nivel de
hoja y nivel de registro, etc.)
Juegos

La inteligencia ar6cial de muchos juegos de


estrategia, como el ajedrez o las tres en ralla,
u6liza rboles para representar el espacio de
bsqueda de las alterna6vas de movimiento dentro
del juego valorando con una funcin de u6lidad el
benecio, posi6vo o nega6vo, de realizarlo. Una
funcin umbral permite tomar la decisin

7 - 21

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Tipos abstractos de datos jerrquicos. rboles generales


Bibliograca

BibliograUa
Bibliografa bsica
Estructuras de datos en java. Weiss, Mark
Allen. Pearson Addison Wesley. ISBN
9788478290352

7 - 22

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Tipos abstractos de datos jerrquicos. rboles generales


Bibliograca

BibliograUa
Bibliografa complementaria
Estructura de datos y algoritmos en java. A.
Drozdek. Thomsom. ISBN: 9706866116. 2007

7 - 23

Estructuras de datos con Java. J. Lewis, J.


Chase. Pearson Addison Wesley. ISBN 13:
9788420541914

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Estrategias de programacin y estructuras de datos


Grado en Ingeniera Inform8ca
Grado en Tecnologas de la Informacin

Departamento de Lenguajes y Sistemas inform6cos

Tipos abstractos de
datos jerrquicos
rboles binarios

Javier Vlez Reyes Jos Ignacio Mayorga Toledano


jvelez@lsi.uned.es
nmayorga@lsi.uned.es
Departamento de Lenguajes Y Sistemas InformDcos
UNED

Tipos abstractos de datos jerrquicos. rboles binarios


ndice

ndice

Tipos abstractos de datos jerrquicos

El tipo abstracto de datos rbol binario

Interfaz del tipo abstracto de datos rbol binario

Implementaciones del tipo abstracto de datos rbol binario

8-2

Introduccin

Implementacin dinmica

Implementacin esttica con array de posiciones fijas

Implementacin esttica con array de posiciones variables

Algoritmos sobre rboles binarios

Recorrido de los elementos de un rbol binario

Bsqueda de un elemento sobre una rboles binarios

Ordenacin y Equilibrado en rboles binarios

Problemas y ejercicios

Bibliografa
Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Tipos abstractos de datos jerrquicos. rboles binarios


Obje6vos generales

Obje8vos

Conocer la interfaz del tipo abstracto de datos rbol binario

Aprender a implementar el TAD rbol binario mediante la interfaz BTreeIF

8-3

En versin esttica (con limitacin explcita de capacidad mxima)

En versin dinmica (sin limitacin explcita de capacidad mxima)

Conocer los principales problemas algortmicos sobre rboles binarios

Recorrido de los elementos de un rboles binarios

Bsqueda de un elemento sobre un rboles binarios

Ordenacin y equilibrado de un rboles binarios

Practicar el diseo de funciones recursivas sobre rboles binarios

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Tipos abstractos de datos jerrquicos. rboles binarios


Introduccin

Tipos abstractos de datos jerrquicos


Los 6pos abstractos de datos jerrquicos representan abstracciones en las que los datos se
distribuyen a travs de relaciones de parento-lialidad donde cada elemento 6ene un padre
y varios hijos. En funcin del nmero mximo de hijos que puede tener un elemento
dis6nguiremos entre rboles binarios (con 2 hijos como mximo) y rboles generales (sin
limitacin en el nmero de hijos). Aunque los segundos pueden considerarse una
generalizacin de los primeros, ambos presentan implementaciones y escenarios de uso
diferentes lo que jus6ca su consideracin como 6pos dis6ntos
I. rboles generales

Tema 7

Tipos abstractos
de datos lineales

Los rboles generales pueden considerarse a todos los efectos una


generalizacin de los rboles binarios donde el nmero de hijos est
limitado por una constante k > 2 (o no existe limitacin en el nmero
de hijos). Aunque, en principio, es posible expresar todo rbol
general como un rbol binario, existen situaciones en computacin
donde este tipo de abstracciones tiene usos interesantes

Tema 8

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
computacin no slo conjuntos de datos con una relacin de
dependencia padre-hijo sino tambin para articular esquemas de
bsqueda eficientes

8-4

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Tipos abstractos de datos jerrquicos. rboles binarios


Introduccin

El 8po abstracto de datos rbol binario


Un rbol binario es una estructura que organiza una coleccin de elementos a travs de una relacin
de parento-lialidad donde cada elemento dispone a lo sumo de un padre y a lo sumo de 2 hijos. Si
un elemento no 6ene padre se llama nodo raz. En un rbol binario hay siempre un y slo un
elemento raz. Si un elemento no 6ene hijos se llama elemento hoja. La denicin computable del
6po se establece recursivamente de la siguiente manera
Un rbol binario es un 6po abstracto de datos que da acceso directo a un elemento
llamado raz y, a lo sumo, a dos subrboles que dependen jerrquicamente de l
como hijos llamados subrbol izquierdo y subrbol derecho
Niveles
El nmero de
niveles de un
rbol indica la
separacin
mxima que hay
entre la raz y la
hoja ms
alejada de sta
medida en
nmero de
arcos

8-5

Raz
La raz es el elemento del que
cuelga el resto de nodos

0
1
2
3

4
5

rbol binario
Los rboles binarios
pueden tener a lo sumo
dos elementos hijos

7
8
6

Elemento hoja
Cuando un elemento
no tiene hijos se llama
hoja

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Tipos abstractos de datos jerrquicos. rboles binarios


Interfaz del 6po abstracto de datos rbol binario

La interfaz del 8po abstracto de datos rbol binario BTreeIF <T>


El interfaz de rbol binario que u6lizaremos a lo largo
de este curso, BTreeIF est compuesto por las
operaciones que describimos a con6nuacin
Recorridos
Estas constantes sirven para identificar en el
mtodo getIterator distintas estrategias de
recorrido de los elementos del rbol
1

Obtener raz
Devuelve la raz del rbol. Este mtodo
devuelve un elemento de tipo T distinto de nulo

Obtener hijo izquierdo


Esta operacin consultora devuelve el subrbol
que cuelga como hijo izquierdo del rbol sobre
el que se consulta

Obtener hijo derecho


Esta operacin consultora devuelve el subrbol
que cuelga como hijo derecho del rbol sobre
el que se consulta

8-6

public interface BTreeIF <T>


{

public int PREORDER = 0;
public int INORDER = 1;
public int POSTORDER = 2;
public int LRBREADTH = 3;
public int RLBREADTH = 4;

/**
* Devuelve el elemento raiz del arbol.
* @return el elemento raiz del arbol.
*/
public T getRoot ();

/**
* Devuelve el subarbol izquierdo o null si no existe.
* @return el subarbol izquierdo.
*/
public BTreeIF <T> getLeftChild ();

/**
* Devuelve el subarbol derecho o null si no existe.
* @return el subarbol derecho.
*/
public BTreeIF <T> getRightChild ();

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Tipos abstractos de datos jerrquicos. rboles binarios


Interfaz del 6po abstracto de datos rbol binario

La interfaz del 8po abstracto de datos rbol binario BTreeIF <T>


El interfaz de rbol binario que u6lizaremos a lo largo
de este curso, BTreeIF est compuesto por las
operaciones que describimos a con6nuacin
Asignar elemento raz
4

A travs de esta operacin se puede modificar


el valor del elemento raz del rbol referido

Asignar hijo izquierdo


A travs de esta operacin se cambia el
subrbol izquierdo por otro subrbol pasado
como parmetro

Asignar hijo izquierdo


A travs de esta operacin se cambia el
subrbol izquierdo por otro subrbol pasado
como parmetro

Eliminar hijo izquierdo


Esta operacin elimina el subrbol izquierdo. Si
no existe hijo derecho se convierte en hoja

Eliminar hijo derecho


Esta operacin elimina el subrbol derecho. Si
no existe hijo izquierdo se convierte en hoja

8-7



/**
* Establece el elemento raiz.
* @param element El elemento a establecer.
*/
public void setRoot (T element);

/**
* Establece el subarbol izquierdo.
* @param tree el arbol a esablecer.
*/
public void setLeftChild (BTreeIF <T> tree);

/**
* Establece el subarbol derecho.
* @param tree el arbol a esablecer.
*/
public void setRightChild (BTreeIF <T> tree);

/**
* Borra el subarbol izquierdo.
*/
public void removeLeftChild ();

/**
* Borra el subarbol derecho.
*/
public void removeRightChild ();

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Tipos abstractos de datos jerrquicos. rboles binarios


Interfaz del 6po abstracto de datos rbol binario

La interfaz del 8po abstracto de datos rbol binario BTreeIF <T>


El interfaz de rbol binario que u6lizaremos a lo largo
de este curso, BTreeIF est compuesto por las
operaciones que describimos a con6nuacin
falso
cierto

falso
cierto

cierto

Es hoja
Este predicado determina si el elemento de un
rbol es un elemento hoja o no

Es Vacio
Este predicado devuelve cierto si no existe ni
siquiera elemento raz (no existe rbol

Bsqueda

contains (3)

Este predicado busca un elemento dentro de


todo el rbol. Devuelve cierto si el rbol
contiene el elemento

inorden

Devuelve un iterador que permite recorrer los


elementos del rbol. Los tipos de recorridos
(ver principio) son preorden, inorden,
postorden, anchura y anchura inversa

Recorrido
2,1,3

8-8



/**
* Devuelce cierto si el arbol es un nodo hoja.
* @return cierto si el arbol es un nodo hoja.
*/
public boolean isLeaf ();

/**
* Devuelve cierto si el arbol es vacio.
* @return cierto si el arbol es vacio.
*/
public boolean isEmpty ();

/**
* Devuelve cierto si el arbol contiene el elemento.
* @param element El elemento buscado.
* @return cierto si el arbol contiene el elemento.
*/
public boolean contains (T element);

/**
* Devuelve un iterador para el arbol.
* @param traversalType El tipo de recorrido.
* @return un iterador para el arbol.
*/
public IteratorIF<T> getIterator (int traversalType);
}

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Tipos abstractos de datos jerrquicos. rboles binarios


Implementacin del 6po abstracto de datos rbol binario

Implementacin del 8po abstracto de datos rbol binario BTreeIF <T>


Existen varias estrategias de implementacin rboles binarios que responden al interfaz
BTreeIF anterior. stas se dividen en implementaciones dinmicas, con capacidad indenida
para almacenar elementos e implementaciones est6cas, con una capacidad mxima
limitada establecida por parmetro. A con6nuacin presentamos varias implementaciones

Implementacin dinmica basada en enlaces izquierdo y derecho


Segn esta estrategia de implementacin, un rbol es un objeto que representa el nodo
raz del mismo. Cada nodo 6ene un atributo para almacenar el valor del elemento y dos
atributos de 6po rbol binario para referenciar a los subrboles izquierdo y derecho

Derecho

Elemento

Referencia al
hijo derecho

Almacena el valor
del dato en el nodo

5 -

Izquierdo

3 -

8-9

4 -

6 -

Referencia al
hijo izquierdo

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Tipos abstractos de datos jerrquicos. rboles binarios


Implementacin del 6po abstracto de datos rbol binario

Implementacin dinmica basada en enlaces izquierdo y derecho


Segn esta estrategia de implementacin, un rbol es un objeto que representa el nodo
raz del mismo. Cada nodo 6ene un atributo para almacenar el valor del elemento y dos
atributos de 6po rbol binario para referencias a los subrboles izquierdo y derecho
public class BTreeDynamic <T> implements BTreeIF <T> *
{
private T root;
private BTreeIF<T> left;
private BTreeIF<T> right;

public BTreeDynamic ()
{
this.root = null;
this.left = null;
this.right = null;
}

public BTreeDynamic (T element)
{
this ();
this.setRoot (element);
}

public BTreeDynamic (BTreeIF<T> tree)
{
this ();
T tRoot = tree.getRoot ();
BTreeIF<T> tLeft = tree.getLeftChild ();
BTreeIF<T> tRight = tree.getRightChild ();

this.setRoot (tRoot);
this.setLeftChild (new BTreeDynamic<T> (tLeft));
this.setRightChild (new BTreeDynamic<T> (tRight));
}

8 - 10

@Override
public T getRoot ()
{
return this.root;
}

@Override
public BTreeIF <T> getLeftChild ()
{
return this.left;
}

@Override
public BTreeIF <T> getRightChild ()
{
return this.right;
}

@Override
public void setRoot (T element)
{
if (element != null)
this.root = element;
}

@Override
public void setLeftChild (BTreeIF<T> tree)
{
this.left = tree;
}

* Los comentarios de las cabeceras se


han omitido por cuestiones de espacio

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Tipos abstractos de datos jerrquicos. rboles binarios


Implementacin del 6po abstracto de datos rbol binario

Implementacin dinmica basada en enlaces izquierdo y derecho


Segn esta estrategia de implementacin, un rbol es un objeto que representa el nodo
raz del mismo. Cada nodo 6ene un atributo para almacenar el valor del elemento y dos
atributos de 6po rbol binario para referencias a los subrboles izquierdo y derecho
@Override
public void setRightChild (BTreeIF<T> tree)
{
this.right = tree;
}

@Override
public void removeLeftChild ()
{
this.left = null;
}

@Override
public void removeRightChild ()
{
this.right = null;
}

@Override
public boolean isLeaf ()
{
return this.root != null &&
this.left == null &&
this.right == null;
}

@Override
public boolean isEmpty ()
{
return this.root == null;
}

8 - 11

@Override
public boolean contains (T element)
{
return this.root.equals (element) ||
this.left.contains (element) ||
this.right.contains (element);
}

@Override
public IteratorIF<T> getIterator (int type)
{
BTreeIF<T> handler = new BTreeDynamic<T> (this);
return new BTreeIterator<T> (handler, type);
}

@Override
public int hashCode ()
{
return 31 * 31 * ((root == null) ? 0 : root.hashCode ()) +
31 * ((left == null) ? 0 : left.hashCode ()) +
((right == null) ? 0 : right.hashCode ());
}

@SuppressWarnings("unchecked")
@Override
public boolean equals (Object o) {...}

@Override
public String toString () {...}
}

* Los comentarios de las cabeceras se


han omitido por cuestiones de espacio

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Tipos abstractos de datos jerrquicos. rboles binarios


Implementacin del 6po abstracto de datos rbol binario

Implementacin del 8po abstracto de datos rbol binario BTreeIF <T>


Existen varias estrategias de implementacin rboles binarios que responden al interfaz
BTreeIF anterior. stas se dividen en implementaciones dinmicas, con capacidad indenida
para almacenar elementos e implementaciones est6cas, con una capacidad mxima
limitada establecida por parmetro. A con6nuacin presentamos varias implementaciones

Implementacin est8ca mediante array de posiciones hijas jas


En esta implementacin un rbol se representa como un array de elementos. El valor del
elemento raz se encuentra en la posicin 0. Para el elemento en la posicin i, su hijo
izquierdo, si hay, estar en la posicin 2*i+1 y su hijo derecho en la posicin 2*i+2
0

derecho

0 1 2 3 4 5 6 7 8 9 0 1 2 3 4

0 1 7 2 4 8 9 3 - 5 6 - - - -
izquierdo

Capacidad mxima y longitud


Niveles = 4

8 - 12

La capacidad de esta implementacin se expresa en


trminos del nmero mximo de niveles. Si n es el
nmero mximo de niveles hace falta un vector de
tamao 2n+1. El rbol debe estar equilibrado y casi
completo para un aprovechamiento eciente

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Tipos abstractos de datos jerrquicos. rboles binarios


Implementacin del 6po abstracto de datos rbol binario

Implementacin del 8po abstracto de datos rbol binario BTreeIF <T>


Existen varias estrategias de implementacin rboles binarios que responden al interfaz
BTreeIF anterior. stas se dividen en implementaciones dinmicas, con capacidad indenida
para almacenar elementos e implementaciones est6cas, con una capacidad mxima
limitada establecida por parmetro. A con6nuacin presentamos varias implementaciones

Implementacin est8ca mediante array de posiciones hijas variables


En esta implementacin un rbol se representa como un array de nodos. El valor del
nodo raz se encuentra en la posicin 0. Cada nodo 6ene el valor del elemento que porta
y dos ndices que indican las posiciones dentro del array donde estn los nodos hijos
Capacidad mxima y longitud
Ahora la capacidad se expresa en nmero de
nodos y el rbol no tiene porqu estas equilibrado
0 1 2 3 4 5 6 7 8 9

Niveles = 4

8 - 13

0
6
3

7
1
6

1
-
-

elemento
ndice izquierdo
ndice derecho

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Tipos abstractos de datos jerrquicos. rboles binarios


Algoritmos sobre rboles binarios

Algoritmos sobre rboles binarios


Como viene siendo frecuente a lo largo de este curso, los tres 6pos de algoritmos cannicos
aplicables a cualquier estructura de datos son recorrido, bsqueda y ordenacin. En este
caso, la ordenacin debe entenderse como una reorganizacin de los nodos del rbol para
favorecer algn criterio (`picamente la bsqueda). Sin embargo, no estudiaremos ningn
algoritmo de ordenacin y nos centraremos slo en recorridos y bsquedas
I. Recorrido

II. Bsqueda
La bsqueda de un elemento sobre los nodos de un rbol binario se realiza
de forma recursiva dada la definicin 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 aplicacin del algoritmo

8 - 14

Independencia de la
implementacin

Algoritmos
sobre rboles
binarios

El recorrido de los elementos de un rbol binario devuelve un iterador que


permite acceder secuencialmente a los mismos segn aparecen
almacenados en la estructura. Sin embargo, existen distintos criterios de
secuenciamiento que pueden aplicarse para construir un recorrido. Aqu
estudiaremos los 5 ms tpicamente aplicados

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Tipos abstractos de datos jerrquicos. rboles binarios


Algoritmos sobre rboles binarios

Recorrido de los elementos de un rbol binario


Los recorridos que pueden aplicarse sobre las estructuras arborescentes son varios en
funcin de la estrategia de secuenciamiento que se aplique sobre los elementos del 6po
abstracto de datos. En concreto es posible dis6nguir 5 estrategias organizados de la
siguiente manera
Preorden

Recorridos
sobre rboles

I. Recorridos en profundidad
Se recorre el rbol recursivamente
en profundidad. En funcin 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

S A C O

Inorden
Cada nodo se inserta entre sus
hijos izquierdos y derechos

C A S O

Postorden
Cada nodo se inserta detrs de
sus hijos izquierdos y derechos

Se recorre el rbol en anchura


colocando primero todos los
elementos del nivel k antes de
pasar a colocar los del nivel k + 1.
En funcin del orden en que se
disponen los elementos por niveles
se distinguen dos recorridos en
anchura

8 - 15

Cada nodo se inserta antes de


sus hijos izquierdos y derechos

c A O S

Anchura
Se disponen los elementos del
rbol por niveles de izquierda a
derecha y desde la raz a las
hojas

O C A S

Anchura inversa
Se disponen los elementos de
forma inversa a como establece
un recorrido en anchura

S A C O

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Tipos abstractos de datos jerrquicos. rboles binarios


Algoritmos sobre rboles binarios

Recorrido de los elementos de una rbol binario


Para implementar el iterador de los rboles binarios u6lizaremos una cola donde se
almacenarn en la construccin los elementos dispuestos adecuadamente segn el 6po de
recorrido seleccionado. La iteracin entonces se delegar en el iterador de esa cola
class BTreeIterator<T> implements IteratorIF<T>
{
private IteratorIF<T> iterator;

/**
* Constructor para QueueIterator.
* @param handler el manejador de arboles binarios.
* @param type el tipo de recorrido.
*/
public BTreeIterator (BTreeIF<T> handler, int type)
{
QueueIF<T> traverse = null;
switch (type) {
case BTreeIF.PREORDER: traverse = preorder (handler); break;
case BTreeIF.INORDER: traverse = inorder (handler); break;
case BTreeIF.POSTORDER: traverse = postorder (handler); break;
case BTreeIF.LRBREADTH: traverse = lrBreadth (handler); break;
case BTreeIF.RLBREADTH: traverse = rlBreadth (handler); break;
}
this.iterator = new QueueIterator<T> (traverse);
}

/**
* Devuelve el siguiente elemento de la iteracion.
* @return el siguiente elemento de la iteracion.
*/
@Override
public T getNext ()
{
return iterator.getNext ();
}

8 - 16

Iteracin con reset


La iteracin de los elementos del rbol se delega
en el iterador de cola que es construido en el
constructor. La funcin de reset est garantizada

Construccin
En funcin del valor del parmetro del tipo de
recorrido, el constructor invoca a una u otra
funcin privada que devuelve una cola con los
elementos dispuestos en el orden apropiado.
Despus se construye un iterador sobre la cola
resultante

Avance
La funcin de avance delega en el iterador de
cola que se ha construido previamente. Esta
aproximacin simplifica las operaciones pero
penaliza el tiempo de la construccin del iterador

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Tipos abstractos de datos jerrquicos. rboles binarios


Algoritmos sobre rboles binarios

Recorrido de los elementos de una rbol binario


Para implementar el iterador de los rboles binarios u6lizaremos una cola donde se
almacenarn en la construccin los elementos dispuestos adecuadamente segn el 6po de
recorrido seleccionado. La iteracin entonces se delegar en el iterador de esa cola
/**
* Devuelve cierto si existen mas elementos en el iterador.
* @return cierto si existen mas elementos en el iterador.
*/
@Override
public boolean hasNext ()
{
return iterator.hasNext ();
}

/**
* Restablece el iterador para volver a recorrer la estructura.
*/
@Override
public void reset ()
{
iterator.reset ();
}

private QueueIF<T> preorder (BTreeIF<T> tree)
{
QueueIF<T> traverse = new QueueDynamic<T> ();
if (tree == null) return traverse;
T element = 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);
return traverse; }

8 - 17

Siguiente
La funcin de siguiente se delega sobre el
iterador de cola. Habr siguientes elementos que
visitar si el iterador de cola an no ha finalizado

Reset
La funcin de restablecimiento del iterador se
delega igualmente sobre el mtodo homnimo del
iterador de colas

Preorden
El recorrido en preorden inserta primero en la
cola cada nodo y luego construye recursivamente
las colas de los subrboles izquierdo y derecho.
Mediante el mtodo allAll dichas colas se aaden,
en ese orden a la cola principal.

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Tipos abstractos de datos jerrquicos. rboles binarios


Algoritmos sobre rboles binarios

Recorrido de los elementos de una rbol binario


Para implementar el iterador de los rboles binarios u6lizaremos una cola donde se
almacenarn en la construccin los elementos dispuestos adecuadamente segn el 6po de
recorrido seleccionado. La iteracin entonces se delegar en el iterador de esa cola

8 - 18

private QueueIF<T> inorder (BTreeIF<T> tree) {


QueueIF<T> traverse = new QueueDynamic<T> ();
Inorden
if (tree == null) return traverse;
T element = tree.getRoot ();
El recorrido en inorden inserta primero en la cola,
BTreeIF<T> lTree = tree.getLeftChild ();
los elementos del subrbol izquierdo, luego el
BTreeIF<T> rTree = tree.getRightChild ();
nodo en curso y finalmente los elementos del
QueueIF<T> lTraverse = inorder (lTree);
QueueIF<T> rTraverse = inorder (rTree);
subrbol derecho.
addAll (traverse, lTraverse);
traverse.add (element);
addAll (traverse, rTraverse);
return traverse; }

private QueueIF<T> postorder (BTreeIF<T> tree) {
QueueIF<T> traverse = new QueueDynamic<T> ();
Postorden
if (tree == null) return traverse;
T element = tree.getRoot ();
El recorrido en postorden inserta primero los
BTreeIF<T> lTree = tree.getLeftChild ();
elementos de los subrboles izquierdo y derecho
BTreeIF<T> rTree = tree.getRightChild ();
y despus anexa el nodo en curso.
QueueIF<T> lTraverse = postorder (lTree);
QueueIF<T> rTraverse = postorder (rTree);
addAll (traverse, lTraverse);
addAll (traverse, rTraverse);
traverse.add (element);
return traverse; }

private void addAll (QueueIF<T> q, QueueIF<T> p) {
Encolar todos
while (!p.isEmpty ()) {
T element = p.getFirst ();
La funcin addAll inserta en una cola todos los
q.add (element);
elementos de una segunda cola
p.remove (); }
}

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned

.es

Tipos abstractos de datos jerrquicos. rboles binarios


Algoritmos sobre rboles binarios

Recorrido de los elementos de una rbol binario


Para implementar el iterador de los rboles binarios u6lizaremos una cola donde se
almacenarn en la construccin los elementos dispuestos adecuadamente segn el 6po de
recorrido seleccionado. La iteracin entonces se delegar en el iterador de esa cola
private QueueIF<T> lrBreadth (BTreeIF<T> tree) {
QueueIF<T> traverse = new QueueDynamic<T> ();
QueueIF<BTreeIF<T>> aux = new QueueDynamic<BTreeIF<T>> ();
aux.add (tree);
while (!aux.isEmpty ()) {
BTreeIF<T> aTree = aux.getFirst ();
T element = 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 ();
}
return traverse;
}

private QueueIF<T> rlBreadth (BTreeIF<T> tree) {
QueueIF<T> traverse = lrBreadth (tree);
StackIF<T> aux = new StackDynamic<T> ();
while (!traverse.isEmpty ()) {
T element = traverse.getFirst ();
aux.push (element);
traverse.remove ();
}
while (!aux.isEmpty ()) {
T element = aux.getTop ();
traverse.add (element);
aux.pop ();
}
return traverse;
}

8 - 19

Anchura
El recorrido en anchura utiliza dos colas para su
construccin. En una se van insertando los
elementos resultantes del recorrido. La otra es
una cola auxiliar que sirve para almacenar los
subrboles pendientes de ser procesados en
cada paso

Anchura inversa
La anchura inversa es el recorrido inverso al
anterior por tanto la implementacin ms 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. Despus se extraen de la
cola para insertarlos en una pilla. Finalmente se
extraen de la pila para insertarlos nuevamente en
la cola

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Tipos abstractos de datos jerrquicos. rboles binarios


Algoritmos sobre rboles binarios

Bsqueda de un elemento sobre un rbol binario


La bsqueda de un dato sobre los elementos contenidos en un rbol binario es un problema
de recorrido que termina cuando se encuentra el elemento buscado dentro de la estructura
de datos. Dado que se trata de un 6po con denicin recursiva es posible aplicar dos 6pos
de algoritmos. La bsqueda aplica una estrategia recursiva para recorrer en profundidad el
rbol. Alterna6vamente tambin se puede encontrar una solucin itera6va basada en
bsqueda con cen6nela u6lizando alguno de los recorridos secuenciales que acabamos de
describir.

Bsqueda binaria
Es esta implementacin se realiza una
bsqueda con recursiva sobre la estructura
de nodos del rbol. El recorrido corresponde
a un preorden
@Override
public boolean contains (T element)
{
if (element == null) return false;
return element.equals (getRoot ()) ||
(getLeftChild () != null) ?
getLeftChild ().contains (element) : false ||
(getRightChild () != null) ?
getRightChild ().contains (element) : false;
}

8 - 20

Bsqueda con cen8nela


En la bsqueda con cen6nela la solucin
itera sobre los elementos de la estructura
obtenidos a par6r de un iterador de
cualquier 6po de recorrido (por ejemplo
inorden)
@Override
public boolean contains (T element)
{
boolean found = false;
Iterator<T> it = getIterator (this, BTreeIF.INORDER);
while (!found && it.hasNext ()) {
T anElement = it.getNext ();
found = anElement.equals (element);
}
return found;
}

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Tipos abstractos de datos jerrquicos. rboles binarios


Algoritmos sobre rboles binarios

rboles binarios de bsqueda


Los rboles binarios de bsqueda son u6lizados para disponer los elementos de un
conjunto de tal forma que se op6mice la localizacin de los mismos alcanzndose un coste
temporal logartmico con respecto al volumen de datos medido para el peor caso. La
disposicin de los elementos debe seguir, naturalmente, ciertos criterios de orden
Un rbol binario es de bsqueda si es vacio o la raz es mayor que el mximo
elemento del subrbol izquierdo y menor que el mnimo elemento del subrbol
derecho y, a su vez, ambos subrboles son rboles binarios de bsqueda
En efecto, este es un rbol binario de bsqueda
puesto que verica que todos los elementos en el
subrbol izquierdo de cada nodo son menores
que dicho nodo y los que se encuentran en el
subrbol derecho mayores que el mismo

14

8 - 21

10

13

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Tipos abstractos de datos jerrquicos. rboles binarios


Algoritmos sobre rboles binarios

rboles binarios de bsqueda


Los rboles binarios de bsqueda son u6lizados para disponer los elementos de un
conjunto de tal forma que se op6mice la localizacin de los mismos alcanzndose un coste
temporal logartmico con respecto al volumen de datos medido para el peor caso. La
disposicin de los elementos debe seguir, naturalmente, ciertos criterios de orden

rboles equilibrados
Para garan6zar realmente un coste logartmico en la bsqueda es necesario asegurarse de
que la estructura se man6ene equilibrada. Es decir, que la proporcin de nodos a la
izquierda y derecha de cualquier nodo sea la misma
Un rbol de bsqueda es equilibrado si

6
5

la altura de los subrboles izquierdo y


2

derecho es exactamente la misma


3

7
2

En una estructura jerrquica


equilibrada el coste de la
bsqueda es O (log n)

8 - 22

Si el rbol binario de
b s q u e d a n o e s t
equilibrado, en el caso
peor se puede llegar a
c o n v e r D r e n u n a
estructura lineal con
coste O(n)

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Tipos abstractos de datos jerrquicos. rboles binarios


Algoritmos sobre rboles binarios

rboles binarios de bsqueda


Los rboles binarios de bsqueda son u6lizados para disponer los elementos de un
conjunto de tal forma que se op6mice la localizacin de los mismos alcanzndose un coste
temporal logartmico con respecto al volumen de datos medido para el peor caso. La
disposicin de los elementos debe seguir, naturalmente, ciertos criterios de orden

Estrategias de equilibrado y rotaciones


Dado que la estructuracin jerrquica de los rboles de bsqueda no responde a un
requisito del problema sino a una disposicin conveniente de los datos es posible cambiar
la misma segn se hacen inserciones o extracciones para mantener el equilibrio. Las
rotaciones se encargan de ello (vase hap://qma6ca.com)
Rotacin simple a derechas
8

6
n

n+1

8 - 23

4
10

Rotacin simple a izquierdas

2
6

8
6

10

n
n+1

n+1

n+1

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Tipos abstractos de datos jerrquicos. rboles binarios


Algoritmos sobre rboles binarios

rboles binarios de bsqueda


Los rboles binarios de bsqueda son u6lizados para disponer los elementos de un
conjunto de tal forma que se op6mice la localizacin de los mismos alcanzndose un coste
temporal logartmico con respecto al volumen de datos medido para el peor caso. La
disposicin de los elementos debe seguir, naturalmente, ciertos criterios de orden

Estrategias de equilibrado y rotaciones


Dado que la estructuracin jerrquica de los rboles de bsqueda no responde a un
requisito del problema sino a una disposicin conveniente de los datos es posible cambiar
la misma segn se hacen inserciones o extracciones para mantener el equilibrio. Las
rotaciones se encargan de ello (vase hap://qma6ca.com)
Rotacin doble a derechas
7

9
5
1

8 - 24

6
n
n+1

n+1

10

10

n+1

n+1

n+1
n+1

10

8
n

n+1

3
7

n+1
n+1

10
7

Rotacin doble a izquierdas

n
n

n+1

n+1

n+1

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Tipos abstractos de datos jerrquicos. rboles binarios


Algoritmos sobre rboles binarios

rboles binarios de bsqueda


Los rboles binarios de bsqueda son u6lizados para disponer los elementos de un
conjunto de tal forma que se op6mice la localizacin de los mismos alcanzndose un coste
temporal logartmico con respecto al volumen de datos medido para el peor caso. La
disposicin de los elementos debe seguir, naturalmente, ciertos criterios de orden

Tipos de rboles de bsqueda


Dado que la restriccin acerca del equilibrio es demasiado fuerte, se han ideado algunos
6pos de rboles de bsqueda cuasi-equilibrados que aplican las rotaciones anteriores como
eje fundamental del mantenimiento logartmico de las operaciones de localizacin
rboles AVL
En los rboles AVT las alturas de los hijos izquierdo y
derecho de cada subrbol slo pueden diferir, a lo sumo
en una unidad aplicndose rotaciones para el
reequilibrado. Insercin y borrado son logartmicas. La
primera debido a un coste constante de la rotacin. La
segunda porque la propagacin solo se exDende hasta la
raz Para el resto de operaciones, el coste temporal,
tanto promedio como en el caso peor, es tambin
logartmico aunque su coste espacial resulta lineal.
[Weiss, 484-492] [Drozdek, 255-260]

8 - 25

rboles roji negros


Los rboles roji-negros son estructuras auto-equilibradas en
la que los nodos Denen un atributo adicional, su color (rojo o
negro). La raz es siempre negra. Los dos hijos de un nodo
rojo deben ser negros. Todas las hojas son negras. Y todos los
caminos desde un nodo antecesor hasta cualquiera de sus
hojas deben contener el mismo nmero de nodos negros. Se
uDlizan rotaciones para reequilibrar. Se pueden eliminar el
segundo recorrido de los AVL mediante una transformacin
descendente de algunos de los nodos (cambio de color,
insercin de una hoja y rotacin). Sin embargo, el borrado
Dene una codicacin compleja. Su coste temporal es
logartmico. [Weiss, 492-505]

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Tipos abstractos de datos jerrquicos. rboles binarios


Algoritmos sobre rboles binarios

rboles binarios de bsqueda


Los rboles binarios de bsqueda son u6lizados para disponer los elementos de un
conjunto de tal forma que se op6mice la localizacin de los mismos alcanzndose un coste
temporal logartmico con respecto al volumen de datos medido para el peor caso. La
disposicin de los elementos debe seguir, naturalmente, ciertos criterios de orden

Tipos de rboles de bsqueda


Dado que la restriccin acerca del equilibrio es demasiado fuerte, se han ideado algunos
6pos de rboles de bsqueda cuasi-equilibrados que aplican las rotaciones anteriores como
eje fundamental del mantenimiento logartmico de las operaciones de localizacin
rboles AA
Los rboles AA son una variante de los roji-negros cuyo
atributo adicional es el nivel en lugar del color. El nivel
representa el nmero de enlaces a hijos izquierdos en el
camino hacia la hoja (para las hojas 1). Un padre rojo y
su hijo se conectan por un enlace horizontal y Denen el
mismo nivel. El nivel del hijo de un padre negro ser una
unidad menos que el de su padre . La insercin siempre
se realiza en el nivel ms bajo del rbol. Se uDlizan
rotaciones simples para reequilibrar si es preciso. El
borrado se limita a la eliminacin de un nodo de nivel 1.
Su coste espacial y temporal es igual al de los rojinegros
aunque los rboles AA se suelen aplanar algo ms.
[Weiss, 505-512]

8 - 26

rboles B
Los rboles B son una generalizacin de los rboles binarios
de bsqueda en los que un nodo interno puede tener ms de
dos hijos hasta un cierto lmite. OpDmizan la lectura de
grandes bloques de datos. Un rbol B de orden k es un rbol
k-ario en que los datos se almacenan en las hojas. Un nodo
interno contendr k-1 claves de bsqueda, donde la j-sima
clave ser la menor del rbol j+1-simo. La raz bien ser una
hoja bien tendr un rango de hijos entre 2 y k. Los nodos
internos Denen entre k/2 y k hijos. La profundidad de todas
las hojas es la misma y Denen entre h/2 y h hijos, donde h es
un valor constante y prejado. Al maximizar el nmero de
hijos la altura decrece reducindose el coste de acceso
(logaritmo en base k) y los reequilibrios. [Weiss, 512-519]

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Tipos abstractos de datos jerrquicos. rboles binarios


Problemas y ejercicios

Ejercicios
Pueden encontrarse mul6tud de situaciones donde es necesario manipular la estructura
interna de los elementos de un rbol binario. A con6nuacin presentamos algunos
ejercicios que vienen a ejemplicar tales situaciones
I. Contar elementos

II. Sumar elementos

Disee una funcin devuelva el


nmero de elementos que con6ene
un rbol binario

IV. Eliminar impares

V. Equilibrar

Disee una funcin recursiva que


dado un rbol binario de enteros
devuelva otro rbol solamente con
los elementos pares

VII. Imagen especular

Disee una funcin que reorganice


los elementos de un rbol para
conver6rlo en rbol binario de
bsqueda

VIII. Sumar anteriores

Disee una funcin recursiva que


indique si dos rboles binarios son la
imagen especular el uno del otro

8 - 27

Disee una funcin que devuelve la


suma de todos los elementos de un
rbol binario de enteros

Disee una funcin que dado un


rbol binario de enteros sus6tuya el
valor en cada nodo por el valor
acumulado de todos los nodos
anteriores a l en un recorrido en
profundidad

III. Encontrar pares


Disee una funcin recursiva que
devuelva una lista con todos los
elementos pares de un rbol de
enteros

VI. Comparacin de rboles


Disee una funcin recursiva que
determine si dos rboles binarios son
estructuralmente idn6cos

IX. Es rbol de bsqueda


Disee una funcin que determine si
un rbol binario es un rbol binario
de bsqueda

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Tipos abstractos de datos jerrquicos. rboles binarios


Problemas y ejercicios

Problemas
Las rboles binarios son un 6po abstracto de datos que se u6liza recurrentemente en los
problemas de cierta complejidad de programacin. A con6nuacin planteamos algunos
ejemplos de problemas que se resuelven con el uso de este 6po abstracto de datos.
rboles sintcticos de operadores

La forma en que los compiladores manejan las


expresiones aritm6co-lgicas es mediante el uso
de un rbol sintc6co donde los nodos hoja
corresponden a operandos y los intermedios a
operaciones. Sabra idear un algoritmo que
calcule el valor de la siguiente expresin aritm6ca
expresada en forma de un rbol binario?
Juegos y representacin de escenarios 3D

En los motores de renderizado 3D (ampliamente


u6lizados en el desarrollo de juegos en subje6vo) la
representacin de los escenarios tridimensionales
u6liza rboles binarios para descomponer las
texturas poligonales en formas progresivamente
ms sencillas.
8 - 28

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Tipos abstractos de datos jerrquicos. rboles binarios


Problemas y ejercicios

Problemas
Las rboles binarios son un 6po abstracto de datos que se u6liza recurrentemente en los
problemas de cierta complejidad de programacin. A con6nuacin planteamos algunos
ejemplos de problemas que se resuelven con el uso de este 6po abstracto de datos.
Diccionarios

Como aplicacin especica de los rboles de


bsqueda binarios aparecen los diccionarios. Un
diccionario es una estructura jerrquica sobre la
cual se disponen los trminos en las hojas mientras
que los nos intermedios son prejos organizados
lexicogrcamente
Codificacin Huffman

La codicacin Human es una tcnica de


compresin de datos que asigna representaciones
de longitud variable a cada dato en funcin se su
probabilidad de aparicin (mayor probabilidad,
menor longitud). La tabla de correspondencias
suele representarse en forma de rbol binario (0
izquierda, 1 derecha) para representar la cadena
de 0s y 1s que representa cada dato
8 - 29

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Tipos abstractos de datos jerrquicos. rboles binarios


Bibliograia

BibliograTa
Bibliografa bsica
Estructuras de datos en java. Weiss, Mark
Allen. Pearson Addison Wesley. ISBN
9788478290352

8 - 30

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Tipos abstractos de datos jerrquicos. rboles binarios


Bibliograia

BibliograTa
Bibliografa complementaria
Estructura de datos y algoritmos en java. A.
Drozdek. Thomsom. ISBN: 9706866116. 2007

8 - 31

Estructuras de datos con Java. J. Lewis, J.


Chase. Pearson Addison Wesley. ISBN 13:
9788420541914

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

You might also like