viernes, 27 de junio de 2014

Tiempo de Ejecución - de código JAVA a expresión matemática

Objetivo: descubrir que dos algoritmos diferentes tienen el mismo orden de ejecución, es decir, que comparten el mismo comportamiento asintótico.


LES PRESENTO A LOS DOS ALGORITMOS:


 


Cuando analizamos el tiempo de ejecución de un algoritmo,se toma en cuenta las estructuras de control (while, for, if-then-else, do). En este caso, en ambos códigos, prestamos atención a la sentencia "while". Las demás sentencias se consideran constantes. ¿Por qué? Por ejemplo las sentencias "int c=N" o "c=c/2" contienen: alocación de memoria y utilización de la ALU para calcular "c/2". Esto se resuelve en tiempo constante.



VOLVIENDO A ALGUNAS CLASES DE MATEMÁTICA ...

Primero definamos el concepto de función matemática.

DEFINICIÓN DE FUNCIÓN [1]

Sean A y B dos conjuntos no vacíos, que llamaremos dominio y codominio respectivamente. Entenderemos por función de A en B toda regla que hace corresponder a cada elemento del dominio un único elemento del codominio. Más precisamente, una función es un conjunto de pares ordenados tales que la primera componente pertenece a A y la segunda componente pertenece a B, es decir, un subconjunto de A X B, de modo que todo elemento de A sea primera componente de un par y sólo de uno. Esto nos dice que toda función de A en B es una relación especial entre A y B. 
Se escribe de la siguiente forma:


"f es una función con dominio en A y codominio en B"

En particular, 
f es la relación definida por 
entonces se tiene 
ya que la segunda componente es el cuadrado de la primera. 

EL diagrama de Venn correspondiente es 
Tanto en la definición de f por extensión como en el diagrama de Venn es fácil advertir que todo elemento del dominio tiene un correspondiente o imagen en el codominio y; además tal correspondiente es único. 

Observemos la siguiente situación: elementos distintos de pueden tener la misma imágen en B. Es decir, f(-1)=1 y f(1)=1. 

Ahora bien, pero que tiene que ver esto con el análisis de tiempo de ejecución de los dos algoritmos arriba mencionados?
Debemos de ser capaces de identificar quien es f, A, y B respecto al código arriba mencionado. Es la misma analogía.

SI ANALIZAMOS EL PRIMER CÓDIGO....

                    
Sea N=32, entonces entramos al bloque while cuando c=32, c=16, c=8, c=4, c=2. Pero cuando c=1, ya no entra al while. Entonces nos preguntamos, ¿Cuántas veces entre al bloque while? ¿Cuántas veces se ejecuta el while para N=32? 5 veces. ¿Que tuvimos en cuenta para concluir que se ejecuta 5 veces? Es decir, de que depende que el bloque while se ejecute 5 veces? Depende del valor de "N" y del cálculo "c = c / 2". 

Ahora debemos relacionar N con la cantidad de veces que se ejecuta el algoritmo. En este caso, relacionamos N=32 con 5, y esto nos lleva a pensar que



Si  entonces

                   el "while" se va a ejecutar 5 veces. 


Si  entonces

                   el "while" se va a ejecutar 6 veces. 
       
Observen que existe un intervalo donde el bloque while se ejecuta  la misma cantidad de veces. Esos intervalos son los siguientes:

  

Podemos concluir que N se ejecuta la misma cantidad de veces para  un determinado intervalo, y que dicho intervalo varía en potencias de 2 para el ejemplo del "código 1".

¿Y para que me servía la definición de función?

Sea  f:N->M , N y M naturales / f(N)=log2(N)  

¿Qué significa N, M y f(N)?

NEs el valor de entrada que recibe el código. Dependiendo del valor de N, el algorítmo se va a ejecutar más o menos veces.

M: Es el valor aproximado que determina la cantidad de veces que se ejecuta el algoritmo. M depende del valor que tenga N. M no es un número entero cualquiera. M es una unidad de tiempo.

f(N): Es lo que tenemos que descubrir nosotros mismos. Pudimos encontrar que f es de la forma f(N)=log2(N).

Sea f(N)=M=20, siginifica que el algorítmo tarda en ejecutarse 20 unidades de tiempo. ¿Porque la imagen de f son unidades de tiempo y no horas, minutos y segundos? La unidad de tiempo sirve para comparar algoritmos sin depender de la arquitectura subyacente (un algoritmo "tarda" más que otro en ejecutarse). Si uno desea en la práctica estimar el tiempo real, es necesario definir a la unidad de tiempo en horas minutos y segundos.  

OBSERVACIÓN: Valores distintos de N pueden tener la misma imagen.



SI ANALIZAMOS EL SEGUNDO CÓDIGO ....

                                                   

Si N=47entonces entramos al while cuando c=2, c=4, c=8, c=16, c=32 y cuando c=64 ya no entra al while. Entonces, nos preguntamos, ¿Cuántas veces se ejecuta el while teniendo en cuenta a N y el cálculo c*2? Se ejecuta 5 veces. Ahora debemos relacionar N con la cantidad de veces que se ejecuta el algoritmo. En este caso relacionamos N=45 con 5, y esto nos lleva a pensar que
 Tomamos la parte entera de 

CONCLUSIÓN

Pudimos analizar que ambos algoritmos tienen el mismo comportamiento asintótico. Es decir, que ambos tardan aproximadamente el mismo tiempo de ejecución para un valor de N dado. Observen que no es de interés obtener un resultado exacto de tiempo de ejecución, ya que es una estimación del mismo. 


Bibliografía:
[1] Algebra I, Armando Rojo ( Funciones: Capítulo 4 Página 102 )


jueves, 12 de junio de 2014

Para que estudiar los Conceptos de los Lenguajes de Programación

"The limits of my language are the limits of my word" Wittgenstein



Un Lenguaje de Programación es ....

un lenguaje formal para la formulación de algoritmos y estructuras de datos, eso quiere decir, para formular reglas de cálculos que pueden ser ejecutados por una computadora.[1]

Los lenguajes de programación son una herramienta para escribir software.   Pueden ser utilizados para crear programas que controlen el comportamiento de una máquina o para expresar un algoritmo.



Los primeros lenguajes de programación estaban orientados a las propiedades de determinadas computadoras. Hoy en día se utilizan mayormente lenguajes orientados a problemas, los así llamados lenguajes de alto nivel, los cuales  son más abstractos y permiten una expresión más entendible del mundo real. [2]




Estudiamos los conceptos de los lenguajes de programación con el propósito de ...



tener la habilidad de elegir, diseñar, implementar o utilizar un lenguaje. 

Podremos identificar sus alcances y sus limitaciones  para:



1) Aumentar la capacidad para producir software
Conociendo las características de los lenguajes permite minimizar su esfuerzo, evitar errores y aprovechar su potencia. Por ejemplo, no es lo mismo C que Smalltalk. El primero es un lenguaje estructurado mientras que el segundo es orientado a objetos


2) Mejorar el uso del lenguaje
Si se comprende como se implementa cada característica, se mejora la capacidad de escribir programas más eficientes. Por ejemplo, entender la diferencia entre List y Set en Java. List es una secuencia ordenada de elementos mientras que Set es una lista de elemento sin ningún orden.

3) Incrementar el vocabulario 
A veces es necesario expresar un concepto que el lenguaje no lo provee. Por ejemplo, Assembler no posee estructuras de control, por lo tanto debemos simularla.

4) Elegir adecuadamente un lenguaje
Si conocemos las características de los lenguajes, tenemos la posibilidad de elegir el adecuado de acuerdo al área del problema, y de esta forma reducimos el esfuerzo de codificación. Por ejemplo, si queremos programar artefáctos electrónicos utilizaremos PROLOG, en cambio si queremos programar cálculo numérico utilizaremos FORTRAN.

5) Facilitar el aprendizaje de nuevos lenguajes
Un lingüista que conoce profundamente la estructura subyacente del lenguaje natural aprende muchísimo más rápido un nuevo lenguaje o idioma que aquella persona que desconoce la estructura lingüística

6) Escoger el diseño e implementación de lenguajes 
Conocer el conjunto de símbolos que lo conforman, sus reglas sintácticas y semánticas, el significado de sus elementos y de sus expresiones  facilitará la escritura, la depuración, la compilación y el mantenimiento de un programa informático.





Bibliografía:
[1] Duden Informatik, ISBN 3-411-024-21-6
otras
. Apuntes de la Cátedra "Conceptos y Paradigmas de los Lenguajes de Programación" de la Facultad de Informática, UNLP (Universidad Nacional de La Plata)
. Programing language concepts - Third Edition -  Carlo Ghezzi.