El algoritmo


No se puede negar. Todos han escuchado alguna vez, ya sea en las noticias o redes sociales, que hablan de "el algoritmo de X". Incluso aquellos con sus cadenitas, que buscan engañarlos. Si, en la era de la información, estamos dentro de lo que llamaríamos, la dictadura de los algoritmos. El gran problema es que muchos internautas, ni siquiera saben lo que es, salvo que tengas una profesión donde te toque tratar con ellos, como es mi caso. En fin, como a mi me gusta que el conocimiento sea libre, voy a tratar de explicar con peras y manzanas el concepto de algoritmo.
Vamos a partir por algo básico. Cualquier tarea que realicemos, sigue una serie de pasos, desde que la comenzamos, hasta terminarla -claro, habemos algunas que ni eso-. Dentro de esa serie, hay momentos en que tenemos que tomar una decisión sobre que hacer en caso de que se presente algo que no esperábamos, lo que llamaremos condición, y a eso le agregamos que hay algunas que se harán una y otra vez, lo que conoceremos como bucle. En esencia, esta es la descripción más básica y simple de lo que es un algoritmo.
Voy a darles un ejemplo: levantarse en la mañana. El primer paso es -obviamente- abrir los ojos. Luego siguen: estirarse, ir a la ducha. Si hace mucho frio, usamos agua caliente, si no, agua tibia. Volvemos a vestirnos, escogemos la ropa, nos la colocamos y vamos a desayunar. Estos pasos pueden denotarse de la siguiente manera.
Inicio:
Abrir los ojos
Levantarse
Ir a la ducha
Si hace frio:
Abrir agua caliente
Si no:
Abrir agua tibia
Fin Si
Secarse
Escoger ropa
Si es dia laboral:
Ropa de trabajo
Si no:
Ropa informal
Fin Si
Ir a desayunar
Fin
Como pueden ver estimados lectores, la sencilla tarea de levantarse, se puede secuenciar en un algoritmo.
¿Pero de donde nace este concepto?
El algoritmo es un concepto matemático. Si bien los griegos ya lo conocían, al parecer fue en edad de oro de Medio Oriente, donde se formuló la primera explicación de este. En el siglo X, un matemático persa de nombre Al-Juarismi, describió las reglas del álgebra, como una serie de pasos a seguir para resolver problemas abstractos. En esencia los algoritmos, van muy de la mano de las matemáticas, con el correr de los siglos. En el mundo digital, desde los inicios de la computación moderna, han estado presente, pasando desde Kurt Gödel, hasta Alan Turing, aunque gran parte de las bases fueron cimentadas, por George Boole y su álgebra binaria.
Y en esencia, las computadores, celulares y cualquier instrumento electrónico, entiende solo un idioma: ceros y unos. En base a eso, podemos hacer cosas desde usar una simple calculadora a tener juegos de gráficas deslumbrantes, pasando por la navegación de Internet. Ahora bien, hacer todo en base a ceros y unos, es algo complicado, por lo que durante gran parte del siglo XX, se trabajó en formas, más sencillas de interactuar con las máquinas, usando el lenguaje natural. De ahí nacen los lenguajes de programación, que permiten desarrollar lo mencionado anteriormente y muchas otras cosas mas. Todas basadas en algoritmos.
Las partes de un algoritmo.
En esencia, los algoritmos cuenta de forma general con 3 partes.
Entrada: Son los datos que se ingresan para que el algoritmo pueda operar.
Proceso: La operación lógica formal en que el algoritmo trabajará con los datos de entrada
Salida: Los datos del resultados que el algoritmo entrega.
Con lo anterior, podemos ver que los programas computacionales (software) son un conjunto de algoritmos, que procesan datos de entrada, para darnos una salida. El ejemplo mas sencillo es cuando subes una foto desde tu teléfono (entrada) a alguna aplicación como Instagram para que se vea en el perfil (salida), donde además podremos rellenar una caja de texto. En la parte que el usuario no ve, estos campos -la foto y el texto- el programa almacena esos datos en espacios de memoria, llamados variables. Una vez almacenadas, empiezan los procesos internos, que analizan el contenido de éstas, para luego publicarla. En estos procesos encontramos varios otros conceptos que describen un algoritmo las cuales comento a continuación.
Variables: Las mencionadas arriba, son espacios de memoria que almacenan los datos de entrada para su procesamiento por los algoritmos y también la información de salida (lo que se ve en pantalla). Pueden ser desde números hasta multimedia.
Constantes: Similares a las variables, con la salvedad que son valores que no cambian dentro del programa, a menos que el programador haga un ajuste al algoritmo. Estos valores, por lo general, funcionan como valores de control dentro del algoritmo.
Ahora bien, hay que recordar que los datos de entrada, sea texto, números, hasta fotos y videos, son codificados en secuencias numéricas y traducidas al lenguaje binario, con el que la máquina realiza cálculos. Un ejemplo es si la subida de fotos tiene un límite de peso (por ejemplo 2 megabytes), evaluará esta y procederá al proceso correspondiente (si subirla, como está, reducirla de tamaño y calidad, o bien, devolver un mensaje de advertencia u error, dependiendo del caso). Para que esto ocurra, dentro de la estructura del algoritmo, existen los denominados operadores, los cuáles se utilizan para calcular, ordenar y evaluar los valores de variables y constantes.
Un ejemplo básico es el de la suma.
Inicio
Int a = 2
Int b = 2
Int suma = a + b
Imprimir Suma
Fin
Lo que realiza el algoritmo de arriba es una suma basica entre dos valores. Se usan 3 variables: a
, b
y Suma
, que es el resultado que se vería en pantalla. Podemos cambiarles los valores y devolverá la suma de estos. Ahora un poco más complicado, con la operación de la división que tiene condiciones especiales. Primero no usaremos numeros enteros, porque habrá ocasiones en que devolverá decimales (ejemplo sería el 10 dividido por 3). Además agregaremos una condición.
Inicio
Float a
Float b
Si b <> 0:
Float division = a / b
Imprimir division.
Si no:
Imprimir "No se puede dividir por cero"
Fin Si
Fin
En este ejemplo, podemos ver que agregamos la llamada condición. Estas se usan para evaluar situaciones en que se pueden dar errores. En este caso, por regla matemática, no existe la división por cero, por lo que, en caso de que un valor en el divisor, sea cero, enviará un mensaje de error. Esto es como escoger dos caminos distintos en una intersección. Dependerá de donde se quiera ir, será la respuesta (o bien la más conveniente). Volviendo a la división, lo que evaluamos es que el valor de b, sea distinto (<>) a 0, para realizar la operación. En caso contrario, se saltará ese paso y advertirá que no se puede.
Entramos entonces a dos nuevos conceptos que se definen a continuación.
Operadores: Son los símbolos que nos permiten evaluar y resolver, valga la redundancia, operaciones presentadas dentro del diseño de un algoritmo. Los hay aritméticos: suma (+), resta (-), multiplicación (*) y división (/), pero también los condicionales: mayor (>), menor (<), mayor igual (>=), menor igual (<=), igual (= o == dependiendo del lenguaje de programación), distinto (<> o !=, dependiendo del lenguaje) y lógicos, también llamados booleanos (and, or y not, entre otros).
Condiciones: son también llamadas decisiones. Se denotan con un si, y se aplica algún operador de los mencionados mas arriba (condicionales) que comparan dos o mas valores, para decidir que opción tomar dentro del algoritmo, para llegar a la resolución de un problema.
Ahora bien, retomemos el algoritmo de levantarse, visto anteriormente. Es una tarea que hacemos, prácticamente todos los días. Y como cualquier tarea diaria organizada, solemos tener un horario determinado para realizarlas. Pues bien, dentro del mismo día, hacemos varias tareas, algunas incluso que se repiten una y otra vez, hasta que se complete o bien ocurra algo que nos haga saltar a otra. En la computación y en los algoritmos propiamente tal, las tareas repetitivas son conocidas como ciclos o bucles. De por si, el hecho de encender un dispositivo es un bucle donde se activan todas las tareas y procesos necesarios para su funcionamiento. Y muchas de ellas, están separadas del proceso principal, siendo invocadas al momento de utilizarse. Son las subrutinas o funciones, que permiten separar tareas que realizaremos mas de una vez en el algoritmo principal.
Tomemos el ejemplo siguiente: al ingresar un numero, el programa debe resolver si es un número primo o no.
Inicio:
Subrutina esPrimo (numero):
Entero num = numero
Entero contador = 0;
Entero x = 1
Mientras x <= num:
# Utilizamos una función computacional que extrae el resto de una división. Para que el contador suba, debe quedar en cero. Esto es, si un numero no es primo, habrán otros valores cuyo resto de la división, será 0
Si num Mod 2 == 0:
contador = contador + 1
Fin Si
x = x + 1
Fin Mientras
Si contador == 2:
retorna Verdadero
Si no:
retorna Falso
Fin Si
Fin Subrutina
Entero numero
String respuesta
Escribe "Ingresar numero: " -> numero
Leer numero
respuesta = esPrimo(numero)
Si respuesta == Verdadero:
Imprime "Es primo"
Si no:
Imprime "No es primo"
Fin Si
Fin
En el ejemplo de arriba, se incluyen los dos conceptos mencionados anteriormente. La subrutina como tal, es un algoritmo separado del principal y que este último, solo invoca cuando es requerido. En la mayoría de las aplicaciones, muchas tareas se realizan más de una vez (como subir una foto a Instagram), por lo que se separan del programa principal y son llamados en los momentos en que se requieren. Además dentro del algoritmo que busca los números primos se usa un bucle, el cual consiste en un proceso que se repite hasta que la condición indicada, en este caso, que la constante x tenga un valor menor o igual al numero que ingresa por parámetro (entre paréntesis en la subrutina), se detendrá el proceso y pasará al siguiente bloque de instrucciones. En esencia, un bucle de este tipo lo vemos cuando encendemos el dispositivo o entramos en una aplicación. A menos que la cerremos, seguirá funcionando y haciendo las tareas dentro de este.
Terminando.
Ciertamente se me quedan varias cosas en el tintero, como los tipos de bucle y condición y todo lo que tiene que ver con otros paradigmas de programación, pero la idea de este post, es mostrarles lo que hay detrás de la palabra algoritmo que tanto mencionan en los medios (que son más complejos, pero cuya base es la que les he mostrado en este post). Sin más que agregar, les dejo un ejemplo en javascript del algoritmo de números primos para que puedan verlo y comprobar su funcionamiento, el que encontrarán haciendo click aquí.
Subscribe to my newsletter
Read articles from Hermann Pollack (hpollack95) directly inside your inbox. Subscribe to the newsletter, and don't miss out.
Written by
