Professional Documents
Culture Documents
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
Presentacin
Estrategias
de
programacin
y
estructuras
de
datos
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
Tipo
Troncal Anual
Curso
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
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
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
NE = Nota Examen
NP = Nota Prctica
0-6
22 .es
Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned
Introduccin
Introduccin
ndice
ndice
Introduccin
1-2
Bibliografa
Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es
Introduccin
Obje6vos
generales
Obje8vos
1-3
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
Vehculo
Tipos abstractos
de datos
Diagnos6co
Reparacin
Elctrica
Mecnica
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
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
Vehculo
+
arrancar
()
+
parar
()
Garaje
+ Reparar (Vehculo v)
Tipos abstractos
de datos
usa
Programacin
orientada a objetos
1-6
Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es
Introduccin
Programacin
orientada
a
objetos
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
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
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
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
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
-
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
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
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
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
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
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
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;
...
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
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;
...
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
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
Moto
Coche
Camin
+
arrancar
()
+
parar
()
+
arrancar
()
+
parar
()
+
arrancar
()
+
parar
()
+
llenar
()
Tipo Camin
Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es
Introduccin
Programacin
orientada
a
objetos
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
Vehculo
Tipo Camin
1 - 18
Moto
Coche
Camin
+
arrancar
()
+
parar
()
+
arrancar
()
+
parar
()
+
arrancar
()
+
parar
()
+
llenar
()
Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es
Introduccin
Programacin
orientada
a
objetos
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
+
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
Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es
Introduccin
Programacin
orientada
a
objetos
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)
1 - 20
Lavando camin...
Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es
Introduccin
Programacin
orientada
a
objetos
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
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
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
un
8po
abstracto
II.
Parte
semn8ca
de
datos
Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es
Introduccin
Tipos
abstractos
de
datos
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)
...
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
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
()
...
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
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
()
...
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
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
()
...
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
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
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
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
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
Partes
de
un
contrato
I.
Precondiciones
II. Postcondiciones
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
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
A
B
1 - 33
A
B
Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es
Introduccin
Tipos
abstractos
de
datos
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
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
A
B
Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es
Introduccin
Tipos
abstractos
de
datos
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
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
A
/*
...*/
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
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 ()
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
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
Interfaz
Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es
Introduccin
Tipos
abstractos
de
datos
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
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
Estructura
s
lineales
Estructuras
circulares
Estructuras
jerarquas
Estructuras
indexadas
Estructuras
tabulares
Conjuntos
Bolsas
Pilas
Listas
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
9788478290352
978-84-8322-040-5
Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es
Estrategias
de
programacin
Estrategias
de
programacin
ndice
ndice
Introduccin
2-2
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
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
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
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
Diseo recursivo
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
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
2-8
Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es
Estrategias
de
programacin
Diseo
de
algoritmos
recursivos
Divisin
Caso recursivo
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
Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es
Estrategias
de
programacin
Diseo
de
algoritmos
recursivos
Recursividad final
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
Funcin sumergida
La
funcin
sumergida
se
expresa
como
una
invocacin
concreta
de
la
funcin
inmersora
ms
general
2 - 11
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
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
Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es
Estrategias
de
programacin
Diseo
de
algoritmos
recursivos
Objetivos de
inmersin
2 - 13
Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es
Estrategias
de
programacin
Diseo
de
algoritmos
recursivos
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
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
-
-
Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es
Estrategias
de
programacin
Diseo
de
algoritmos
recursivos
Ejercicios
I. Funcin factorial
2 - 15
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
Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es
Estrategias
de
programacin
Diseo
de
algoritmos
itera6vos
La
inicializacin
es
el
paso
preliminar
para
proceder
con
el
diseo
itera6vo
de
algoritmos
Bifurcacin
if (!found) index++;
}
if
(found)
return
index;
else
return
-1;
}
Secuenciamiento
Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es
Estrategias
de
programacin
Diseo
de
algoritmos
itera6vos
Elementos de los
algoritmos
iterativos
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
Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es
Estrategias
de
programacin
Diseo
de
algoritmos
itera6vos
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
Asignacin
Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es
Estrategias
de
programacin
Diseo
de
algoritmos
itera6vos
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;
Ejecucin en secuencia
Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es
Estrategias
de
programacin
Diseo
de
algoritmos
itera6vos
<< bloque-sentencias>>
} else {
...
<< bloque-sentencias>>
default: <<bloque-sentencias>>
If Then Else
Switch - Case
Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es
Estrategias
de
programacin
Diseo
de
algoritmos
itera6vos
<<inicializacin>>
<<inicializacin>>
expresin-lmite;
while (expresin-lgica ) {
do {
expresin-incremento) {
<< bloque-sentencias>>
<< bloque-sentencias>>
<< bloque-sentencias>>
<< incremento>>
<< incremento>>
} while (expresin-lgica );
For
While
Do - While
Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es
Estrategias
de
programacin
Diseo
de
algoritmos
itera6vos
Ejercicios
Encuentre
una
solucin
itera6va
para
cada
uno
de
los
problemas
que
se
presentaron
con
anterioridad
I.
Funcin factorial
int j = 0;
int s = 0;
V. Suma de un vector
VI. Producto escalar
2 - 22
s
=
s
+
v[j];
j++;
}
return s;
VIII.Elementos repetidos
// 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
if (j >= n) return w
int j = 0;
int
w
=
0;
while
(j
<
n)
{
w
=
w
+
v[j];
j
=
j
+
1;
}
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
2 - 24
Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es
Estrategias
de
programacin
Traduccin
de
algoritmos
recursivos
a
itera6vos
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
}
int
k
=
j;
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
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
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
Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es
Anlisis
de
la
eciencia
de
los
algoritmos
Coste
asintDco
temporal
ndice
3-2
Introduccin
rdenes de complejidad
Bibliografa
Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es
Obje8vos
3-3
Medida asinttica O
Algoritmos recursivos
Algoritmos iterativos
Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es
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
Comparativo
De aspectos constantes
Clasificatorio
De aspectos de escala
Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es
int temp;
int i = 0;
return repetidos;
temp = v[k];
v[k]
=
v[k-1];
v[k-1]=
temp;
int i = p;
tiempo
<
3-5
Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es
Criterios de medida
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
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
Criterios de medida
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
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
Criterios de medida
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
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
Cota superior. O
Cota inferior.
3-9
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
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)
3 - 10
Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es
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
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
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
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
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
Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es
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
3 - 15
Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es
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
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
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)
- Asignacin
O(1)
- Expresiones escalares
O(1)
Secuencias sentencias
Invocacin subprogramas
- s1; s2; s3
- f (e1, e2)
Sentencias condicionales
- O (f + g)
- switch (e) {
- O (f * g)
case c1 : b1;
case c2 : b2;
Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es
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)
max
max
max
max
3 - 18
Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es
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
BibliograJa
Bibliografa complementaria
Fundamentos de Algoritmia. G. Brassard, P.
Bratley. Prentice Hall. SBN: 84-89660-00-X
1997
3 - 20
Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es
Tipos
abstractos
de
datos
lineales
Parte II
Tipos
abstractos
de
datos
lineales
Listas
ndice
4-2
Introduccin
Implementacin dinmica
Implementacin esttica
Ejercicios
Bibliografa
Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es
Obje8vos
4-3
Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es
Tema 5
Tipos abstractos
de datos lineales
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
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
1
1
2 3
Insertar
2 3
4-6
Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es
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
Primero y resto
4-8
Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es
@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
@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
();
}
4 - 10
Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es
0
0
0
0
3
7
1
2
3
4
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
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
4 - 12
Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es
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
Algoritmos
sobre listas
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
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
1 2 3 4
4 - 16
Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es
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
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
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);
}
Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es
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
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
4 - 22
5 7
2
3
2
3
5
7
Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es
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
V. Insertar al final
X. Lista prefijo
4 - 23
III. Sublista
Disee
una
funcin
que
dada
una
lista
determine
si
una
lista
es
sublista
de
otra
dada
de
mayor
tamao
Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es
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
XIX. Contador
4 - 24
XVIII. Complemento a 1
Disee
una
funcin
recursiva
que
dada
una
lista
de
ceros
y
unos
devuelva
el
complemento
a
1
Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es
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
BibliograUa
Bibliografa complementaria
Estructura de datos y algoritmos en java. A.
Drozdek. Thomsom. ISBN: 9706866116. 2007
4 - 26
Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es
Tipos
abstractos
de
datos
lineales
Pilas
ndice
5-2
Introduccin
Implementacin dinmica
Implementacin esttica
Problemas y ejercicios
Bibliografa
Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es
Obje8vos
5-3
Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es
Tema 5
Tipos abstractos
de datos lineales
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
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
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
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
Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es
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
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
/**
*
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
Cima y siguiente
5-8
Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es
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;
}
Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es
@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
()
{
...
}
}
5 - 10
Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es
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
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
5 - 12
Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es
@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
()
{...}
}
5 - 13
Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es
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
@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);
}
*
5 - 15
Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es
@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
();
}
}
5 - 16
Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es
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
Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es
4
3
2
1
5 - 18
Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es
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
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
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
V. Insertar en la base
X. Pila prefijo
5 - 21
III. Subpila
Disee
una
funcin
que
dada
una
lista
determine
si
sta
est
contenida
en
una
pila
como
subpila
Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es
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
5 - 22
Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es
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
5 - 23
Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es
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
5 - 24
Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es
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
BibliograTa
Bibliografa complementaria
Estructura de datos y algoritmos en java. A.
Drozdek. Thomsom. ISBN: 9706866116. 2007
5 - 26
Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es
Tipos
abstractos
de
datos
lineales
Colas
ndice
6-2
Introduccin
Implementacin dinmica
Implementacin esttica
Problemas y ejercicios
Bibliografa
Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es
Obje8vos
6-3
Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es
Tema 5
Tipos abstractos
de datos lineales
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
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
Insertar
1
borrar
1
Es
vaca
falso
1
cierto
6-6
Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es
Longitud
3
contains
(3)
falso
contains
(1)
cierto
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
/**
*
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
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 -
6-8
Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es
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
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);
}
}
Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es
6 - 11
Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es
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
6 - 13
Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es
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
()
{...}
}
Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es
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
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
();
}
Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es
6 - 17
Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es
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
Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es
1 2 3 4
6 - 19
Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es
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
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
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
V. Insertar en orden
X. Cola prefijo
6 - 22
III. Subcola
Disee
una
funcin
que
dada
una
cola
determine
si
es
subcola
de
otra
dada
de
mayor
tamao
Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es
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
6 - 23
Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es
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
Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es
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
BibliograTa
Bibliografa complementaria
Estructura de datos y algoritmos en java. A.
Drozdek. Thomsom. ISBN: 9706866116. 2007
6 - 26
Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es
Parte
Tipos
abstractos
de
III
datos
jerrquicos
Tipos
abstractos
de
datos
jerrquicos
rboles
generales
ndice
7-2
Introduccin
Implementacin dinmica
Problemas y ejercicios
Bibliografa
Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es
Obje8vos
7-3
Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es
Tema 7
Tipos abstractos
de datos lineales
Tema 8
7-4
Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es
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
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
7-6
Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es
Es hoja
false
false
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
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
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;
}
Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es
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
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
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
Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es
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
7 - 13
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
7 - 14
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
7 - 15
Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es
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
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
7 - 18
Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es
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
V. Alturas
7 - 19
Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es
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
7 - 20
Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es
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
7 - 21
Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es
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
BibliograUa
Bibliografa complementaria
Estructura de datos y algoritmos en java. A.
Drozdek. Thomsom. ISBN: 9706866116. 2007
7 - 23
Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es
Tipos
abstractos
de
datos
jerrquicos
rboles
binarios
ndice
8-2
Introduccin
Implementacin dinmica
Problemas y ejercicios
Bibliografa
Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es
Obje8vos
8-3
Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es
Tema 7
Tipos abstractos
de datos lineales
Tema 8
8-4
Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es
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
Obtener
raz
Devuelve la raz del rbol. Este mtodo
devuelve un elemento de tipo T distinto de nulo
8-6
Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es
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
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)
inorden
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
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
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;
}
Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es
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
()
{...}
}
Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es
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
8 - 12
Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es
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
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
Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es
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
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
8 - 15
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
8 - 16
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
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
8 - 18
.es
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
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
Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es
14
8 - 21
10
13
Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es
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
7
2
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
6
n
n+1
8 - 23
4
10
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
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
n
n
n+1
n+1
n+1
Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es
8 - 25
Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es
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
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
V. Equilibrar
8 - 27
Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es
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
Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es
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
Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es
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
BibliograTa
Bibliografa complementaria
Estructura de datos y algoritmos en java. A.
Drozdek. Thomsom. ISBN: 9706866116. 2007
8 - 31
Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es