algoritmo

El algoritmo

«Si somos una maquina la vida es un algoritmo» palabras de Andy Stalman que ejemplifican exitosamente lo que un algoritmo es, una secuencia de pasos, una metodología, una manera de ver el mundo, el algoritmo es sin duda una abstracción muy poderosa, la base de la computación en si y cuyos origines y usos van mas allá de lo que imaginamos, pero para poder saber que es un algoritmo conviene saber pues los orígenes etimológicos.

La palabra algoritmo proviene según la RAE del latín tardío <<algobarismus>> y este abreviado del árabe <<ḥisābu lḡubār>> que significa «Calculo mediante cifras», otras fuentes citan sin embargo que puede ser que provenga del nombre de un matemático persa llamado Al-juarism gracias al cual los números indo-arábigos son conocidos en todo el mundo, puede que haya habido alguna influencia, sin embargo la definición de la RAE nos trae a la mente uno de los primeros algoritmos del que se tiene registro, el algoritmo del griego Euclides para encontrar el Máximo Común Divisor de un numero y que aun en nuestros días constituye un algoritmo importante en temas como la matemática o la criptografía.

Gracias al grandioso avance de la tecnología en estas ultimas decenas de años la definición del algoritmo se postula tan simple como compleja: Serie finita de pasos fijos, ordenados y no ambiguos de operaciones sistemáticas y lógicas que permiten llegar a un resultado bien definido; nosotros en la vida diaria utilizamos algoritmos, una receta de cocina es sin dudas un algoritmo para llegar a un platillo bien definido, en ella se definen las herramientas que se van a usar, los pasos a seguir, estos están bien acotados y explicados, son finitos ya que en algún momento acabaremos esta receta para obtener el resultado, el algoritmo antes mencionado de Euclides es uno de tantos algoritmos que existen en matemáticas y siendo la computación una rama de está no podían faltar.

Un programa informático es un algoritmo, debido a la arquitectura con las que las computadoras fueron creadas no puede ser de otra forma, la computación es lógica aplicada, operaciones lógicas acomodadas de tal forma que esa estructura pueda cumplir con el objetivo que se tiene, la misión del programador es pues comprender la estructura lógica de las cosas para poder hacer abstracciones del mundo real al lógico y poder expresar estas en pasos finitos y estructurados.

Hay muchas herramientas para lograr expresar lógicamente el procedimiento a seguir para solucionar un problema, en el post anterior abordamos la metodología para solucionar un problema, pero a diferencia de una metodología un algoritmo no puede dejar cabida a ambigüedades, veremos las herramientas mas usadas con un algoritmo simple, la receta de cocina para preparar arroz blanco.

El diagrama de flujo

Desde 1921 con dos ingenieros industriales de la Sociedad Americana de Ingenieros Mecánicos <<ASME por sus siglas en ingles>> se empezaba a definir un diagrama de procesos basado en gráficos que seria el precursor de lo que hoy en día conocemos como diagrama de flujo, el uso de este tipo de diagrama creció de forma constante y para los años 40 se creaban los primeros «sistemas de conjuntos de símbolos» con diagramas de procesos para los diagramas de flujo, al pasar de los años y con el avance a pasos agigantados de la informática se define una simbología común para los diagramas de flujo a continuación se presenta una tabla con dichos símbolos su significado y su uso:

Símbolo Significado Uso
Procesos y operaciones

Proceso

Proceso Indica una acción o instrucción general que se debe realizar
Subrutina Subrutina / Proceso predefinido Indica el uso de un proceso bien definido o definido en otro diagrama de flujo complementario

ProcesoAlternativo

Proceso alternativo Indica una acción que puede o no realizarse, se suele conectar con lineas punteadas

Delay

Demora / Espera Indica una demora en el proceso que no se puede eliminar

preparacion

Preparación / Interconexión Representa la conexión con otro procedimiento o la preparación para instrucciones que se repiten un numero controlado de veces.

manualpreparacion

Preparación manual / Loop Indica un proceso que se debe iniciar o terminar manualmente por un usuario

looplimit

Limite de loop Indica donde se detiene un loop
Símbolo Significado Uso
Control de flujo

flecha

Flecha Indicadores de la dirección de lectura del flujo usualmente es de arriba a abajo y de derecha a izquierda

terminador

Inicio / Final Indica el inicio o marca el final de un diagrama de flujo.
terminador Decisión Indica una operación lógica que condiciona el flujo del diagrama, en este símbolo el diagrama diverge en dos caminos dependiendo si el resultado de la operación es verdadero o falso
conector Conector Indica el enlace de dos partes de un diagrama dentro de una misma pagina
ConectorOff Conector fuera de pagina Indica el enlace de dos partes de un diagrama en paginas diferentes
merge Unir Indica que dos mas subprocesos se unen y forman un solo proceso
Extract Extraer Indica cuando un proceso se divide en subproceso
Or O lógico Muestra cuando un proceso diverge en máximo 4 subprocesos diferentes, los indicadores que representen cada subproceso deben ser etiquetados
Y Y lógica

Indica cuando múltiples indicadores de flujo convergen en un solo proceso

Commentario Comentario

Indicador para comentarios dentro del diagrama

Símbolo Significado Uso
Entrada y salida
Input Datos Indica datos que entran o salen del proceso por cualquier medio
Document Documento Indica la generación de un documento o informe
MultipleDocument Multidocumento Indica la generación de varios documentos o informes relacionados
Display Pantalla Indica la información a presentar en una pantalla
ManualInput Entrada manual Indica una entrada de datos, ya sea por teclado u otro método de entrada manual
Tajeta Impresión tarjeta Indica la impresión de datos en una tarjeta perforada
Símbolo Significado Uso
Archivos y almacenamiento
storedData Datos almacenados Representa un almacenamiento de datos ya sea para lectura o escritura en un disco magnético
Database Base de datos Indica el almacenamiento de datos en una base de datos
DirectAccess Almacenamiento de acceso directo Indica el almacenamiento en disco duro
InternalStorage Almacenamiento interno Indica que datos, archivos o documentos serán guardados o leídos desde memoria
SecuancialData Almacenamiento de acceso secuencial Archivo para instrucciones de lectura y grabación en una cinta magnética
Símbolo Significado Uso
Tratamiento de datos
Collate Intercalar Se usa cuando se requiere indicar la organización de datos de acuerdo a un formato estándar
Sort Ordenar Indica que los datos se deberán ordenar por orden ascendente o descendente

Teniendo conocimiento de los símbolos que se pueden usar en el diagrama de flujo vamos ahora a ver como seria un diagrama sencillo de la preparación de un plato de arroz blanco:

DiagramaFlujoArroz

Ha pesar de ser un diagrama a grandes rasgos de la preparación de arroz podemos notar que es un tanto grande, y es que si bien en este ejemplo se trato mas de ejemplificar el uso que del ser riguroso con las operaciones que conlleva la preparación del arroz, el diagrama de flujo debe expresar las operaciones de una manera atómica siempre y cuando estas no estén bien definidas, en cuyo caso podemos usar el símbolo de Subrutina.

El diagrama de flujo siempre debe de seguir la dirección hacia abajo y a la derecha en caso de que nos quedemos sin espacio, los conectores nos pueden ayudar a continuar el flujo en la misma pagina o en otra distinta dependiendo del conector que usemos, estos tendrán una numeración o bandera que deberá estar en ambos conectores, esto para evitar ambigüedad.

Cabe mencionar que dentro de los diagramas de flujo podemos tener operaciones en ciclo es decir que se repiten, para los casos en los que las repeticiones dependan de condicionales ya sea que un contador determinado llegue a un numero o que se cumpla cierta condición mientras se repiten las operaciones se deben usar el símbolo de Preparación o Preparación Manual para dejar en claro que condiciones se tienen que cumplir y el símbolo de Limite de loop para expresar hasta que instrucciones se ejecutaran en el ciclo, en este diagrama tenemos dos ciclos de un solo proceso en este caso y ya que no usamos algún contador o condicionales especiales es valido usar un símbolo Desicion para regresar el flujo a la operación anterior hasta que la condición se cumpla.

Recordemos que el diagrama de flujo es una representación visual de un algoritmo, usa símbolos estandarizados para que otras personas puedan entenderlo tal cual es, como esta organizado, el orden exacto de los procesos, las condiciones que siguen dichos datos; en la practica se usa para documentar y analizar los procesos que se están desarrollando de tal manera que se puedan encontrar posibles errores, cuellos de botella, redundancias o pasos innecesarios así como soluciones a estos mas eficazmente que si se llevara a cabo una revisión de código; al ser una abstracción sera difícil encontrar dos diagramas de flujo iguales que describan un mismo proceso aunque eso no quita que sean equivalentes, quedara del diagramador por tanto que el entendimiento de su diagrama sea completo,

La utilidad que tienen es vasta, no solo se utilizan para programación si no que también son usados en Negocios, Marketing, Manufactura, Ingenierías que lleven procesos en sus tareas, e incluso cocina, es por esto que a la fecha es una de las representaciones del algoritmo que aun siguen siendo muy usadas y enseñadas, queda a discreción del lector analizar la simbología y practicarla, un buen inicio para esto seria crear un diagrama de flujo que nos enseñe el proceso del algoritmo de Euclides anteriormente mencionado.

El pseudo-código

Hablemos ahora del código falso o pseudo-código es otra de las formas mas comunes de representar un algoritmo, básicamente es un código de alto nivel muy cercano al lenguaje natural que sigue las mismas normas semánticas que un lenguaje de programación pero la sintaxis es libre para asegurar que sea legible por humanos, al igual que el diagrama de flujo describe los pasos en secuencia ordenada de como llevar a acabo un proceso.

La estructura debe ser clara y concisa para evitar ambigüedades y en caso de describir procesos estos deben de empezar con la palabra clave que mejor describa al procedimiento, estas pueden ser: Proceso, Funcion, Procedimiento, Metodo, etc. seguido del nombre del mismo, ademas se debe de incluir la instrucción de cierre referente a donde termina dicho proceso como: FinProceso, FinFuncion, FinProcedimiento, etc., se entiende que todas las instrucciones de dicho proceso se escribirán dentro de estas dos instrucciones.

Proceso ArrozBlanco
    instruccion 1;
    .
    .
    instruccion n;
FinProceso 

Las instrucciones deberán empezar de izquierda a derecha y estar limitadas por algún símbolo o token, como es el ‘;’ que sigue la norma de los lenguajes como C o Java o el salto de linea siguiendo la norma de python, también es una buena practica tener en cuenta las tabulaciones cada que empiece código en un bloque eso facilita la lectura para otros desarrolladores ademas de que permite visualizar mas concretamente donde puede estar faltandonos una instrucción de cierre, un error común al iniciar la practica del pseudo-código. Utilicemos el pseudo-código derivado del diagrama de flujo anterior para entender un poco mejor su estructura:

Proceso ArrozBlanco

    Obtener(Arroz);
    Obtener(Sal);
    Obtener(Aceite);
    Obtener(Agua);
    Obtener(Cacerola);
    Obtener(Parrilla);
    Obtener(Espatula);
    Obtener(Platos);
    
    Mientras Arroz.Almidon != 0 
    
        Lavar(Arroz);

    FinMientras
    
    Escurrir(Arroz);
    
    Parrilla.Encendido = si;
    
    Parrilla.Fuego.Alto = si;    

    CaceloraPreparada = Preparar(Cacerola, Aceite);
    
    PonerEnParrilla(Parrilla, CaceloraPreparada);

    Verter(Arroz, CacerolaPreparada);
    
    Mientras Arroz.Color != CafeClaro

        MoverConEspatula(Espatula, Arroz);

    FinMientras    

    Verter(Agua, CacerolaPreparada, 2:1);

    Verter(Sal, CacerolaPreparada, AlGusto);
    
    Mientras CaceloraPreparada.Agua.Estado != Ebullicion

        EsperarCoccion(Parrilla);

    FinMientras

    CaceloraPreparada.Tapar = si;
    
    Parrilla.Fuego.Alto = no; 

    Parrilla.Fuego.Bajo= si; 

    EsperarMinutos(15);
    
    Parrilla.Encendido = no;

    CaceloraPreparada.Tapar = no;
    
    ServirArroz(CacerolaPreparada);

FinProceso

Como podemos ver a diferencia del diagrama de flujo el pseudo-código es mas rápido de leer y escribir, también se puede ver que esta forma de representar algoritmos es un poco mas técnica en el aspecto de que se pueden usar recursos que ya están definidos dentro de los lenguajes de programación, en este ejemplo utilizamos funciones y propiedades de los diferentes elementos a usar para preparar el arroz y llegar al objetivo, los métodos usados aquí y marcados con negritas son operaciones bien conocidas y por tanto podemos omitir en el documento su definición, pero de no serlo el documentador deberá incluir su definición hasta llegar a operaciones atómicas tal como sucede en un lenguaje de programación real.

Las palabras reservadas tales como Mientras, Desde, Para, Hasta, Si Entonces, Si no Entonces, son palabras que emulan las estructuras de control de un lenguaje de programación, estas también deberán llevar su instrucción de cierre y sirven para diferentes cosas; las palabras Mientras, Desde y Para son ciclos que se repiten hasta que cierta condición se cumpla y se repetirá todo lo que este dentro de la instrucción de inicio y fin de la estructura, y las palabras Si Entonces y Si no Entonces, son usadas para bifurcar el flujo del código dependiendo de la condición dada; Como no hay reglas estrictas sintácticamente estas palabras pueden ser en otro idioma o representarse diferente y pueden usarse las palabras reservadas de cualquier lenguaje de programación para denotar acciones mas especificas siempre y cuando estas puedan ser perfectamente interpretadas por cualquier lector del pseudo-codigo.

Ambas herramientas, el diagrama de flujo y el pseudo-codigo, son muy útiles para representar algoritmos y cada uno tiene sus pros y sus contras, si bien el diagrama de flujo es mas simple y tiene reglas mejor definidas puede llegar a ser mas tedioso ya que debido al alto nivel de gráficos un algoritmo significativamente complejo puede llegar a ser muy grande y difícil de leer y retener; el pseudo-codigo puede ser significativamente mas detallado y estructurado pero el nivel técnico tiende a ser mayor para su entendimiento que el diagrama de flujo aunque no tanto como en un lenguaje de programación tradicional, como siempre quedara de la persona que documente su algoritmo en cualquiera de las dos representaciones que este sea entendible y no de pie a las ambigüedades.

Fuentes

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *