martes, 5 de marzo de 2013

ALGORITMOS TIPOS Y EJEMPLOS (GRUPO 1)


Algoritmo

Los diagramas de flujo sirven para representar algoritmos de manera gráfica.
En matemáticas, ciencias de la computación y disciplinas relacionadas, un algoritmo (del griego y latín, dixit algorithmus y este a su vez del matemático persa Al-Juarismi ) es un conjunto preescrito de instrucciones o reglas bien definidas, ordenadas y finitas que permite realizar una actividad mediante pasos sucesivos que no generen dudas a quien deba realizar dicha actividad. Dados un estado inicial y una entrada, siguiendo los pasos sucesivos se llega a un estado final y se obtiene una solución. Los algoritmos son el objeto de estudio de la algoritmia.
En la vida cotidiana, se emplean algoritmos frecuentemente para resolver problemas. Algunos ejemplos son los manuales de usuario, que muestran algoritmos para usar un aparato, o las instrucciones que recibe un trabajador por parte de su patrón. Algunos ejemplos en matemática son el algoritmo de la división para calcular el cociente de dos números, el algoritmo de Euclides para obtener el máximo común divisor de dos enteros positivos, o elmétodo de Gauss para resolver un sistema lineal de ecuaciones.

En general, no existe ningún consenso definitivo en cuanto a la definición formal de algoritmo. Muchos autores los señalan como listas de instrucciones para resolver un problema abstracto, es decir, que un número finito de pasos convierten los datos de un problema (entrada) en una solución (salida). Sin embargo cabe notar que algunos algoritmos no necesariamente tienen que terminar o resolver un problema en particular. Por ejemplo, una versión modificada de la criba de Eratóstenes que nunca termine de calcular números primos no deja de ser un algoritmo.
A lo largo de la historia varios autores han tratado de definir formalmente a los algoritmos utilizando modelos matemáticos como máquinas de Turing entre otros.Sin embargo, estos modelos están sujetos a un tipo particular de datos como son números, símbolos o gráficas mientras que, en general, los algoritmos funcionan sobre una vasta cantidad de estructuras de datos. En general, la parte común en todas las definiciones se puede resumir en las siguientes tres propiedades siempre y cuando no consideremos algoritmos paralelos:
Tiempo secuencial. Un algoritmo funciona en tiempo discretizado –paso a paso–, definiendo así una secuencia de estados "computacionales" por cada entrada válida (la entrada son los datos que se le suministran al algoritmo antes de comenzar).
Estado abstracto. Cada estado computacional puede ser descrito formalmente utilizando una estructura de primer orden y cada algoritmo es independiente de su implementación (los algoritmos son objetos abstractos) de manera que en un algoritmo las estructuras de primer orden son invariantes bajo isomorfismo.
Exploración acotada. La transición de un estado al siguiente queda completamente determinada por una descripción fija y finita; es decir, entre cada estado y el siguiente solamente se puede tomar en cuenta una cantidad fija y limitada de términos del estado actual.
En resumen, un algoritmo es cualquier cosa que funcione paso a paso, donde cada paso se pueda describir sin ambigüedad y sin hacer referencia a una computadora en particular, y además tiene un límite fijo en cuanto a la cantidad de datos que se pueden leer/escribir en un solo paso. Esta amplia definición abarca tanto a algoritmos prácticos como aquellos que solo funcionan en teoría, por ejemplo el método de Newton y la eliminación de Gauss-Jordan funcionan, al menos en principio, con números de precisión infinita; sin embargo no es posible programar la precisión infinita en una computadora, y no por ello dejan de ser algoritmos. En particular es posible considerar una cuarta propiedad que puede ser usada para validar la tesis de Church-Turing de que toda función calculable se puede programar en una máquina de Turing (o equivalentemente, en un lenguaje de programación suficientemente general):
Aritmetizabilidad. Solamente operaciones innegablemente calculables están disponibles en el paso inicial.

Los algoritmos pueden ser expresados de muchas maneras, incluyendo al lenguaje natural, pseudocódigo, diagramas de flujo y lenguajes de programación entre otros. Las descripciones en lenguaje natural tienden a ser ambiguas y extensas. El usar pseudocódigo y diagramas de flujo evita muchas ambigüedades del lenguaje natural. Dichas expresiones son formas más estructuradas para representar algoritmos; no obstante, se mantienen independientes de un lenguaje de programación específico.
La descripción de un algoritmo usualmente se hace en tres niveles:
Descripción de alto nivel. Se establece el problema, se selecciona un modelo matemático y se explica el algoritmo de manera verbal, posiblemente con ilustraciones y omitiendo detalles.
Descripción formal. Se usa pseudocódigo para describir la secuencia de pasos que encuentran la solución.
Implementación. Se muestra el algoritmo expresado en un lenguaje de programación específico o algún objeto capaz de llevar a cabo instrucciones.
También es posible incluir un teorema que demuestre que el algoritmo es correcto, un análisis de complejidad o ambos.
Diagrama de flujo





miércoles, 27 de febrero de 2013

ESTRUCTURA DE CONTROL SELECTIVA (GRUPO 5)

Estructuras Básicas de Control.
 

     Nos ayudan a resolver algorítmicamente problemas más complejos. Con ellas es posible tomar decisiones y repetir grupos de acciones.
Para la redacción de un pseudocódigo se pueden utilizar tres tipos de estructuras de control las:
Selectivas, Secuenciales, Repetitivas.

Estructura Selectivas.
     Se utilizan para tomar decisiones lógicas, se evalúa una condición y en función al resultado se realiza una determinada secuencia de instrucciones.
Estas estructuras se clasifican en:
Simple, Dobles, Múltiples.

Estructura Selectiva Simple:
     Se identifican porque están compuestos únicamente de una condición. La estructura si-entonces evalúa la condición y en tal caso:
Si la condición es verdadera, entonces ejecuta la acción Si (o acciones si son varias). Si la condición es falsa no se hace nada.
Su sintaxis es la siguiente en pseudocódigo:
Español

Si<condición> Entonces
<Acción S1>
Fin _ si

Ingles

if <condición>
hen
<Acción S1>
End_if

 





 

Estructura Selectiva Doble:
     Son estructuras lógicas que permiten controlar la ejecución de varias acciones y se utilizan cuando se tienen dos opciones de acción, por la naturaleza de estas se debe ejecutar una o la otra, pero no ambas a la vez, es decir, son mutuamente excluyentes.
Su sintaxis es la siguiente en pseudocódigo:

Español

Si <condición> entonces
<Acción S1>
Sino
<Acción S2>
Fin_Si

Ingles

if <condición> then
<Acción S1 >
else
<Acción S2>
End_if



 
 
 




Estructura Selectiva Múltiple:

     Aplicando la estructura de decisión múltiples se evaluara una expresión que podrá tomar n valores distintos, 1, 2, 3,…., n y según que elija uno de estos valores en la condición, se realizara una de las n acciones o lo que es igual, el flujo del algoritmo seguirá solo un determinado camino ente los n posibles. Esta estructura se representa por un selector el cual si toma el valor 1 ejecutará la acción 1, si toma el valor 2 ejecutara la acción 2, si toma el valor n realizara la acción n.
Su sintaxis es la siguiente:

Español

En caso (variable) hacer

Caso 1: Acción 1
Caso2: Acción 2
Caso N: Acción N
En caso contrario:Acción
Fin_caso

Ingles

switch (selector)
{
case 1: Acción 1
break;
case 2: Acción 2
break;
case n: Acción n
break;
default: Excepción;
break;
}
           
EJERCICIOS

Programa que me exprese el mayor de dos números.

Inicio

Entero a=0; b=0;
Escribir ("Ingrese el primer número“);
Leer a;
Escribir (“Ingrese el segundo número“);
Leer b;
Si a > b entonces
Escribir ("El número mayor es: “a);
Si_no
Escribir "El número mayor es: “b);
Fin_si

Fin

Realizar un algoritmo que lea un número que represente el día de la semana y diga que día es.

Inicio

Entero día=0;
Escribir“Elija un número";
Escribir " 1: Lunes ";
Escribir " 2: Martes”;
Escribir“ 3: Miércoles”;
Escribir“ 4: Jueves”;
Escribir“ 5: Viernes”;

Escribir“Ingrese día”
Leer día;
En caso (día) hacer
Escribir (‘Lunes’);
Escribir (‘Martes’);
Escribir (‘Miércoles’);
Escribir (‘Jueves’);
Escribir (‘Viernes’);
Fin_caso

Fin

TEORIA AUTOMATA DEL ALGORITMO (GRUPO 11)


Teoría de autómatas

Esta teoría provee modelos matemáticos que formalizan el concepto de computadora o algoritmo de manera suficientemente simplificada y general para que se puedan analizar sus capacidades y limitaciones. Algunos de estos modelos juegan un papel central en varias aplicaciones de las ciencias de la computación, incluyendo procesamiento de texto,compiladores, diseño de hardware e inteligencia artificial.
Los tres principales modelos son los autómatas finitos, autómatas con pila y máquinas de Turing, cada uno con sus variantes deterministas y no deterministas. Los autómatas finitos son buenos modelos de computadoras que tienen una cantidad limitada de memoria, los autómatas con pila modelan los que tienen gran cantidad de memoria pero que solo pueden manipularla a manera de pila (el último dato almacenado es el siguiente leído), y las máquinas de Turing modelan las computadoras que tienen una gran cantidad de memoria almacenada en una cinta. Estos autómatas están estrechamente relacionados con la teoría de lenguajes formales; cada autómata es equivalente a unagramática formal, lo que permite reinterpretar la jerarquía de Chomsky en términos de autómatas.
Existen muchos otros tipos de autómatas como las máquinas de acceso aleatorio, autómatas celulares, máquinas ábaco y las máquinas de estado abstracto; sin embargo en todos los casos se ha mostrado que estos modelos no son más generales que la máquina de Turing, pues la máquina de Turing tiene la capacidad de simular cada uno de estos autómatas. Esto da lugar a que se piense en la máquina de Turing como el modelo universal de computadora.
 
Todo algoritmo evalúa una correspondencia f

: D 􀀀! S
donde D son los datos y S las soluciones.
Un problema es una correspondencia f

: D 􀀀! S entre
dos conjuntos. Resolver un problema es evaluar f .
Un problema f

: D 􀀀! S es susceptible de ser resuelto
solamente si D y S son lenguajes expresables sobre un
alfabeto finito. Uniendo alfabetos, uno podría suponer que
son lenguajes sobre un alfabeto común

 
Un problema es, por tanto, evaluar una correspondencia
f

: 􀀀! . Los elementos del dominio (los datos) se
suelen llamar inputs (también son susceptibles de ser
llamados inputs aquellos x

2 tales que no existe f (x)).
Los elementos del rango de f son las soluciones y se
denominan outputs.

ALGORITMO DE EUCLIDE (GRUPO 10)


Ø ,ALGORITMO DE EUCLIDES:
Un algoritmo es una secuencia de pasos para conseguir un resultado.
El algoritmo de Euclides es un método antiguo y eficaz para calcular el máximo común divisor (MCD) entre dos números enteros. Fue originalmente descrito por Euclides en la proposición 2 del libro VII de su libro Elementos. Tiene numerosas aplicaciones en teoría de números y ciencias de la computación.
Ø PASOS DEL ALGORITMO DE EUCLIDES:
El algoritmo de Euclides es un procedimiento para calcular el m.c.d. de dos números. Los pasos son:
1 Se divide el número mayor entre el menor.
2 Si:
a- La división es exacta, el divisor es el m.c.d.
b- La división no es exacta, dividimos el divisor entre el resto obtenido y se continúa de esta forma hasta obtener una división exacta, siendo el último divisor el m.c.d.
Ejemplo: 
m.c.d. (72, 16) = 8

    Al dividir a entre b (números enteros), se obtiene un cociente q y un residuo r. Es posible demostrar que el máximo común divisor de a y b es el mismo que el de b y r. Este es el fundamento principal del algoritmo.

De acuerdo con este fundamento, para calcular el máximo común divisor de a y b tan sólo es necesario calcular el máximo común divisor de b y r. Como b y r son números más pequeños, el número de operaciones se reduce. Además, para calcular el máximo común divisor de b y r se puede aplicar la misma regla recurrentemente.

Ejemplo 1:
Por ejemplo, para calcular el máximo común divisor de 2366 y 273 se podría utilizar la siguiente secuencia de operaciones:
2366 entre 273 es 8 y sobran 182
273 entre 182 es 1 y sobran 91
182 entre 91 es 2 y sobra 0

Esta secuencia de operaciones se puede interpretar con el siguiente significado:
Mcd (2366,273) =  mcd (273,182)
Mcd (273,182) = mcd (182,91)
Mcd (182,91) = mcd (91,0)
De esta manera se concluye que el máximo común divisor de 2366 y 273 es 91 (porque mcd (91,0).


Ejemplo 2:
A = 246                B = 118
a 246   = 2 + 10                   q1 = 2            r1 = 10
b     118            118  


b 118   = 11 + 8                    q2 = 11            r2 = 8
r1     10              10  


r1 10   = 1 + 2                       q3 = 1            r3 = 2
r2       8            8  


r2 8   = 4 + 0                         q4 = 4           r4 = 0
r3     2    


m.c.d (246, 118)           

Ejemplo:

Para hallar el residuo de una división utilizamos mod, así con (A mod2=0) podemos saber si A es un numero par o impar.
Para resolver el problema tengo que dividir un numero por otro más pequeño, si el residuo es 0 es su mcd, si no dividimos el divisor entre el resto. Bien ¿puedo almacenar el resultado en una variable para así poder realizar la siguiente división entre el cociente y el resto? Es decir:
  resultado = a/b
resto = (a mod b)

¿Así con la variable resto puedo realizar el bucle mientras ésta no sea 0?

mientras resto<>0 hacer




ALGORITMO RECURSIVO (GRUPO 9)


 Algoritmo recursivo: es un algoritmo que expresa la solución de un problema en términos de una llamada a sí mismo. La llamada a sí mismo se conoce como llamada recursiva o recurrente.

FUNCIÓN Factorial(n)
    VAR resultado: Entero

    SI (n<2) ENTONCES
        resultado = 1;
    SINO
        resultado = n * Factorial(n-1);
    FSI

    RETORNA resultado;
FFUNCIÓN

En ciencias de la computación, la recursividad es un elemento muy importante en la solución de algunos problemas. Por definición, un algoritmo recursivo es aquel que utiliza una parte de él mismo como solución al problema. La otra parte generalmente es la solución trivial, es decir, aquella cuya solución será siempre conocida, es muy fácil de calcular, o es parte de la definición del problema a resolver. Dicha solución sirve como referencia y además permite que el algoritmo tenga una cantidad finita de pasos.
Ventajas:
-Algunos problemas son esencialmente recursivos, por lo cual su implementación se facilita mediante un algoritmo de naturaleza recursiva, sin tener que cambiarlo a un método iterativo, por ejemplo. -En algunas ocasiones el código de un algoritmo recursivo es muy pequeño.
Desventajas:
-Puede llegar a utilizar grandes cantidades de memoria en un instante, pues implementa una pila cuyo tamaño crece linealmente con el número de recursiones necesarias en el algoritmo. Si los datos en cada paso es muy grande, podemos requerir grandes cantidades de memoria.
Diseño de algoritmos recursivos
Para desarrollar algoritmos recursivos siempre debe tenerse en cuenta que ya existe un algoritmo que permite resolver una versión reducida del problema; con esto en mente se procede como sigue:
1.    Identificar subproblemas atómicos (no descomponibles); estos subproblemas deben resolverse de forma directa, nunca utilizando el algoritmo general puesto que son los ya conocidos casos base.
2.    Descomponer el problema en subproblemas; estos subproblemas se resuelven apoyándose en el algoritmo que sabemos ya existe; la solución de estos subproblemas debe acercarnos de forma progresiva al caso base.
3.     Probar de manera informal que tanto los casos base como los casos generales encuentran solución aplicando el algoritmo diseñado.


ALGORITMO PARA LA RUTA MAS CORTA (GRUPO 8)


Algoritmo de la ruta más corta:

Es un algoritmo de búsqueda grafica que resuelve solo la fuente más corta de un problema del camino para un gráfico con los negativos de bordes costos de ruta, produciendo un camino más corto al árbol. Este algoritmo se utiliza a menudo en la ruta y como una subrutina en otros algoritmos de grafos.
Para una fuente dada de vértice (nodo) en el gráfico, el algoritmo encuentra la ruta con menor coste (es decir, el camino más corto) entre el vértice y cualquier otro vértice.

Por ejemplo, si los vértices de una gráfica representan las ciudades y los costos de borde de ruta representan conducir distancias entre pares de ciudades conectadas por un camino directo, el algoritmo de dijkstra se puede utilizar para encontrar la ruta más corta entre una ciudad y todas las demás ciudades. Como resultado, el camino más corto primera vez ampliamente utilizado en la red los protocolos de enrutamiento, en especial IS-IS y OSPF (Open ShortestPathFirst).

Modelo de la ruta más corta:
El problema de la ruta más corta incluye un juego de nodos conectados donde solo un nodo es considerado como el origen y solo un nodo es considerado como el nodo destino. Su objetivo es determinar un camino de conexiones que minimizan la distancia total del origen al destino. El problema se resuelve por el “algoritmo de etiquetado”. La esencia del procedimiento es que analiza toda la red a partir del origen; identifica de manera sucesiva la ruta más corta a cada uno de los nodos en orden ascendente de sus distancias (más cortas), desde el origen; el problema queda resuelto en el momento de llegar al nodo destino.

Definición del problema:
*- se tiene n nodos, partiendo del nodo inicial1 y terminando en el nodo final n.
*- arcos bi-direccionales conectan los nodos con distancias mayores que cero.
*- se desea encontrar la ruta de mínima distancia que conecta el nodo 1 con el nodo n.
Por medio de la aplicación del algoritmo de este problema podemos conocer la menor distancia entre un nodo origen y un nodo destino.

Pasos a seguir:
1.    Elaborar un cuadro con todos los nodos y los ramales que salen de él.
2.    Partiendo del origen, debemos encontrar el nodo más cercano a él.
3.    Anular todos los ramales que entren al nodo más cercano elegido.
4.    Comenzando en el origen se debe encontrar el nodo más cercano a él, por intermedio del nodo ya elegido y volver al tercer paso hasta llegar al destino.

Ejemplo del árbol de expansión mínima:
Un árbol de expansión mínima es aquel que conecta todos los nodos dentro de una red que está en una distancia mínima y que no contiene un ciclo.

Pasos para elaborar un árbol de expansión mínima:
·         Seleccionar cualquier nodo de la red o indicando según el problema
·         Colocar este nodo al más cercano que minimice la distancia y proseguir considerando todos los nodos que estén conectados, escogiendo de igual manera el que tenga la mínima distancia, hasta incluir todos los nodos. Si los nodos son igual valor se selecciona uno arbitrariamente, y esto quiere decir que puede haber más de una solución óptima.

Características:
*- determina el camino más corto dado un vértice origen.
*- utiliza un tipo de estructura de cola llamado cola de prioridad.

Origen del algoritmo de dijkstra:
Este algoritmo también llamado algoritmo de caminos mínimos, es un algoritmo para la determinar del camino más corto dado un vértice origen al resto de vértices en un grafo con pesos en cada arista. Su nombre se refiere a Edsger Dijkstra, quien lo describió por primera vez en 1959.
La idea subyacente en este algoritmoconsiste en ir explorando todos los caminos más cortos que parten del vértice origen y que llevan a todos los demás vértices ; cuando se obtiene el camino más corto desde el vértice origen, al resto del vértices que componen el grafo, el algoritmo se detiene. El algoritmo es una especialización de la búsqueda de costos uniforme, y como tal, no funciona en grafos con aristas de costo negativo(al elegir siempre el nodo con distancia menor, pueden quedar excluidos de la búsqueda de nodos que en próximas iteraciones bajarían el costo general del camino al pasar por una arista con costo negativo).

Ruta más corta – solución por el algoritmo de Dijkstra:
Para solucionar el problema de la ruta más corta entre dos nodos de un grafo se puede utilizar el algoritmo de Dijkstra, el cual sigue el siguiente procedimiento para calcular la ruta más corta desde el nodo origen hasta cada uno de los nodos del grafo:
·         Crear una lista de nodos para almacenar los nodos con distancia mínima ya calculada
·         Crear una cola de prioridad para los nodos pendientes de evaluar
·         Inserta el nodo de origen a la cola de prioridad
·         Mientras que haya nodos en la cola de prioridad

ºextrae el primer nodo de la cola de prioridad (tmp)
ºagrega el nodo tmp a la lista de nodos ya calculados
ºgenera una lista de los nodos conectados al nodo tmp que no estén en la lista de ya calculados
º   Para cada nodo de la lista (nod)

  ▪ calcula la distancia al origen con la distancia entre tmp y nod mas la distancia calculada entre el origen y tmp.
  ▪ Si el nodo nodestá en la cola de prioridad lo agrega
  ▪   Si el nodo nod ya está en la cola de prioridad y la distancia con la que está guardado en la cola es menor, lo deja como esta y si no, lo actualiza con la distancia calculada.

º  Fin
·         Fin

El algoritmo de Bellman-Ford:

Este algoritmo es una estructura básica muy parecido al algoritmo de Dijkstra, pero en vez de seleccionar vorazmente el nodo de peso mínimo aun sin procesar para relajarlo, simplemente relaja todas las aristas, y lo hace │V│-1 veces, siendo │V│ el número de vértices en el grafo. Las repeticiones permiten a las distancias mínimas recorrer el árbol, ya que en la ausencia de ciclos negativos, el camino más corto solo visita cada vértice una vez. A diferencia de la solución voraz, la cual depende de la suposición de que los pasos sean positivos, esta solución se aproxima más al caso general.

Existen dos versiones:
·         Versión no optimatizada para grafos con ciclos negativos, cuyo coste de tiempo es O(VE)
·         Versión optimatizada para grafos con aristas de peso negativo, pero en el grafo no existen ciclos de coste negativo, cuyo coste de tiempo, es también O (VE).

Aplicaciones de encaminamiento:
Una variante distribuida al algoritmo del Bellman-Ford se usa en protocolos de encaminamiento basados en vector de distancias, por ejemplo el protocolo de encaminamiento de información (RIP). El algoritmo es distribuido porque envuelve unas series de nodos (routers) dentro de un sistema autónomo (AS), un conjunto de redes y dispositivos router IP administrados típicamente por un Proveedor de Servicios de Internet (ISP). Se compone de los siguientes pasos:
1.    Cada nodo calcula la distancia entre el mismo y todos los demás dentro de un AS y almacena esta información en una tabla.
2.    Cada nodo envía su tabla a todos los nodos vecinos.
3.    Cuando un nodo recibe las tablas de distancias de sus vecinos, este calcula la ruta más corta a los demás nodos y actualiza su tabla para reflejar los cambios.

Las desventajas principales del algoritmo de Bellman-Ford en este ajuste son:
·         No es escala bien.
·         los cambios en la topología de red no se reflejan rápidamente ya que las actualizaciones se distribuyen nodo por nodo.
·         Contando hasta el infinito (si un fallo de enlace o nodo hace que un nodo sea inalcanzable desde un conjunto de otros nodos, estos pueden estar siempre aumentando gradualmente sus cálculos de distancia a él, y mientras tanto puede haber bucles de enrutamiento).