lunes, 30 de noviembre de 2015

Arboles Binarios

Definición  Un arbol binario es una estructura de datos de tipo árbol en donde cada uno de los nodos del árbol puede tener 0, 1, ó 2 subárboles llamados de acuerdo a su caso como:
  • Si el nodo raíz tiene 0 relaciones se llama hoja.
  • Si el nodo raíz tiene 1 relación a la izquierda, el segundo elemento de la relación es elsubárbol izquierdo.
  • Si el nodo raíz tiene 1 relación a la derecha, el segundo elemento de la relación es el subárbol derecho.
La figura 25 muestra algunas configuraciones de grafos que sí son árboles binarios, y la figura 26muestra algnas configuraciones de grafos que no son árboles binarios.


    Figura 25: Grafos que son estructuras tipo árbol binario 
                                              Image sabin

Figura 26: Grafos que no son árboles binarios 
Vamos a dar una lista de teérminos que se usan frecuentemente cuando se trabaja con árboles:
  • Si A es la raíz de un árbol y B es la raíz de su subárbol izquierdo (o derecho), se dice que A es el padre de B y se dice que B es el hijo izquierdo (o derecho) de A
  • Un nodo que no tiene hijos se denomina hoja 
  • El nodo a es antecesor del nodo b (y recíprocamente el nodo b es descendiente del nodo a), sia es el padre de b o el padre de algún ancestro de b
  • Un nodo b es un descendiente izquierdo del nodo a, si b es el hijo izquierdo de a o un descendiente del hijo izquierdo de a. Un descendiente derecho se define de la misma forma. 
  • Dos nodos son hermanos si son hijos izquierdo y derecho del mismo padre.
Otros términos relacionados con árboles, tienen que ver con su funcinoamiento y topología:
  • Si cada nodo que NO es una hoja tiene un subárbol izquierdo y un subárbol derecho, entonces se trata de un árbol binario completo
  • El nivel de un nodo es el número de aristas que se deben recorrer para llegar desde ese nodo al nodo raíz. De manera que el nivel del nodo raíz es 0, y el nivel de cualquier otro nodo es el nivel del padre más uno. 
  • La profundidad de un nodo es el máximo nivel de cualquier hoja en el árbol.
Si un árbol binario tiene $ m$ nodos en el nivel $ l$ , el máximo número de nodos en el nivel $ l+1$ es $ 2m$ . Dado que un árbol binario sólo tiene un nodo en el nivel 0, puede contener un máximo de $ 2^l$nodos en el nivel $ l$ . Un árbol binario completo de profundidad $ d$ es el árbol que contiene exactamente $ 2^l$ nodos en cada nivel $ l$ entre 0 y $ d$ . La cantidad total de nodos $ t_n$ en un árbol binario completo de profundidad $ d$ , es igual a la suma de nodos en cada nivel entre 0 y $ d$ , por tanto:                           


Usando inducción matemática se puede demostrar que $ \sum_{j=0}^d 2^j=2^{d+1}-1$ . Dado que todas las hojas en este árbol están en el nivel $ d$ , el árbol contiene $ 2^d$ hojas y, por tanto, $ 2^d-1$ nodos que no son hojas.
Si conocemos el número total de nodos $ t_n$ en un árbol binario completo, podemos calcular su profundidad $ d$ , a partir de la expresión $ t_n=2^{d+1}-1$ . Así sabemos que la profundidad $ d$ es igual a 1 menos que el número de veces que 2 debe ser multiplicado por sí mismo para llegar a $ t_n+1$ . Es decir, que en un árbol binario completo,
Definición 11   Un árbol binario es un árbol binario casi completo si:
  1. Cualquier nodo $ nd$ a un nivel menor que $ d-1$ tiene 2 hijos
  2. Para cualquier nodo $ nd$ en el árbol con un descendiente derecho en el nivel $ d$ debe tener un hijo izquierdo y cada descendiente izquierdo de $ nd$ :
    • es una hoja en el nivel $ d$ ó
    • tiene dos hijos

Figura 27: Comparación de un árbol binario y un árbol binario casi completo. El árbol mostrado en (A) descumple la regla 2 de los árboles binarios casi completos.

Los nodos en un árbol binario (completo, casi completo o incompleto) se pueden enumerar del siguiente modo. Al nodo raíz le corresponde el número 1, al hijo izquierdo le corresponde el doble del número asignado al padre y al hijo derecho le corresponde el doble más 1 del número asignado al padre.


Isomorfismo


Isomorfismo de grafos

Dados G=(V,E) y G´=(V´,E´), se denomina isomorfismo de G a G´ a la aplicación biyectiva f  tal que para a,bÎV, {a,b}ÎE Û se cumple {f(a),f(b)}ÎE´. Es decir, la aplicación que relaciona biyectivamente pares de vértices de E con pares de vértices de E´, de modo que los vértices conectados por aristas siguen estándolo.

G y G´ se denominan isomorfos, y son matemáticamente iguales, solo varia la apariencia, o sea, que se mantienen las adyacencias, estructura, caminos y ciclos.

Los grafos G y G ‘ son isomorfos pues existe la biyección f: V ® V ‘ definida por f(a) = 2, f(b) = 1, f(c) = 3, f(d) = 4 que conserva la adyacencia.

Complejidad

Los problemas matemáticos se pueden dividir en primera instancia en dos grupos:

Problemas indecidibles: aquellos que no se pueden resolver mediante un algoritmo.

 Problemas decidibles: aquellos que cuentan al menos con un algoritmo para su cómputo.

Sin embargo, que un problema sea decidible no implica que se pueda encontrar su solución, pues muchos problemas que disponen de algoritmos para su resolución son inabordables para un computador por el elevado número de operaciones que hay que realizar para resolverlos. Esto permite separar los problemas decidibles en dos:

intratables: aquellos para los que no es factible obtener su solución.

tratables: aquellos para los que existe al menos un algoritmo capaz de resolverlo en un tiempo razonable.

Los problemas pueden clasificarse también atendiendo a su complejidad. Aquellos problemas para los que se conoce un algoritmo polinómico que los resuelve se denominan clase P. Los algoritmos que los resuelven son deterministas. Para otros problemas, sus mejores algoritmos conocidos son no deterministas. Esta clase de problemas se denomina clase NP. Por tanto, los problemas de la clase P son un subconjunto de los de la clase NP, pues sólo cuentan con una alternativa en cada paso.

El problema de isomorfismo de grafos no se sabe si es un problema de la clase P o de la clase NP, y si hubiese una clase intermedia entre ambas, el isomorfismo de grafos sería el tipo de problema ideal para ella.


Existe un caso concreto de grafos (los árboles) donde el problema del isomorfismo si se puede resolver mediante la aplicación de algoritmos no muy complejos. Este caso será el que desarrollaremos en la segunda parte del proyecto, apartado 

Circuitos Aritméticos

Los circuitos integrados más representativos para la realización de operaciones aritméticas básicas tales como la suma y la comparación. Adicionalmente, se analiza una ALU en circuito integrado con la cual se pueden llevar a cabo una variedad de operaciones de lógica y aritmética.

La forma mas simple de realizar una operación aritmética electrónicamente, es usando un circuito llamado semi-sumado (Haft Adder). Este dispositivo permite que sean aplicados 2 bits de entradas (A,B) para producir dos salidas: uno correspondiente a resultado de la suma (S) y la otra correspondiente a acarreo (C) según se muestra en la tabla Nº1.

A
B
S
C
0
0
0
0
0
1
1
0
1
0
1
0
1
1
0
1

TABLA Nº1. Tabla de Verdad el circuito semi-sumador



Como se puede notar, la salido S es el resultado de una EX-OR entre A y B como entradas: por otro lado C es el resultado de una AND entre las mismas entradas. En la figura Nº1 se muestra el circuito de semi-sumador. Este semi-sumador presenta la limitación de que no posee uno entrada para el acarreo de la etapa previa, en caso de que desee sumar mas de 2 bits. Se debe recurrir entonces a sumador total b sumador completo (Full Adder). Este tipo de circuito acepta 3 bits de entrada por separado, llamados sumando, consumando y acarreo de entrada A, B y Cin respectivamente, mientras que las salidas son S y Cout.



                                               Figura Nº1. El semisumador



Sumadores binarios de 4 bits:
Las operaciones aritméticas se presentan con tal frecuencia que se han desarrollado un número de circuitos integrados especiales para llevarlas a cabo. El 74LS283 es un buen exponente de esta clase de dispositivos, siendo, en esencia, un sumador hexadecimal de 4 bits, Por lo tanto, acepta como entradas dos números de 4 bits de cada uno, A y B, y un bit de acarreo previo, CO. Los 4 bits correspondientes al número A se conectan a las entradas Al, A2, A3 y A4. Las cuatro entradas del dato B se conecta de manera similar. El sumador genera como resultado un número de 4 bits correspondientes a la suma de los dos datos, A y B, además de un bit de acarreo, C4. En la figura Nº2 se muestra la configuración de pines del 74LS283.



                               Figura Nº 2. Configuración de pines del 74LS283

La operación del circuito integrado puede describirse en forma resumida de la siguiente manera:

Si la suma de los dos datos de entrada más el acarreo previo arroja un resultado entre O y 15, la suma aparecerá en las salidas de suma y el bit de acarreo de salida, C4 se hace igual a cero.

Si el resultado de la suma se sitúa entre 16 y 31, el bit de acarreo C4 se pone en 1 y las salidas correspondientes a los bits de suma se hacen iguales al valor del resultado menos 16. Observe que en el su mador de 4 bits, el bit de acarreo resultante posee un peso binario igual a 16.

Ejemplo:

Suponga entradas a un sumador como el siguiente:
A4A3A2A1= 01112 (716)
B4B3B2B1 = 10102 (A16)
CO=1
En este caso, la suma de los tres datos de entrada, 0111 + 1010 + 1 resulta ser igual 18. De acuerdo a las reglas anteriores, se produce un bit de acarreo igual 1 y las salidas adoptan un valor de 2 (esto es, 18 menos 16). Por lo tanto, C4 = 1 y 4 3 2 1=0010.


Sumadores en cascada
Es posible implementar sumadores para palabras de tamaño superiores a 4 bits si se disponen varios 74LS283 en cascada. Para el efecto, basta simplemente con conectar la salida C4 del sumador de menor peso a la entrada CO del sumador siguente. En la figura Nº 3 se muestra como se conectarían dos 74LS283 en cascada para con formar un sumador de 8 bits. Los dos sumadores se muestran recibiendo como datos a dos números binarios de 8 bits cada uno cuyos valores son: A=11001010, B = 11100111, CO=0. El resultado de la operación, mostrado también en la misma figura es 10110001 y C4= 1.+




                               Figura Nº 3. Configuración en cascada 74LS283

La operación de resta con el 74LS283
El mismo circuito integrado descrito anteriormente puede ser utilizado para llevar a la práctica operaciones de resta. Más aún, tanto la suma como la resta son, desde el punto de vista digital, muy similares, por lo cual resulta fácil la implementarla de circuitos digitales que permitan seleccionar una u otra operación. En la figura Nº4 se muestra la forma como podría alambrarse, con la ayuda de 4 compuertas XOR auxiliares, un circuito sumador que permita, según la posición de un conmutador de selección, ejecutar la suma o la resta de dos datos binarios de 4 bits cada uno.

               Figura Nº 4. Configuración 74LS283 como restador/sumador de 4 bits

Unidades de lógica y aritmética, ALU
Las ALU (Arithmetic Logic Units), o unidades de lógica y aritmética, son dispositivos muy versátiles que pueden programarse para llevar a cabo una gran variedad de operaciones aritméticas y lógicas entre dos palabras binarias. En la figura Nº 5 se muestra e! diagrama de pines de 74LS181, una ALU de 4 bits en tecnología TTL. Como se observa de la figura, el positivo consta de dos grupo líneas de entrada A3A2A1A0
y B3B2B1B0, un grupo líneas neas de salida F3F2F1F0, un grupo de líneas selectoras de función S3S2S1S0 una línea selectora de modo M, una entrada de acarreo previo Cn. una salida de acarreo resultante Cn+4, una salida de comparación A=B y dos salidas de expansión P,G.





Figura Nº 5. Configuración de pines de una ALU 74LS181

Programando adecuadamente las líneas de selección, S3S2S1S0 y la de modo M junto con la de acarreo previo, Cn, IaALU puede ejecutar 16 operaciones lógicas y 32 operaciones aritméticas diferentes con los datos A=A3A2A1A0  B=B3B2B1B0. Estas operaciones, con sus respectivos códigos de selección, se relaciona en la tabla de la figura Nº 6. Se asume que tanto las entradas como las salidas son activas en alto.
Para programar el dispositivo como generador de funciones lógicas, la entrada se- lectora de modo, M, debe estar a nivel alto. La operación lógica deseada se programa mediante un código de 4 bits de la forma S3S2SISO aplicado a las entradas selectoras de función. El estado de la entrada de acarreo Cn es indiferente por lo cual puede fijarse en cualquier nivel.
Por ejemplo, para realizar la operación lógica A XOR B A= 1011 y B=000l, la línea M debe estar en 1 lógico y en las líneas S3S2S1S0 debe aplicarse el código 0110.

Cada bit de la palabra de salida F = F3F2F1F0 es el resultado de la operación XOR de cada bit de la palabra A con el correspondiente bit de la palabra B. Es decir, P3 =A3 XOR B3, F2 = A2 XOR B2 y así sucesivamente. Por tanto, F = 1010.
Para programar la ALU como generadora de funciones aritméticas, la línea M debe llevarse a nivel bajo con el fin de habilitar los acarreos internos. La suma de A y B, por ejemplo, se realiza cuando el código de las entradas de se lección es 1001. La entrada de acarreo Cn es activa en bajo.
Si la suma produce un acarreo de salida igual a 1, esté también será activo en bajo. La ALU utiliza un sistema interno de generación de acarreos conocido como carry look ahead (acarreo en adelanto), que no requiere que la suma sea calculada en su totalidad antes de establecer la naturaleza del acarreo resultante.





Figura Nº 6. Tabla de las funciones del 74LS181



La ALU 74LS381
Muchas de las funciones disponibles en la 74LS181 son de poco valor práctico. En respuesta a esto, los fabricantes de ALUs han introducido al mercado el circuito integrado 74LS381, el cual implementa a una ALU un poco más pequeña y sencilla. En la figura Nº 7 se muestra su configuración de pines, la asignación de funciones de cada uno de ellos y su tabla de funciones. Observe que solo se dispone de tres líneas de selección y que no existe un pin de selección de modo, M, por lo cual este dispositivo solo puede desollarse ocho funciones en total. Estas corresponden a las operaciones aritméticas y lógicas de más frecuente uso.



Figura Nº 7. Configuración de pines, asignación de funciones y tabla de operación de una ALU 74LS381


Circuitos de Comparación Binaria
Un comparador de magnitud es un circuito lógico, por lo general combinacional, que compara dos palabras binarias e informa, en líneas de salida independientes, cuándo la una es mayor, menor o igual que la otra. Un ejemplo clásico de este tipo de circuitos es el 74LS85.
Este dispositivo compara dos códigos binarios de 4 bits A y B aplicados en paralelo a las entradas A3A2A1A0 y B3B2B1B0 respectivamente, e indica en tres líneas de salida activas en alto sus magnitudes relativas. Es decir, cuándo A es mayor, menor o igual a B. En la figura Nº 8 se muestra su configuración de pines, su diagrama funcional y su tabla de verdad. Específicamente, la salida A>B, pin 5, se activa cuando A es mayor que B, la salida A=B cuando A es igual a B y la salida A<B cuando A es menor que B. Las salidas no activas permanecen en bajo. Por ejemplo, si A= 11012 (1310) y B = 01012 (510), se activa la Salida A>B, indicando que 1310 (A16) es mayor que 5 (B16).



Figura Nº 8. Configuración de pines, asignación de funciones y tabla de operación de 74LS85


El 74LS85 también cuenta con tres líneas de entrada adicionales que le permiten conectarse en cascada a unidades similares para comparar números de mayor longitud. Las entradas son A<B, pin 2, A=B, pin 3, y A>B, pin 4. En la figura Nº 9 se muestra la manera como se conectarían dos de estos.




                                    Figura Nº 9. 74LS85 conectado en cascada



Conclusión

Dada la importancia de las operaciones aritméticas básicas en el diseño de circuitos digitales, se ha realizado un recuento de los principales circuitos integrados que las implementan. En particular, se examinaron los sumadores de 4 bits y la forma como pueden conectarse en cascada para aumentar el tamaño de los números procesados. Adicional- mente, se demostró el uso de sumadores que con una pequeña cantidad de lógica adicional permiten obtener fácilmente la operación de resta.
Las ALUs, o unidades de lógica y aritmética, tan interesantes como versátiles, fueron introducidas mediante el análisis del circuito integrado 74LS181 que las representa bien. Sin embargo, para aplicaciones menos exigentes, se planteó la posibilidad de una implementación alterna a través de la 74LS381, que aunque menos poderosa que la 181, es mucho más sencilla de utilizar.

Finalmente, el tema de los circuitos comparadores de magnitud se discutió en algún de talle a través de la explicación de la operación de un comparador de magnitud de 4 bits típico como es el 74LS85. La disponibilidad de pines de control adicionales en este dispositivo hace posible extender el proceso de comparación a números binarios de mayor tamaño, mediante el artificio de la conexión en cascada de tantos comparadores como sea necesario para alcanzar los objetivos planteados.

Diagramas de Flujo

Los diagramas de flujo son una manera de representar visualmente el flujo de datos a travéz de sistemas de tratamiento de información. Los diagramas de flujo describen que operaciónes y en que secuencia se requieren para solucionar un problema dado.

Un diagrama de flujo u organigrama es una representación diagramática que ilustra la secuencia de las operaciones que se realizarán para conseguir la solución de un problema. Los diagramas de flujo se dibujan generalmente antes de comenzar a programar el código frente a la computadora. Los diagramas de flujo facilitan la comunicación entre los programadores y la gente del negocio. Estos diagramas de flujo desempeñan un papel vital en la programación de un problema y facilitan la comprensión de problemas complicados y sobre todo muy largos. Una vez que se dibuja el diagrama de flujo, llega a ser fácil escribír el programa en cualquier idióma de alto nivel. Vemos a menudo cómo los diagramas de flujo nos dan ventaja al momento de explicar el programa a otros. Por lo tanto, está correcto decir que un diagrama de flujo es una necesidad para la documentación mejor de un programa complejo.

Reglas para dibujar un diagramas de flujo.

Los Diagramas de flujo se dibujan generalmente usando algunos símbolos estándares; sin embargo, algunos símbolos especiales pueden también ser desarrollados cuando séan requeridos. Algunos símbolos estándares, que se requieren con frecuencia para diagramar programas de computadora se muestran a continuación:



     
  Inicio o fin del programa




Pasos, procesos o líneas de instruccion de programa de computo




Operaciones de entrada y salida




Toma de desiciónes y Ramificación




Conector para unir el flujo a otra parte del diagrama




Cinta magnética




Disco magnético




Conector de pagina




Líneas de flujo




Anotación




Display, para mostrar datos




Envía datos a la impresora


Observación: Para obtener la correcta elaboración de los símbolos, existen plantillas. Las puedes conseguir en Papelerías.

Simbolos gráficos

Dentro de los simbolos fundamentales para la creaación de diagramas de flujo, los símbolos gráficos son utilizádos especificamente para para operaciónes aritméticas y relaciónes condicionales. La siguiente es una lista de los símbolos más comunmente utilizados:

+
Sumar
-
Menos
*
Multiplicación
/
División
±
Mas o menos
=
Equivalente a
> 
Mayor que
< 
Menor que
³
Mayor o igual que
£
Menor o igual que
¹ o <>
Diferente de

Si

No

True

False

Reglas para la creacion de Diagramas

Los Diagramas de flujo deben escribirse de arriba hacia abajo, y/o de izquierda a derecha.
Los símbolos se unen con líneas, las cuales tienen en la punta una flecha que indica la dirección que fluye la información procesos, se deben de utilizar solamente líneas de flujo horizontal o verticales (nunca diagonales).
Se debe evitar el cruce de líneas, para lo cual se quisiera separar el flujo del diagrama a un sitio distinto, se pudiera realizar utilizando los conectores. Se debe tener en cuenta que solo se vana utilizar conectores cuando sea estrictamente necesario.
No deben quedar líneas de flujo sin conectar
Todo texto escrito dentro de un símbolo debe ser legible, preciso, evitando el uso de muchas palabras.
Todos los símbolos pueden tener más de una línea de entrada, a excepción del símbolo final.
Solo los símbolos de decisión pueden y deben tener mas de una línea de flujo de salida.