You are on page 1of 38

U1.

Introduccin a las
Estructuras de Datos
Estructura de Datos

ISC Daniel A. Maupom, ME


Competencias y Evaluacin
Conoce y comprende las diferentes estructuras de datos, su clasificacin y forma
de manipularlas para buscar la manera ms eficiente de resolver problemas.

Evidencias para Evaluacin Fecha Progr.


Examen C 40%
Ejercicios A, D 30% 08/09/2017
Antologa B, F 15%
Exposicin A, D, E 15%
Contenido de Unidad
1.1 Clasificacin de las estructuras de datos
1.2 Tipos de datos abstractos (TDA)
1.3 Ejemplos de TDAs
1.4 Manejo de memoria
1.4.1 Memoria esttica
1.4.2 Memoria dinmica
1.5 Anlisis de algoritmos
1.5.1 Complejidad en el tiempo
1.5.2 Complejidad en el espacio
1.5.3 Eficiencia de los algoritmos
1.1 Clasificacin de las
estructuras de datos
Cualquier lenguaje de programacin ofrece tipos de datos
denominados primitivos, los cuales son utilizados para definir las
variables requeridas dentro de un programa. Al utilizar un cierto tipo de
dato, estamos haciendo una abstraccin que determina el conjunto de
valores que deben tener los datos, as como las operaciones que se
pueden realizar sobre ellos.
1.1 Clasificacin de las
estructuras de datos
Por otro lado, en muchas ocasiones necesitamos aplicar los conceptos
de la POO para poder trabajar con datos particulares. Por ejemplo,
manejar un punto en 3D requiere 3 coordenadas, y al trabajar con
varios puntos en 3D puede ser confuso en algn momento. Por ello,
quiz es mas viable incorporar un tipo Punto.
1.1 Clasificacin de las
estructuras de datos
ESTRUCTURAS PRIMITIVAS Y SIMPLES:
Son primitivas aquellas que no estn compuestas por otras estructuras de datos por ejemplo, enteros,
booleanos y caracteres. Otras estructuras de datos se pueden construir de una o mas primitivas. Las
estructuras de datos simples que consideramos se construyen a partir de estructuras primitivas y son:
cadenas, arreglos y registros. A estas estructuras de datos las respaldan muchos lenguajes de
programacin.

ESTRUCTURAS LINEALES Y NO LINEALES:


Las estructuras de datos simples se pueden combinar de varias maneras para formar estructuras mas
complejas. Las dos cases principales de estructuras de datos son las lineales y las no lineales, dependiendo
de la complejidad de las relaciones lgicas que representan. Las estructuras de datos lineales incluyen
pilas, colas y listas ligadas lineales. Las estructuras de datos no lineales incluyen grafos y rboles.
1.1 Clasificacin de las
estructuras de datos
Datos estticos: su tamao y forma es constante durante la ejecucin de un programa y por
tanto se determinan en tiempo de compilacin. El ejemplo tpico son los arrays. Tienen el
problema de que hay que dimensionar la estructura de antemano, lo que puede conllevar
desperdicio o falta de memoria.

Datos dinmicos: su tamao y forma es variable (o puede serlo) a lo largo de un programa,


por lo que se crean y destruyen en tiempo de ejecucin. Esto permite dimensionar la
estructura de datos de una forma precisa: se va asignando memoria en tiempo de ejecucin
segn se va necesitando.
1.2 Tipos de Datos
Abstractos (TDA)
Para entender este concepto, se requiere recordar el concepto de
abstraccin, que significa ignorar los detalles particulares en que est
hecha una cosa, quedndonos solamente con una perspectiva general.
1.2 Tipos de Datos
Abstractos (TDA)
Un tipo de dato abstracto (TDA), tambin conocido como tipo de dato
abstracto (TAD) o abstract data type (ADT) es un tipo de dato definido
por el programador que se puede manipular de un modo similar a los
tipos de datos definidos por el sistema, est formado por un conjunto
vlido de elementos y un nmero de operaciones primitivas que se
pueden realizar sobre ellos. Una vez definido se podrn declarar
variables de ese tipo y operar con ellas utilizando las operaciones que
aporta el tipo.
1.2 Tipos de Datos
Abstractos (TDA)
Por Ejemplo, pensemos en algo
tan simple como una fecha.
Qu es una fecha?
De qu se compone?
Un TDA es el elemento Qu operaciones puedo
bsico de la abstraccin implementar con fechas?
de datos.
1.3 Ejemplos de TDAs
Retomando el ejemplo de la fecha, sabemos que una fecha se puede
componer de 3 enteros, uno para el da, uno para el mes y uno para el
ao. Con las fechas podemos implementar operaciones como crearlas,
desplegar en formato DD/MM/AAAA y en formato dd de mm de aaaa.
A final de cuentas, debe crearse un TDA, que segn Java, se hace
mediante clases.
1.3 Ejemplos de TDAs
1.4 Manejo de memoria
La administracin de memoria de una
computadora es una tarea fundamental
debido a que la cantidad de memoria es
limitada.
El sistema operativo es el encargado de
administrar la memoria del sistema y
compartirla entre distintos usuarios y/o
aplicaciones.
El RTS (Run Time System) de un lenguaje
de programacin administra la memoria
para cada programa en ejecucin.
1.4 Manejo de Memoria
La ejecucin de un programa requiere que diversos elementos se
almacenen en la memoria:
*Cdigo del programa (instrucciones)
*Datos Permanentes y Temporales
*Direcciones para controlar el flujo de ejecucin del programa
1.4 Manejo de Memoria en
Java
En Java podemos hablar de tres zonas de memoria:

La ZONA DE DATOS, donde se almacenan las instrucciones del programa, las clases con sus mtodos y
constantes. Esta zona es inmutable durante todo el periodo de ejecucin del programa.

La memoria HEAP, donde se almacenan las variables que se crean en los programas con la sentencia "new".
Esta zona de memoria es dinmica e ir creciendo conforme se vayan creando objetos desde nuestro programa.
La memoria STACK, donde se almacenan los mtodos y las variables locales que se crean dentro de los mismos.
Esta zona de memoria es esttica y no se modifica durante el desarrollo del programa. Cada vez que un mtodo
se llama se coloca al comienzo de la pila y se almacenar informacin como el nmero de la lnea que se est
ejecutando as como todos los valores de las variables locales. Un error que nos puede ocurrir es que al ejecutar
nuestro programa obtengamos la excepcin java.lang.OutOfMemoryException por un StackOverflow. La causa
podra ser por ejemplo que estamos realizando una llamada recursiva y no hayamos implementado
correctamente la condicin de parada.
1.4.1 Manejo de Memoria
Esttica
La memoria esttica es la que se reserva al momento de compilacin antes de
comenzar a ejecutarse el programa. Los objetos son creados en ese momento y
destruidos al final del programa. Mantiene la misma localizacin en memoria
durante todo el transcurso del programa.
Elementos que residen en memoria esttica:
Cdigo del programa
Las variables definidas en la seccin principal del programa, las cuales pueden
solo cambiar su contenido no su tamao.
Todas aquellas variables declaradas como estticas en otras clases o mdulos.
1.4.2 Manejo de Memoria
Dinmica
Las reservas de memoria dinmica se hacen en tiempo de ejecucin,
despus de leer los datos y de conocer el tamao exacto del problema
a resolver, como consecuencia se adapta mejor a las necesidades de
cada caso pero en contrapartida es un poco mas difcil de programar.

Tanto la creacin como la destruccin de los objetos esta en manos del


programador a travs de los operadores new y finalize(), el sitio donde
se almacenan los objetos suelen llamarse "heap" o "free strore",
traducido como montculo o memoria libre.
Ejemplo de Manejo de Memoria
Qu elementos de los
siguientes dos cdigos se
almacenan en memoria esttica?

Cules se almacenan en
memoria dinmica?
1.5 Anlisis de Algoritmos
Raramente existe un nico algoritmo para resolver un
problema determinado. Cuando se comparan dos
algoritmos diferentes que resuelven el mismo problema,
normalmente se encontrar que un algoritmo es un
orden de magnitud ms eficiente que el otro. En este
sentido, lo importante es que el programador sea capaz
de reconocer y elegir el algoritmo ms eficiente.

Pero, Qu es eficiencia?
1.5 Anlisis de Algoritmos
La eficiencia es la propiedad mediante la cual un algoritmo debe
alcanzar la solucin al problema en el tiempo ms corto posible
utilizando la cantidad ms pequea posible de recursos fsicos y que
sea compatible con su exactitud o correccin. Un buen programador
buscar el algoritmo ms eficiente dentro del conjunto de aquellos que
resuelven con exactitud un problema dado.
1.5 Anlisis de Algoritmos
La cantidad de tiempo que cualquier algoritmo tarda en ejecutarse
depende casi siempre de la cantidad de entrada que debe procesar, por
ende, es obvio que un algoritmo que ordene 10,000 elementos tarda
ms tiempo que uno que ordene 10.
1.5.1 Complejidad en el
Tiempo
La complejidad del tiempo de un programa es la cantidad de tiempo de
computadora que se necesita para ejecutarlo. Se utiliza una funcin,
T(n), para representar el nmero de unidades de tiempo tomadas por
un programa o algoritmo para cualquier entrada de tamao n. Si la
funcin T(n) de un programa es T(n) = c *n, entonces el tiempo de
ejecucin es linealmente proporcional al tamao de la entrada sobre la
que se ejecuta. Tal programa se dice que es de tiempo lineal.
1.5.1 Complejidad en el
Tiempo
Funciones ordenadas de menor a mayor tasa de crecimiento
Funcin Nombre
C Constante
Log N Logartmica
Log2 N Logartmica al cuadrado
N Lineal
N log N N log N
N2 Cuadrtica
N3 Cbica
2N Exponencial
1.5.2 Complejidad en el
Espacio
La complejidad del espacio de un programa es la cantidad de memoria
que se necesita para ejecutarlo hasta la complecin (terminacin). El
avance tecnolgico proporciona hoy en da memoria abundante; por
esa razn, el anlisis de algoritmos se centra fundamentalmente en el
tiempo de ejecucin.
1.5.3 Eficiencia de los
Algoritmos
El anlisis de algoritmos es una tcnica que permite obtener una
medida de la eficiencia de los algoritmos. Para representar la
complejidad de los algoritmos se utiliza la notacin O grande, que
permite evaluar el ritmo de crecimiento en el tiempo de ejecucin
como una funcin dependiente de la cantidad de datos del problema.
1.5.3 Eficiencia de los
Algoritmos
Definida de manera ms formal, una funcin f(n) es de orden g(n) :
f(n)=O(g(n)) constantes positivas c y n0 tales que f(n)
c(g(n)) c, n n0
Considerando que tiene usted dos algoritmos A1 y A2 con tiempos de
ejecucin O(f1(n)) y O(f2(n)), se tienen las siguientes reglas

Nota:
= Existe al menos una
= Para Todo
1.5.3 Eficiencia de los
Algoritmos
Regla de la suma: Se aplica cuando se desea evaluar la complejidad del
algoritmo resultante de ejecutar A1 seguido de A2, en este caso la
complejidad es O(max(f1(n), f2(n))) .
Regla de la multiplicacin: Se aplica cuando se desea evaluar la
complejidad del algoritmo resultante de ejecutar A2 dentro de A1 , en
este caso est dada por O(f1(n) f2(n)).
1.5.3 Eficiencia de los
Algoritmos
Considerando las mencionadas reglas, podemos evaluar la complejidad
tomando en cuenta lo siguiente:
Asignaciones, declaraciones: Para efectos prcticos, se asume que
todas las operaciones sobre tipos primitivos, asignaciones y secuencias
de asignaciones toman un tiempo constante, expresado como O(1).
1.5.3 Eficiencia de los
Algoritmos
Proposiciones Consecutivas: Se evala la complejidad de cada una y se
aplica la regla de la suma.
Condicionales: La complejidad de estas instrucciones se determina por
la evaluacin de la condicin y del cuerpo de la instruccin condicional.
Una condicional generalmente tiene complejidad O(1).
1.5.3 Eficiencia de los
Algoritmos
Ciclos: La complejidad de un ciclo se calcula utilizando
la regla de la multiplicacin. Para ello se toma el tiempo
de ejecucin de su cuerpo multiplicado por el numero
de veces que se realiza.

Vemos en el ejemplo que este


ciclo se realiza n veces y el
for (int i=0; i < n; i++)
if (valores[i]< minimo) cuerpo toma un tiempo
minimo=valores[i]; constante cada vez, por lo que su
tiempo de ejecucin es
O(1*n)=O(n)
1.5.3 Eficiencia de los
Algoritmos
Considere el siguiente segmento de cdigo

La funcin T(n) del mtodo es:


T(n) = t1 + n*t2 + n*t3 + t4
El tiempo crece a medida que lo hace n, por lo que es preferible expresar el tiempo de
ejecucin de tal forma que indique el comportamiento que va a tener la funcin con
respecto al valor de n.
1.5.3 Eficiencia de los
Algoritmos
Si T(n) es el tiempo de ejecucin de un programa con entrada de tamao n, ser posible valorar T(n)
como el nmero de sentencias, en nuestro caso en Java, ejecutadas por el programa, y la evaluacin
se podr efectuar desde diferentes puntos de vista:
Peor caso. Indica el tiempo peor que se puede tener. Este anlisis es perfectamente adecuado para
algoritmos cuyo tiempo de respuesta es crtico; por ejemplo, para el caso del programa de control
de una central nuclear.
Mejor caso. Indica el mejor tiempo podemos tener.
Caso medio. Se puede computar T(n) como el tiempo medio de ejecucin del programa sobre todas
las posibles ejecuciones de entradas de tamao n. El tiempo de ejecucin medio es a veces una
medida ms realista de lo que el rendimiento ser en la prctica, pero es, normalmente, mucho ms
difcil de calcular que el tiempo de ejecucin en el peor caso.
1.5.3 Eficiencia de los
Algoritmos
El nmero de sentencias ejecutadas en la funcin para n datos es en
funcin del nmero de elementos y se expresa por la frmula f(n).
Aunque la ecuacin para obtener una funcin puede ser compleja, el
factor dominante que se debe considerar para determinar el orden de
magnitud del resultado es el factor de eficiencia. Por consiguiente,
basta con calcular el factor que determina la magnitud. Este factor se
define como O grande, que representa estenelordende y
se expresa como O(n), es decir, en el orden de n.
1.5.3 Eficiencia de los
Algoritmos
Con la notacin O se expresa una aproximacin de la relacin entre el
tamao de un problema y la cantidad de proceso necesario para
hacerlo.
Por ejemplo, si f(n) = n2 2n +3 entonces f(n) es O(n2), lo cual se lee
Del orden de n2
1.5.3 Eficiencia de los
Algoritmos
Dada la funcin f(n) = n3+ 3n +1, encontrar su "O grande" (complejidad
asinttica).
Para valores de n 1 se puede demostrar que:
f(n) = n3+ 3n +1 5n3

Escogiendo la constante c = 5 y n=1


Se satisface la desigualdad f(n) = n3+ 3n +1 5n3 entonces se puede asegurar
que:
f(n) = O(n3)
1.5.3 Eficiencia de los
Algoritmos
1.5.3 Eficiencia de los
Algoritmos
Fuentes de Informacin
Olivas, J. (S. F.) Estructuras de Datos, Disponible aqu
OCW (2009) Estructuras de Datos, Disponible aqu
Weiss, Mark A. (2013), Estructuras de datos en Java, Pearson, Espaa.
Joyanes, Luis (2008) Estructuras de Datos en Java, McGraw Hill.
INACAP, Manual de Anlisis de Algoritmos, Disponible en:
https://goo.gl/mnYR9C

You might also like