Professional Documents
Culture Documents
Introduccin a las
Estructuras de Datos
Estructura de Datos
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.
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.