jueves, 3 de junio de 2010
Programación Dinámica (Opinion Personal)
Analizando esta información creo que es muy favorable en funciones ampliamante recursivas; Sin embargo, me parece que se debe analizar bien en que problemas se aplicará este estilo, ya que me parece que un programa que reciba muchos valores estaría utilizando recursos extra que valdria la pena revisar si vale el esfuerzo y si es la opcion mas optima.
Me parecio bastante bueno el ejemplo de el monto a alcanzar con determinado numero de monedas de i tipos que revisaba a traves de la programación dinámica las combinaciones necesarias para alcanzar una cantidad Q. Me parece bastante inteligente el modo en que se creaba el modelo de la tabla con el numero de tipos de monedas como filas y los valores alcanzados como columnas. Sin duda alguna algo muy ingenioso que valdra la pena aplicar en algun momento de la vida.
sábado, 8 de mayo de 2010
Arboles de Expresiones en C#
Los Arboles de expresiones son una de las facetas diferentes de representación y utilización de las funciones lambda, y en específico en forma de datos. Las expresiones lambda se compilan como código o como datos en dependencia del contexto en que se utilizan. Es importante destacar que para la utilización de las funciones lambda podemos utilizar variables de tipo delegado (Variables que representan a una función) o variables genéricas.
Es importante aclarar que en algunos lenguajes se permite manejar código como si fueran datos y los datos como si fueran código. A esta característica se le conoce como homoiconic.
Si asignamos una expresión lambda a una variable de tipo delegado, el compilador generará un código ejecutable de ello. Sin embargo, si asignamos la expresión lambda a una variable del tipo genérico Expression, el compilador no la traducirá a código ejecutable, sino que generará una estructura de datos en memoria que representa a la expresión en sí. Estas estructuras de datos es la que en C# se denomina árboles de expresiones.
Una vez que se ha construido un árbol de expresión, este puede ser manipulado, modificado, seriado y distribuido a través de la red. Cabe destacar que contamos con todos los mecanismos necesarios para la compilación de arboles de expresiones gracias a la clase Expression.
Entre los elementos más importantes descendientes de la clase Expression contamos con los siguientes:
1) Lambda Expression: Sirve como un puente entre la clase Expression
2) ParameterExpression: Mediante los objetos de este tipo se representan los parámetros de una expresión. La propiedad principal de este objeto es Name o nombre del parámetro.
3) ConstantExpression: Mediante este objeto se representan valores de tipo de tipo constantes de una expresión determinada.
Referencias: http://www.elguille.info/NET/futuro/firmas_octavio_ArbolesExpresiones.htm
domingo, 2 de mayo de 2010
Algoritmos Recolectores de Basura
- Reservar los espacios de memoria que serán utilizados.
- Liberar espacios de memoria utilizados anteriormente.
- Compactar los espacios de memoria libres y colocarlos consecutivamente para su mejor uso
- Administrar los espacios no utilizados.
Algunos lenguajes ya cuentan con su propia rutina recolectora de basura y generalmente la ejecuta también de forma automática sin la intervención del programador. En muchos casos será necesario que el programador programe los llamados a las rutinas recolectoras. Para estos casos el programador puede valerse de los siguientes recursos:
- Esperar a que se utilice el total de la memoria, quedando así sin memoria disponible y ejecutar la rutina.
- Fijar un porcentaje de la memoria que se utilizará y cuando el programa sobrepase este porcentaje establecido, entonces ejecutará la rutina.
- Ejecutar la rutina recolectora a ciertos intervalos de tiempo o intervalos regulares.
- Ejecutar la rutina recolectora justo antes de cada reserva de memoria.
- Permitir al programador que invoque al programador cuando el desee.
Ejemplos de lenguajes con recolector de basura
- ALGOL 68
- BASIC
- Caml
- Clean
- Eiffel
- Haskell
- Java
- JavaScript
- Lisp
- Lua
- Mercury
- ML
- Modula-3
- Oberon
- Oz
- Objective C 2.0
- Perl
- PHP
- Prolog
- Python
- Ruby
- Smalltalk
- SNOBOL
- SuperCollider