Introducción a los algoritmos

11

Click here to load reader

Transcript of Introducción a los algoritmos

Page 1: Introducción a los algoritmos

Variable

En programación, las variables son estructuras de datos que, como su nombre indica, pueden cambiar de contenido a lo largo de la ejecución de un programa. Una variable corresponde a un área reservada en la memoria principal del ordenador pudiendo ser de longitud:

• Fija .- Cuando el tamaño de la misma no variará a lo largo de la ejecución del programa. Todas las variables, sean del tipo que sean tienen longitud fija, salvo algunas excepciones — como las colecciones de otras variables (arrays) o las cadenas.

• Variable .- Cuando el tamaño de la misma puede variar a lo largo de la ejecución. Típicamente colecciones de datos.

Tipos de datos

Debido a que las variables contienen o apuntan a valores de tipos determinados, las operaciones sobre las mismas y el dominio de sus propios valores están determinadas por el tipo de datos en cuestión. Algunos tipos de datos usados:

• Tipo de dato lógico. • Tipo de dato entero. • Tipo de dato de coma flotante (real, con decimales). • Tipo de dato carácter. • Tipo de dato cadena

Variables y paso de parámetros a subalgoritmos

Las variables pueden ser intercambiadas entre rutinas, por valor y por referencia:

• Por valor .- Se copia el valor (el dato) de la variable en la zona de la pila de llamadas —de ámbito local— que corresponde a la nueva subrutina llamada. Por tanto, esta subrutina obtiene dicho valor pero no puede modificar la variable original. Esto significa que si la variable sufre alteraciones dentro de esta rutina, para poder acceder a dichas modificaciones al finalizar, deberá devolver el nuevo valor de la misma. Si no se realiza esta operación, el valor de la variable será exactamente el mismo que tenía antes de pasar por la función.

• Por referencia .- No se pasa el valor directamente de la variable, si no una referencia o puntero a la misma —que contiene la dirección de la zona de memoria donde se aloja el contenido—, de tal modo que se opera directamente sobre la zona de memoria que la contiene, lo cual implica que las modificaciones que sufra serán accesibles a posteriori.

Page 2: Introducción a los algoritmos

Almacenamiento de variables en memoria

Las variables se representan con identificadores que hacen referencia a un lugar de la memoria del programa en donde se almacena un dato. Una variable está asociada a un tipo de datos, el cual y en función del tamaño del mismo determina la cantidad de bytes que serán necesarios para almacenar la variable. En el caso de colecciones y al contrario que con el resto de tipo de datos, ya sean primitivos u objetos complejos, la memoria asignada a almacenar tales variables no se conoce de antemano, lo cual lleva a establecer políticas de reserva de memoria:

• Reserva fija de memoria .- Implica predeterminar la cantidad de memoria que se asignará a la colección. Es una política extremadamente rígida, ya que llegados al final de la zona de memoria no se podrían almacenar nuevos elementos.

• Reserva variable de memoria .- Se dedica una zona de memoria, pudiendo ser de un tamaño predeterminado o no, y en caso de sobrepasarse dicha zona de memoria se vuelve a asignar otra zona, contigua o no, para impedir la restricción mencionada arriba.

Ámbito

Respecto al ámbito de una variable, éste puede ser:

• Local: Cuando la misma sólo es accesible desde un único procedimiento hijo, no pudiendo ser leída o modificada desde otro procedimiento hermano o desde el propio procedimiento padre. Es posible declarar variables en bloques de condición, bucles, etc de tal modo que sólo pueda accederse a ellas en el propio bloque.

• Global: Cuando la misma es accesible tanto desde rutinas o macros de la aplicación, como en todos los procedimientos y funciones de la misma.

Si bien es cierto, que de una forma básica, se puede definir el ámbito de las variables de la forma expuesta más arriba, existen grados de globalidad de las mismas, pudiendo ser accesibles desde unos puntos u otros, o incluso pudiendo ser accesibles entre aplicaciones distintas, llegando al caso de la superglobalidad.

Tipo de dato lógico

El tipo de dato lógico o booleano es en computación aquel que puede representar valores de lógica binaria, esto es, valores que representen falso o verdadero. Se utiliza normalmente en la programación, estadística, electrónica, matemáticas (Álgebra booleana), etc...

Page 3: Introducción a los algoritmos

Para generar un dato o valor lógico a partir de otros tipos de datos, típicamente, se emplean los operadores relacionales (u operadores de relación), por ejemplo: 0 es igual a falso y 1 es igual a verdadero

• (3>2)= 1 = verdadero • (7>9)= 0 = falso

Una vez se dispone de uno o varios datos de tipo booleano, estos se pueden combinar en expresiones lógicas mediante los operadores lógicos (AND, OR, NOT, ...). Un ejemplo de este tipo de expresiones serían:

• verdadero AND falso --> falso • falso OR verdadero --> verdadero • NOT verdadero --> falso

Función booleana

Se denomina función lógica o booleana a aquella función matemática cuyas variables son binarias y están unidas mediante los operadores del álgebra de Boole suma lógica (+), producto lógico (·) o negación(').

Modos de representación

Existen distintas formas de representar una función lógica, entre las que podemos destacar las siguientes:

• Algebraica • Por tabla de verdad • Numérica • Gráfica

El uso de una u otra, como veremos, dependerá de las necesidades concretas en cada caso.

Algebraica

Se utiliza cuando se realizan operaciones algebraicas. A continuación se ofrece un ejemplo con distintas formas en las que se puede expresar algebraicamente una misma función de tres variables.

a) F = [(A + BC’)’ + ABC]’ + AB’C b) F = A’BC’ + AB’C’ + AB’C + ABC’ c) F = (A + B + C)(A + B + C’)(A + B’ + C’)(A’ + B’ + C’) d) F = BC’ + AB’ e) F = (A + B)(B’ + C’) f) F = [(BC’)’ · (AB’)’]’

Page 4: Introducción a los algoritmos

g) F = [(A + B)’ + (B’ + C’)’]’

La expresión a) puede proceder de un problema lógico planteado o del paso de unas especificaciones a lenguaje algebraico. Las formas b) y c) reciben el nombre expresiones canónicas: de suma de productos (sum-of-products, SOP, en inglés), la b), y de productos de sumas (product-of-sums, POS, en inglés), la c); su característica principal es la aparición de cada una de las variables (A, B y C) en cada uno de los sumandos o productos. Las d) y e) son funciones simplificadas, esto es, reducidas a su mínima expresión. Las dos últimas expresiones tienen la particularidad de que exclusivamente utiliza funciones NO-Y, la f), o funciones NO-O, la g).

Por tabla de verdad

Una tabla de verdad contiene todos los valores posibles de una función lógica dependiendo del valor de sus variables. El número de combinaciones posibles para una función de n variables vendrá dado por 2n. Una función lógica puede representarse algebraicamente de distintas formas como acabamos de ver, pero sólo tiene una tabla de verdad. La siguiente tabla corresponde a la función lógica del punto anterior.

A B C F

0 0 0 0

0 0 1 0

0 1 0 1

0 1 1 0

1 0 0 1

1 0 1 1

1 1 0 1

1 1 1 0

La forma más cómodo para ver la equivalencia entre una tabla de verdad y una expresión algebraica es cuando esta última se da en su forma canónica. Así, la función canónica de suma de productos

F = A’BC’ + AB’C’ + AB’C + ABC’

Page 5: Introducción a los algoritmos

nos indica que será 1 cuando lo sea uno de sus sumandos, lo que significa que tendrá por lo tanto cuatro combinaciones que lo serán (010 para A’BC’, 100 para AB’C’, 101 para AB’C y 110 para ABC’) siendo el resto de combinaciones 0. Con la función canónica de producto de sumas se puede razonar de forma análoga, pero en este caso observando que la función será 0 cuando lo sea uno de sus productos.

También es fácil obtener la tabla de verdad a partir de la función simplificada, pero no así a la inversa.

Numérica

La representación numérica es una forma simplificada de representar las expresiones canónicas. Si consideramos el criterio de sustituir una variable sin negar por un 1 y una negada por un 0, podremos representar el término, ya sea una suma o un producto, por un número decimal equivalente al valor binario de la combinación. Por ejemplo, los siguientes términos canónicos se representarán del siguiente modo (observe que se toma el orden de A a D como de mayor a menor peso):

AB’CD = 10112 = 1110 A’ + B + C’ + D’ = 01002 = 410

Para representar una función canónica en suma de productos utilizaremos el símbolo Σn (sigma) y en producto de sumas Πn (pi), donde n indicará el número de variables. Así, la representación numérica correspondiente a la tabla de verdad del punto anterior quedará como:

F = Σ3(2, 4, 5, 6) = Π3(0, 1, 3, 7)

Matemáticamente se demuestra, que para todo término i de una función, se cumple la siguiente ecuación:

F = [Σn(i)]' = Πn(2n-1-i )

A modo de ejemplo se puede utilizar esta igualdad para obtener el producto de sumas a partir de la suma de productos del ejemplo anterior:

F = Σ3(2, 4, 5, 6) = [Σ3(2, 4, 5, 6)]' ' = [Σ3(0, 1, 3, 7)]' = Π3(0, 4, 6, 7)

Gráfica

La representación gráfica es la que se utiliza en circuitos y esquemas electrónicos. En la siguiente figura se representan gráficamente dos funciones algebraicas, una con símbolos no normalizados, superior, y la otra con normalizados, inferior (véanse los símbolos de las puertas lógicas)

Page 6: Introducción a los algoritmos

Representación gráfica de dos funciones lógicas

Métodos de simplificación

Por simplificación de una función lógica se entiende la obtención de su mínima expresión. A la hora de implementar físicamente una función lógica se suele simplificar para reducir así la complejidad del circuito.

A continuación se indican los modos más usuales de simplificar una función lógica.

Algebraico

Para la simplificación por este método no sólo bastará con conocer todas las propiedades y teoremas del álgebra de Boole, además se debe desarrollar una cierta habilidad lógico-matemática que se adquiere fundamentalmente con la experiencia.

Gráfico de Karnaugh

Este método consiste en formar diagramas de 2n cuadros, siendo n el número de variables. Cada cuadro representa una de las diferentes combinaciones posibles

Page 7: Introducción a los algoritmos

y se disponen de tal forma que se puede pasar de un cuadro a otro en las direcciones horizontal o vertical, cambiando únicamente una variable, ya sea en forma negada o directa.

Este método se emplea fundamentalmente para simplificar funciones de hasta cuatro variables. Para un número superior utilizan otros métodos como el numérico. A continuación pueden observarse los diagramas, también llamados mapas de Karnaugh, para dos, tres y cuatro variables.

Mapas de Karnaugh para dos, tres y cuatro variables

Es una práctica común numerar cada celda con el número decimal correspondiente al término canónico que albergue, para facilitar el trabajo a la hora de plasmar una función canónica.

Para simplificar una función lógica por el método de Karnaugh se seguirán los siguientes pasos:

1º) Se dibuja el diagrama correspondiente al número de variables de la función a simplificar.

2º) Se coloca un 1 en los cuadros correspondientes a los términos canónicos que forman parte de la función.

3º) Se agrupan mediante lazos los unos de casillas adyacentes siguiendo estrictamente las siguientes reglas:

a) Dos casillas son adyacentes cuando se diferencian únicamente en el estado de una sola variable. b) Cada lazo debe contener el mayor número de unos posible, siempre que dicho número sea potencia de dos (1, 2, 4, etc.) c) Los lazos pueden quedar superpuestos y no importa que haya cuadrículas que pertenezcan a dos o más lazos diferentes. d) Se debe tratar de conseguir el menor número de lazos con el mayor número de unos posible.

Page 8: Introducción a los algoritmos

4º) La función simplificada tendrá tantos términos como lazos posea el diagrama. Cada término se obtiene eliminando la o las variables que cambien de estado en el mismo lazo.

A modo de ejemplo se realizan dos simplificaciones de una misma función a partir de sus dos formas canónicas:

F = Σ3(0,2,3,4,7) = Π3(1,2,6)

De acuerdo con los pasos vistos anteriormente, el diagrama de cada función quedará del siguiente modo:

Simplificación de una función de tres variables

La función simplificada tendrá tres sumandos en un caso y dos productos en el otro. Si nos fijamos en el mapa correspondiente a la suma de productos, observamos que en el lazo 1 cambia la variable A (en la celda 0 es negada y en la 4 directa), en el lazo 2 es la C y en el lazo 3 vuelve a ser A. por lo tanto, la ecuación simplificada es:

F = B’C’ + A’B + BC

Razonando de modo similar en el mapa de productos de sumas, nos quedará:

F = (B + C’)(A’ + B’ + C)

Numérico de Quine-McCluskey

El algoritmo Quine-McCluskey permite la simplificación de funciones lógicas de cualquier número de variables y es el que se utiliza para diseñar aplicaciones informáticas en las que se necesite obtener funciones simplificadas.

Page 9: Introducción a los algoritmos

A continuación se indican los pasos a seguir en este método a partir de un ejemplo.

1º) Se expresa la función a simplificar en su forma canónica de suma de productos.

Sea la siguiente función a simplificar:

F = S4 (0,1,2,3,5,9,11,12,13,15)

2º) Se forma una tabla con el valor decimal de la combinación, el estado de las variables y el índice (número de unos que contiene el estado de las variables).

Comb. Estado Índice

0 0000 0

1 0001 1

2 0010 1

3 0011 2

5 0101 2

9 1001 2

11 1011 3

12 1100 2

13 1101 3

15 1111 4

3º) Se agrupan las combinaciones cuyos estados difieren en una sola variable, sustituyéndola por un guión bajo (_). Las combinaciones utilizadas se marcan con un aspa (X). Hay que fijarse en las combinaciones cuya diferencia entre sus respectivos índices es la unidad.

Page 10: Introducción a los algoritmos

Agrupación de las combinaciones

4º) Se repite el proceso anterior las veces que sean necesarias y se van eliminando estados idénticos.

Nueva agrupación de las combinaciones

5º) Se forma una tabla con las combinaciones y jodance finales y las no agrupadas. Se toman como filas las combinaciones finales y las no agrupadas y como columnas los valores decimales de dichas combinaciones. Cada celda que contenga el valor decimal de una combinación se marca con un aspa. A continuación nos fijamos en aquellas columnas con una sola aspa; sus combinaciones serán esenciales. Finalmente se toman aquellas combinaciones de los valores decimales no seleccionados, teniendo precaución de no tomar aquellas combinaciones cuyos valores decimales hayan sido ya tomados en otras combinaciones. La función simplificada final viene dada por las combinaciones esenciales y estas últimas.

Page 11: Introducción a los algoritmos

Función incompleta

Hasta ahora todas las funciones estudiadas tienen definido un valor lógico, 0 ó 1, para cada una de las posibles combinaciones. Estas funciones se denominan completas o totalmente definidas. También existen funciones con una o varias combinaciones no definidas, llamadas funciones incompletas. Esta situación puede deberse por las dos causas siguientes:

1. Hay combinaciones de entrada que no existen, por lo que a la salida se le puede asignar indistintamente el valor 0 o el 1.

2. En ciertas combinaciones de entrada la salida del sistema lógico está inhibida, siendo por lo tanto su valor indiferente.

En la tabla de verdad de una función incompleta, los términos indiferentes se designan mediante una equis (X). En cuanto a la forma canónica se separan los términos definidos de los que no lo son (indicados mediante el símbolo φ).

A la hora de simplificar una función incompleta, los términos indiferentes servirán como “comodines” a la hora de tomar lo lazos, esto es, si nos interesa que sea un 1 porque así el lazo es mayor, lo tomaremos como 1, y en caso contrario como 0.