duduromeroa.com

Algoritmos en programación: parte 1

Fundamentos de algoritmos en programación con Javascript


Un algoritmo es similar a un motor cuyo combustible es la exactitud de tareas y la precisión de los datos, sean estos datos fijos o cambiantes. Una tarea ambigua o un dato incompleto interrumpirán ese funcionamiento.

George Póyla, matemático. Resolver problemas de diseño. www.duduromeroa.com

Por Eduardo J. Romero Andrade

Guayaquil, Ecuador

Contacto duduromeroa@gmail.com


#fundamentosProgramacion, #algoritmos, #javascript, #Guayaquil, #duduromeroa


Muchos de los conceptos relacionados a los fundamentos en algoritmos serán también explicados en código de programación. El lenguaje a usar será Javascript. Si deseas revisar a profundidad ese lenguaje, puedes ir a esta sección.



El concepto de algoritmo tiene tres mil años de antigüedad

HISTORIA El matemático persa Abu Jafar al Khowarizmi (780-850 d.C.) describió varios ejemplos de operaciones matemáticas que buscaban resolver cuestiones cotidianas, como el reparto de tierras, herencias, entre otros. Al Khowarizmi los reunió en su extenso manuscrito llamado Kitab al-jabr wa al-muqabalah (en español, El Libro grande sobre cálculo por finalización y equilibrio).


Al Khowarizmi unificó el conocimiento matemático de Arabia y de la India de esos siglos y estandarizó los símbolos numéricos actuales. Al-Khowarizm quiere decir 'nacido en la torre de Khowarazm' (Horowitz, 1998, p. 4). Hoy en día son ruinas ubicadas en Uzbekistán, Asia central.


Desde inicios del siglo XX científicos europeos retomaron el algoritmo como sinónimo de matemáticas, basándose en las proposiciones del matemático griego Euclides (325 a.C.-265 a.C.) de su libro Elementos (Knuth, 1997, p. 2). Las proposiciones de Euclides son explicaciones textuales, algunas paso a paso. En ellas expuso muchos de sus teoremas matemáticos y geométricos.


¿Los algoritmos son únicamente para las computadoras?

La palabra algoritmo (derivada del árabe al Khowarizmi) refiere a un conjunto ordenado de acciones lógicas realizadas en un lapso limitado y alimentadas con información numérica para dar un resultado (nueva información). Hoy en día, el diseño de algoritmos es un amplio campo que propone mejores métodos para operar datos usando computadores.

No confundir algoritmo con logaritmo. Este último es una expresión matemática que representa a un valor multiplicado por sí mismo más de una vez (es decir, elevado a la potencia de un número mayor a 1) pero con una base numérica única. Por ejemplo, el logaritmo log2 8 = 3, se lee '8 en base (numérica) de 2 es igual a 3' (Soto Apolinar, 2011, p. 92)


Tampoco debemos confundir algoritmo con álgebra. Este ha comprendido desde el siglo VIII a.C. hasta la actualidad un amplio estudio de las relaciones de igualdad matemática entre valores numéricos definidos, valores por agregar o valores desconocidos (es decir, que deben ser hallados) a partir de operaciones con símbolos literales. Por ejemplo, la igualdad 3a + 9a = 12a se cumplirá siempre que el valor de 'a' sea reemplazado con cualquier número entero mayor a 1.



¿Cómo resultaría aplicar un algoritmo en la cotidinidad de una persona? Es complicado. Por ejemplo, un estudiante que desee mejores calificaciones (un objetivo muy general) logrará poco si carece de acciones o pasos precisos; o por el contrario, si sus acciones son confusas o sin sentido. Un objetivo más exacto sería el lograr un puntaje final de entre 9 a 9.5 puntos. Al ser un objetivo en cifras entonces podremos medir la eficacia del logro.

Para tener éxito el estudiante debería ejecutar durante todo el año de estudio todo un conjunto de tareas precisas y medibles (por ejemplo, lograr mínimo 9 puntos en cada examen trimestral, por ejemplo) y conectar esas actividades con otras (estudiar 5 horas diarias durante 12 meses). Al final, los resultados de esas acciones demostrarán si obtuvo o no buenas calificaciones al final del año.

Sin embargo, un estudiante deberá insertar en su cotidianidad mucha fuerza de voluntad y eliminar algunas distracciones para ejecutar día a día esas acciones. A diferencia de un equipo electrónico que solo lee y ejecuta algoritmos en forma de órdenes lógicas paso a paso, los seres humanos contamos con otras fuerzas de motivación emocional y mental para lograr (o desistir) de nuestros objetivos.

Aún así, hay una característica en común que tanto humanos como máquinas usan para realizar acciones en pos de un resultado. Esa es la del orden o secuencia (basado en una acción antecedente) y ejecutada en un tiempo dado. Eso puede ser obvio en la vida real, pero debemos estar atentos cuando creamos algoritmos para un computador, especialmente si deseamos que ese proceso beneficie al ser humano.

Por ejemplo, si el usuario de un cajero automático de banco espera demasiado tiempo para recibir su dinero, el algoritmo que ejecuta ese proceso debe contener una alerta al usuario para comunicarle la razón de esa demora. Esta puede estar causada por varias razones:

  1. La conexión está pausada
  2. El usuario ya no tiene dinero en el banco
  3. La cifra de retiro es incorrecta
  4. Los cálculos del sistema son lentos
  5. Se desconoce la causa de la demora y el usuario necesitará esperar un poco más

Condiciones a cumplir de un algoritmo

Según lo explicado por Horowitz, Sahni y Rajasekaran (1999, p. 1), un algoritmo ejecutado por un sistema electrónico cumple con lo siguiente:

  • Tiene inicio
  • Recibe y crea nuevos datos en forma de números. Esos resultados están relacionados con los datos ya ingresados.
  • Sus acciones son precisas (un evento realiza una única acción, sin interpretaciones ni confusiones de significado).
  • Sus acciones son ejecutables en cualquier contexto de uso (por ejemolo, el mismo algoritmo debe poder usarse en todas las operaciones aritméticas).
  • Tiene Fin

Un algoritmo puede comprender breves tareas o una lista extensísima de ellas, pero todas tendrán un límite, un inicio y un fin. Y serán lógicas, es decir, con relación al resultado y en consecuencia. Así mismo, un algoritmo debe ser susceptible de ser ejecutado una sola vez o miles de veces.

Pseudo algoritmo y simbología

Un pseudoalgoritmo es una lista de tareas lógicas comprensibles para cualquier persona. Su objetivo es mostrar las secciones y el orden planteado para que sea fácil de evaluar; y para que un potencial algoritmo (escrito en un lenguaje de programación, por ejemplo) ejecute esa estructura planteada y llegue así al resultado útil esperado.

La práctica técnica en diseño de algoritmos ha establecido una simbología básica, cuya convención permite entender el pseudoalgoritmo desde cualquier idioma. La razón de usar una simbología es que mucha documentación y bibliografía técnica contiene explicaciones desde esos símbolos. Paso a explicarlos al detalle para luego aplicarlos en un ejemplo.

En la tabla de abajo, los dos primeros literales (A) se comportan como contenedores de datos (también llamados variables). Las variables son palabras clave que alojan datos según su tipo, en forma de cualquier valor numérico entero o decimal o en forma de caracteres.

Símbolo

Significa

A B

Alojar el valor de B en una variable A

A == B

Compara: el valor alojado en A es idéntico al valor alojado en B

A = B

A es igual a B

n

Cualquier número

A*B

Multiplicar A por B

A/B

Dividir A para B

Si A == B ejecutar A*B

Sí A es idéntico a B, multiplicar A por B

A++

Incrementar el valor de A en 1

for (A=0; B>A; A++){ A+1}

Repetir la suma A+1 siendo que A inicie con el valor de cero, evaluar que B sea mayor que A; luego, sumar A+1 y finalmente incrementar A en 1 unidad.


Igualdad, comparación y asignación. Diferencias

En pseudoalgoritmos y en lenguajes de programación, el signo '=' representa una igualdad; es decir, un valor contenido en una entidad (llamada también variable).


Así mismo, el signo '==' representa una igualdad por comparación. Es decir, donde valores o expresiones tendrán valores idénticos uno con el otro.


La asignación (en pseudoalgoritmos) está indicada con la flecha invertida la izquierda, por ejemplo, donde el valor de 100 será asignado a la variable 'number': number 100.



En el ejemplo de abajo, un pseudo algoritmo toma cualquier número (n número) entero o decimal, negativo o positivo y lo divide y multiplica por dos. Su resultado no debe cambiar el valor inicial de n:


  1. Inicia
  2. num n
  3. opera n / 2 x 2
  4. Si num == opera, entonces...
  5. Mostrar 'Ambos son iguales'
  6. Si no, mostrar 'Error. No son iguales'
  7. Fin

Sea cualquier número n, entero o decimal, al dividirlo a la mitad y multiplicar esa mitad dos veces siempre será el mismo número, cuantas veces el algoritmo sea ejecutado. Si se desea colocar esas proposiciones en un lenguaje de programación, como Javascript, la interpretación según la sintaxis de ese lenguaje sería la siguiente:

En Javascript

var num = -0.000000123;
var opera = num / 2 * 2;

if (num == opera){
console.log("Ambos son iguales");
} else
{console.log("Error. No son iguales");
}

// Ambos son iguales

El que un algoritmo tenga un final definido es importante en programación, puesto que conlleva a que deberá ser ejecutado durante un lapso máximo. Por ejemplo, el lenguaje Javascript usa el punto y coma para indicar que una expresión tiene un inicio y un final. Y en los tipos de datos llamados funciones, la sentencia return indica que la función debe finalizar luego de ejecutar las instruccines que contenga esa función.

En Javascript

function saludar(x){
// Aquí termina función
return x;
// pero...
console.log("Esto NO SERÁ ejecutado!");
}
console.log(saludar("Hola Dudu"));
// Hola Dudu
// ...
// Esta expresión finaliza con el punto y coma.
// Es decir, solo se hará la resta y nada más!
let calcularEdad = 2024-1976;
console.log(calcularEdad);
// 48

Planear y diseñar un algoritmo son acciones independientes del lenguaje de programación usado para ejecutarlo.



Así mismo, un algoritmo transforma datos para entregar respuestas donde antes no existían, lo que en muchos contextos sería llamado un problema a resolver (Neapolitan, 2015, p. 23). Por ejemplo, para conocer el resultado de repetir cien veces cien, será útil multiplicar 100 * 100 = 10.000. Y si deseamos saber cuántas letras y espacios contiene este párrafo, sería útil sumar las letras y los espacios para luego comprobar ese resultado. Ambas ejecuciones ofrecen un nuevo dato. En el marco del uso de algoritmos, tener un problema es igual a necesitar respuestas.

Un problema no viene solo. Contiene elementos reales, conceptuales y muchas veces impredecibles que actúan combinados para que el nudo sea complicado de desatar. En algunos casos esos elementos son aleatorios, móviles o variables; y en otros son fijos, constantes. Algunos autores llaman a ambos elementos los parámetros del problema (Neapolitan, 2015, p. 24); y describen a un problema como la relación entre los datos externos (o de entrada, o inputs) y su transformación en nuevos datos (outputs) (Cormen, Leiserson, Rivest, Stein; 2022, p. 4).

Ir a la segunda parte: Instancia del algoritmo, armando un algoritmo, pseudocódigo, ejemplos en Javascript.


BIBLIOGRAFÍA
Cormen, T., Leiserson, Ch., Rivest, R., Stein, C. (2022) Introduction to Algorithms (4ta. Ed.) MIT press.

Neapolitan, R. (2015) Foundations of Algorithms Jones, Bartlett Learning Press.

Horowitz, E., Sahni, S., Rajasekaran, S. (1999) Computer algorithms Computer Science Press, W. H. Freeman.

Knuth, Donald, E. (1997) The art of computer programming. 3ed. Vol. 1. Addison Wesley Longman ed.

Soto Apolinar, Efraín (2011) Diccionario ilustrado de conceptos matemáticos. 3ed edición. México.