17 septiembre 2012

Computación
Algoritmos de Cálculo vs Tablas de Resultados

Algoritmo

Es habitual que en algún momento todo programador se halle frente a la pregunta: ¿debo dejar que mi programa efectúe un determinado cálculo cada vez que ejecuta el código? ¿o debo reemplazar el cálculo por una matriz  de resultados?



La tentación en estos casos es, que habiendo hallado la expresión matemática que resuelve una determinada situación, sea el algoritmo el que se encargue de calcular el resultado cada vez que haga falta. Sin embargo, esta situación no es un detalle menor, ya que por mucho que los procesadores y las memorias hayan progresado significativamente, todo esfuerzo que el hardware deba realizar en cálculos evitables representa una pérdida de tiempo, y como todos sabemos, el tiempo es dinero.

Insisto, nadie quiere perder tiempo, en particular nuestros clientes, por ello lo ideal en estas situaciones sería la evaluación de los posibles resultados a obtener por el algoritmo. Así, puede pensarse en dos clases: (1) resultados infinitos y (2) resultados finitos.

Veamos un ejemplo, supongamos que trabajamos en el correo, en el sector de envíos de cargas o encomiendas. Si la política comercial de la empresa es la de recibir paquetes de todo tamaño, y si para su traslado el empleado que los recibe debe calcular el volumen ocupado por dicho paquete a través de las mediciones del alto, largo y ancho, entonces, obtendremos una cantidad muy amplia de resultados posibles, tantos que quizás convenga calcular el volumen en cada ocasión.

Pero, si la política comercial es la de recibir sólo paquetes de determinado tamaño, por ejemplo, cajas estándar, entonces, tendremos un conjunto reducido, finito, de resultados posibles. En esas circunstancias, convendrá calcular exhaustivamente todos los resultados posibles, ingresarlos en una matriz o tabla y consultar dichos resultados a través de un índice de búsqueda. La idea en este caso, es reducir los tiempos de procesamiento y aumentar la velocidad del proceso.

Sin embargo, si la cantidad de resultados fuera finita, pero suficientemente grande como para impedir calcularlos en forma anticipada, entonces, convendrá plantear una solución mixta, que en el largo plazo redundará en el ahorro de tiempo que deseamos alcanzar.

Esto es, incluimos en el código el algoritmo correspondiente al cálculo del volumen, y simultáneamente creamos una matriz o tabla donde almacenaremos los valores calculados. Así, la idea es que, si el valor se encuentra en la tabla no es necesario efectuar el cálculo, por el contrario, si aún no fue calculado, entonces, se aplica el algoritmo que calcula el volumen y el resultado se almacena. De ese modo, cuando las dimensiones (alto, ancho y largo) vuelvan a ingresarse no será necesario recalcular el valor. Es más, el algoritmo puede mejorarse en este caso particular, porque el volumen se obtiene de un producto de tres factores, es decir, alto, ancho y largo, y dado que el producto es conmutativo, cualquier permutación de los tres valores producirá el mismo resultado, con lo que el total de registros en la tabla puede reducirse significativamente del mismo modo que el total de búsquedas.

Queda aún por considerar la sencillez del cálculo, a pesar de que en el ejemplo, que se pensó más bien con fines didácticos, se presenta una situación en la que quizás no sea tan significativo el ahorro de tiempo entre el cálculo vs la consulta, existen otros numerosos casos en los que la complejidad del cálculo exige un tiempo que puede ahorrarse, si no totalmente, al menos en su mayor parte aplicando el criterio de búsqueda en una tabla.

Cabe al analista el preguntarse en cada caso, acerca de la real conveniencia de optar por una u otra solución, considerando también las posibilidades reales de almacenamiento de los resultados que habrían de guardarse en una tabla, ya sea local, en un base de datos de escritorio o archivo técnico, o más frecuentemente, mediante una conexión a una base de datos remota.

En síntesis, cuando el escenario plantea una cantidad infinita de resultados distintos, convendrá calcular el resultado en el momento. Por el contrario, cuando la cantidad de resultados es finita, deberá evaluarse si conviene generar una tabla desde el vamos, o bien, utilizar una técnica mixta, que calcule el valor por primera vez, si los valores son nuevos, y que de seguido los almacene para futuros usos repetidos. Así, los factores que intervienen en el análisis son: la complejidad del cálculo, las posibilidades de almacenamiento, local o remoto, y el tiempo de acceso a dicha base de datos, más la ejecución y resolución de la consulta. Adicionalmente, habrá de considerarse si en el largo plazo, la cantidad de registros almacenados no volverán ineficiente la tabla, de modo que, en cierto punto se haga más conveniente calcular el valor requerido en el momento.

Nada es tan sencillo, ¿verdad?

Pol