Está en la página 1de 11

UNIVERSIDAD DE LAS AMERICAS

ESCUELA DE REDES Y TELECOMUNICACIONES

Nombre: Byron Churta

Tema: Veinte Algoritmos Matemáticos

Fecha: 19 de agosto del 2010

A L G O R I T M O S MATEMÁTICOS

1.- Método Simplex

En la teoría de optimización, el algoritmo símplex , descubierto por el


matemático norteamericano George Bernard Dantzig en 1947, es una
técnica popular para dar soluciones numéricas del problema de la
programación lineal. Un método sin relación, pero llamado de manera
similar, es el método Nelder-Mead o método símplex cuesta abajo,
debido a Nelder y Mead (1965), que es un método numérico para
optimización de problemas libres multidimensionales, perteneciente a
la clase más general de algoritmos de búsqueda. El que permite
encontrar una solución óptima en un problema de maximización o
minimización, buscando en los vértices del polígono. En ambos casos,
el método usa el concepto de un símplex, que es un politopo de N + 1
vértices en N dimensiones: un segmento de línea sobre una línea, un
triángulo sobre un plano, un tetraedro en un espacio de tres
dimensiones y así sucesivamente

2.- Compilador Fortran

En 1957 IBM presenta el Compilador Fortran. Un compilador es un


programainformático que traduce un programa escrito en un lenguaje
de programación a otro lenguaje de programación, generando un
programa equivalente que la máquina será capaz de interpretar.
Usualmente el segundo lenguaje es lenguaje de máquina, pero
también puede ser simplemente texto. Este proceso de traducción se
conoce como compilación.

Un compilador es un programa que permite traducir el código fuente


de un programa en lenguaje de alto nivel, a otro lenguaje de nivel
inferior (típicamente lenguaje de máquina). De esta manera un
programador puede diseñar un programa en un lenguaje mucho más
cercano a como piensa un ser humano, para luego compilarlo a un
programa más manejable por una computadora.

El lenguaje fue diseñado teniendo en cuenta que los programas serían


escritos en tarjetas perforadas de 80 columnas. Así por ejemplo, las
líneas debían ser numeradas y la única alteración posible en el orden
de ejecución era producida con la instrucción goto. Estas
características han evolucionado de versión en versión. Las actuales
contienen subprogramas, recursión y una variada gama de
estructuras de control.

3.- El algoritmo QR

EN 1959 El algoritmo QR permite obtener los eigenvalores o valores


propios de una matriz de forma realmente sencilla.
El algoritmo QMR fue creado para resolver el sistema lineal Ax = b
donde A es una matriz cuadrada que no requiere ser simétrica. El
algoritmo QMR Quasi-Minimal Residual se debe a Roland W. Freund y
Noël M. Nachtigal los cuales en 1991 publicaron este algoritmo el cual
se basa en la biortogonalización de Lanczos.

4.- Ordenamiento de Vectores o Listas

En 1962 QuickSort famoso algoritmo de ordenamiento de vectores o


listas, donde se aplica la frase de "divide y vencerás".

El algoritmo fundamental es el siguiente:

• Elegir un elemento de la lista de elementos a ordenar, al que


llamaremos pivote.
• Resituar los demás elementos de la lista a cada lado del pivote,
de manera que a un lado queden todos los menores que él, y al
otro los mayores. Los elementos iguales al pivote pueden ser
colocados tanto a su derecha como a su izquierda, dependiendo
de la implementación deseada. En este momento, el pivote
ocupa exactamente el lugar que le corresponderá en la lista
ordenada.
• La lista queda separada en dos sublistas, una formada por los
elementos a la izquierda del pivote, y otra por los elementos a
su derecha.
• Repetir este proceso de forma recursiva para cada sublista
mientras éstas contengan más de un elemento. Una vez
terminado este proceso todos los elementos estarán ordenados.

Como se puede suponer, la eficiencia del algoritmo depende de la


posición en la que termine el pivote elegido.
• En el mejor caso, el pivote termina en el centro de la lista,
dividiéndola en dos sublistas de igual tamaño. En este caso, el
orden de complejidad del algoritmo es O(n·log n).
• En el peor caso, el pivote termina en un extremo de la lista. El
orden de complejidad del algoritmo es entonces de O(n²). El
peor caso dependerá de la implementación del algoritmo,
aunque habitualmente ocurre en listas que se encuentran
ordenadas, o casi ordenadas. Pero principalmente depende del
pivote, si por ejemplo el algoritmo implementado toma como
pivote siempre el primer elemento del array, y el array que le
pasamos está ordenado, siempre va a generar a su izquierda un
array vacío, lo que es ineficiente.

En conclusión, el número total de comparaciones que hace el


algoritmo es: n + n + n + ..... + n = kn, donde k = log2(n), por tanto
el tiempo de ejecución del algoritmo en el mejor caso es O(n.log2n)

5.- Transformada Rápida de Fourier (FFT)

En 1965 Transformada Rápida de Fourier (FFT) revolucionó el mundo


de las telecomunicaciones.

FFT es la abreviatura usual (del inglés Fast Fourier Transform) de un


eficiente algoritmo que permite calcular la transformada de Fourier
discreta (DFT) y su inversa. La FFT es de gran importancia en una
amplia variedad de aplicaciones, desde el tratamiento digital de
señales y filtrado digital en general a la resolución de ecuaciones
diferenciales parciales o los algoritmos de multiplicación rápida de
grandes enteros. El algoritmo pone algunas limitaciones en la señal y
en el espectro resultante. Por ejemplo: la señal de la que se tomaron
muestras y que se va a transformar debe consistir de un número de
muestras igual a una potencia de dos. La mayoría de los analizadores
TRF permiten la transformación de 512, 1024, 2048 o 4096 muestras.
El rango de frecuencias cubierto por el análisis TRF depende de la
cantidad de muestras recogidas y de la proporción de muestreo.

6.- Algoritmo de diezmado en el tiempo

Es el algoritmo más famoso para el cálculo de una FFT, diseñado por


J.W. Cooley y John Tukey en 1965. Tomando como entrada una señal
discreta x[n] con N muestras, se basa en dividir la señal de entrada
en otras dos señales de N/2 muestras (por un lado los coeficientes
pares y por otro los impares), y se envían cada una de estas
subseñales a una FFT de tamaño N/2 puntos. Cada uno de los
coeficientes de salida de la FFT de las muestras impares se multiplica
por , donde k es la posición del vector salida, y se suma
a las muestras pares. A su vez, las FFT de N/2 puntos se pueden
resolver de esta misma manera, realizando esta operación de manera
recursiva hasta obtener una FFT de una señal de tamaño 2, cuyo
resultado es:

X[0] = x[0] + x[1]

X[1] = x[0] − x[1]

Aplicaciones:

• Tratamiento de imagen (PNG) y audio (MP3)


• Reducción de ruido en señales, como el ruido blanco
• Análisis en frecuencia de cualquier señal discreta
• Análisis de materiales y estadística
• Síntesis, mediante la transformada inversa IFFT

7.- Método MonteCarlo

En 1946 John von Newman entre otros diseñaron este método, para
aproximar funciones. Bajo el nombre de Método Monte Carlo o
Simulación Monte Carlo se agrupan una serie de procedimientos que
analizan distribuciones de variables aleatorias usando simulación de
números aleatorios.

El Método de Monte Carlo da solución a una gran variedad de


problemas matemáticos haciendo experimentos con muestreos
estadísticos en una computadora. El método es aplicable a cualquier
tipo de problema, ya sea estocástico o determinístico.
Generalmente en estadística los modelos aleatorios se usan para
simular fenómenos que poseen algún componente aleatorio.

8.- Algoritmo de ordenamiento

En computación y matemáticas un algoritmo de ordenamiento


recursivo es un algoritmo que pone elementos de una lista o un
vector en una secuencia dada por una relación de orden, es decir, el
resultado de salida ha de ser una permutación o reordenamiento de
la entrada que satisfaga la relación de orden dada. Las relaciones de
orden más usadas son el orden numérico y el orden lexicográfico.
Ordenamientos eficientes son importantes para optimizar el uso de
otros algoritmos (como los de búsqueda y fusión) que requieren listas
ordenadas para una ejecución rápida. También es útil para poner
datos en forma canónica y para generar resultados legibles por
humanos.

Desde los comienzos de la computación, el problema del


ordenamiento ha atraído gran cantidad de investigación, tal vez
debido a la complejidad de resolverlo eficientemente a pesar de su
planteamiento simple y familiar. Por ejemplo, BubbleSort fue
analizado desde 1956.1 Aunque muchos puedan considerarlo un
problema resuelto, nuevos y útiles algoritmos de ordenamiento se
siguen inventado hasta el día de hoy (por ejemplo, el ordenamiento
de biblioteca se publicó por primera vez en el 2004). Los algoritmos
de ordenamiento son comunes en las clases introductorias a la
computación, donde la abundancia de algoritmos para el problema
proporciona una gentil introducción a la variedad de conceptos núcleo
de los algoritmos, como notación de O mayúscula, algoritmos divide y
vencerás, estructuras de datos, análisis de los casos peor, mejor, y
promedio, y límites inferiores.

9.- Búsqueda en anchura

Formalmente, BFS es un algoritmo de búsqueda sin información, que


expande y examina todos los nodos de un árbol sistemáticamente
para buscar una solución. El algoritmo no usa ninguna estrategia
heurística.

Si las aristas tienen pesos negativos aplicaremos el algoritmo de


Bellman-Ford en alguna de sus dos versiones.

Procedimiento

• Dado un vértice fuente s, Breadth-first search sistemáticamente


explora los vértices de G para “descubrir” todos los vértices
alcanzables desde s.

• Calcula la distancia (menor número de vértices) desde s a todos


los vértices alcanzables.

• Después produce un árbol BF con raíz en s y que contiene a


todos los vértices alcanzables.

• El camino desde s a cada vértice en este recorrido contiene el


mínimo número de vértices. Es el camino más corto medido en
número de vértices.

• Su nombre se debe a que expande uniformemente la frontera


entre lo descubierto y lo no descubierto. Llega a los nodos de
distancia k, sólo tras haber llegado a todos los nodos a distancia
k-1.

10.- Búsqueda en profundidad

Una Búsqueda en profundidad (en inglés DFS o Depth First Search) es


un algoritmo que permite recorrer todos los nodos de un grafo o árbol
(teoría de grafos) de manera ordenada, pero no uniforme. Su
funcionamiento consiste en ir expandiendo todos y cada uno de los
nodos que va localizando, de forma recurrente, en un camino
concreto. Cuando ya no quedan más nodos que visitar en dicho
camino, regresa (Backtracking), de modo que repite el mismo proceso
con cada uno de los hermanos del nodo ya procesado.

11.- Algoritmo de búsqueda A*

El algoritmo de búsqueda A* (A Asterisco) se clasifica dentro de los


algoritmos de búsqueda en grafos. Presentado por primera vez en
1968 por Peter E. Hart, Nils J. Nilsson y Bertram Raphael, el algoritmo
encuentra, siempre y cuando se cumplan unas determinadas
condiciones, el camino de menor coste entre un nodo origen y uno
objetivo. Como todo algoritmo de búsqueda en anchura, A* es un
algoritmo completo: en caso de existir una solución, siempre dará con
ella.

12.- Ordenación topológica

Una ordenación topológica de un grafo acíclico G dirigido es una


ordenación lineal de todos los nodos de G que conserva la unión entre
vértices del grafo G original. La condición que el grafo no contenga
ciclos es importante, ya que no se puede obtener ordenación
topológica de grafos que contengan ciclos.

Usualmente, para clarificar el concepto se suelen identificar los nodos


con tareas a realizar en la que hay una precedencia a la hora de
ejecutar dichas tareas. La ordenación topológica por tanto es una lista
en orden lineal en que deben realizarse las tareas.

Para poder encontrar la ordenación topológica del grafo G deberemos


aplicar una modificación del algoritmo de búsqueda en profundidad
(DFS).

Los algoritmos usuales para el ordenamiento topológico tienen un


tiempo de ejecución de la cantidad de nodos más la cantidad de
aristas (O(|V|+|E|)).

Uno de los algoritmos, primero descrito por Kahn (1962), trabaja


eligiendo los vértices del mismo orden como un eventual orden
topológico. Primero, busca la lista de los "nodos iniciales" que no
tienen arcos entrantes y los inserta en un conjunto S; donde al menos
uno de esos nodos existe si el grafo es acíclico.

13.- Componente fuertemente conexo

En la Teoría de los grafos, un grafo dirigido es llamado fuertemente


conexo si para cada par de vértices u y v existe un camino de u hacia
v y un camino de v hacia u. Los componentes fuertemente conexos
(CFC) de un grafo dirigido son sus subgrafos máximos fuertemente
conexos. Estos subgrafos forman una partición del grafo.
Un subgrafo fuertemente conexo es máximo si contiene todos los
vértices del grafo o si al agregarle un vértice cualquiera deja de ser
fuertemente conexo.

El cálculo de los componentes fuertemente conexos de un grafo es


uno de los problemas fundamentales de la Teoría de los grafos. El
primer algoritmo que trabaja en tiempo lineal para resolver este
problema fue propuesto por Robert Tarjan1 en 1970 a base de una
búsqueda en profundidad (depth-first search). Otros algoritmos
aparecen en los principales textos sobre algorítmica.

14.- Algoritmo de Dijkstra

El algoritmo de Dijkstra, también llamado algoritmo de caminos


mínimos, es un algoritmo para la determinación del camino más corto
dado un vértice origen al resto de vértices en un grafo dirigido y 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 algoritmo consiste 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 de vértices que componen el grafo, el
algoritmo se detiene. El algoritmo es una especialización de la
búsqueda de costo 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 nodos que en
próximas iteraciones bajarían el costo general del camino al pasar por
una arista con costo negativo).

15.- Algoritmo de Bellman-Ford

El algoritmo de Bellman-Ford (algoritmo de Bell-End-Ford), genera el


camino más corto en un Grafo dirigido ponderado (en el que el peso
de alguna de las aristas puede ser negativo). El algoritmo de Dijkstra
resuelve este mismo problema en un tiempo menor, pero requiere
que los pesos de las aristas no sean negativos. Por lo que el Algoritmo
Bellman-Ford normalmente se utiliza cuando hay aristas con peso
negativo. Este algoritmo fue desarrollado por Richard Bellman,
Samuel End y Lester Ford.

Según Robert Sedgewick, “Los pesos negativos no son simplemente


una curiosidad matemática; […] surgen de una forma natural en la
reducción a problemas de caminos más cortos”, y son un ejemplo de
una reducción del problema del camino hamiltoniano que es NP-
completo hasta el problema de caminos más cortos con pesos
generales. Si un grafo contiene un ciclo de coste total negativo
entonces este grafo no tiene solución. El algoritmo es capaz de
detectar este caso.

Si el grafo contiene un ciclo de coste negativo, el algoritmo lo


detectará, pero no encontrará el camino más corto que no repite
ningún vértice. La complejidad de este problema es al menos la del
problema del camino más largo de complejidad NP-Completo.

Algoritmo

El Algoritmo de Bellman-Ford es, en su 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 pesos sean positivos, esta solución se aproxima más al caso
general.

16.- Algoritmo de Prim

El algoritmo de Prim es un algoritmo perteneciente a la teoría de los


grafos para encontrar un árbol recubridor mínimo en un grafo conexo,
no dirigido y cuyas aristas están etiquetadas. En otras palabras, el
algoritmo encuentra un subconjunto de aristas que forman un árbol
con todos los vértices, donde el peso total de todas las aristas en el
árbol es el mínimo posible. Si el grafo no es conexo, entonces el
algoritmo encontrará el árbol recubridor mínimo para uno de los
componentes conexos que forman dicho grafo no conexo.

El algoritmo fue diseñado en 1930 por el matemático Vojtech Jarnik y


luego de manera independiente por el científico computacional
Robert C. Prim en 1957 y redescubierto por Dijkstra en 1959. Por esta
razón, el algoritmo es también conocido como algoritmo DJP o
algoritmo de Jarnik.

17.- Algoritmo de Ford-Fulkerson

El algoritmo de Ford-Fulkerson propone buscar caminos en los que se


pueda aumentar el flujo, hasta que se alcance el flujo máximo. Es
aplicable a los Flujos maximales. La idea es encontrar una ruta de
penetración con un flujo positivo neto que una los nodos origen y
destino. Su nombre viene dado por sus creadores, L. R. Ford, Jr. y D.
R. Fulkerson. Ejm:

Sea (V,A,w) con V vértices, A aristas y w peso de las aristas, una red
con una única fuente s y un único sumidero t; w(α) es la capacidad de
α perteneciente a la arista A. Un flujo f es viable si f(α) <= w(α) para
todo α perteneciente a la arista A. Se trata de hallar un flujo viable
con el valor máximo posible.

En un red con fuente s y sumidero t único el valor máximo que puede


tomar un flujo variable es igual a la capacidad mínima que puede
tomar un corte.

18.- Algoritmo de Kruskal

El algoritmo de Kruskal es un algoritmo de la teoría de grafos para


encontrar un árbol recubridor mínimo en un grafo conexo y
ponderado. Es decir, busca un subconjunto de aristas que, formando
un árbol, incluyen todos los vértices y donde el valor total de todas
las aristas del árbol es el mínimo. Si el grafo no es conexo, entonces
busca un bosque expandido mínimo (un árbol expandido mínimo para
cada componente conexa). El algoritmo de Kruskal es un ejemplo de
algoritmo voraz.

Un ejemplo de árbol expandido mínimo. Cada punto representa un


vértice, el cual puede ser un árbol por sí mismo. Se usa el Algoritmo
para buscar las distancias más cortas (árbol expandido) que conectan
todos los puntos o vértices.

Funciona de la siguiente manera:

• se crea un bosque B (un conjunto de árboles), donde cada


vértice del grafo es un árbol separado
• se crea un conjunto C que contenga a todas las aristas del grafo
• mientras C es no vacío
o eliminar una arista de peso mínimo de C
o si esa arista conecta dos árboles diferentes se añade al
bosque, combinando los dos árboles en un solo árbol
o en caso contrario, se desecha la arista

Al acabar el algoritmo, el bosque tiene un solo componente, el cual


forma un árbol de expansión mínimo del grafo.

19.- Algoritmo de Floyd-Warshall

En informática, el algoritmo de Floyd-Warshall, descrito en 1959 por


Bernard Roy, es un algoritmo de análisis sobre grafos para encontrar
el camino mínimo en grafos dirigidos ponderados. El algoritmo
encuentra el camino entre todos los pares de vértices en una única
ejecución. El algoritmo de Floyd-Warshall es un ejemplo de
programación dinámica.

Algoritmo

El algoritmo de Floyd-Warshall compara todos los posibles caminos a


través del grafo entre cada par de vértices. El algoritmo es capaz de
hacer esto con sólo V3 comparaciones (esto es notable considerando
que puede haber hasta V2 aristas en el grafo, y que cada combinación
de aristas se prueba). Lo hace mejorando paulatinamente una
estimación del camino más corto entre dos vértices, hasta que se
sabe que la estimación es óptima.

20.- Algoritmo de Euclides

El algoritmo de Euclides es un método antiguo y eficaz para calcular


el máximo común divisor (MCD). Fue originalmente descrito por
Euclides en su obra Elementos. El algoritmo de Euclides extendido es
una ligera modificación que permite además expresar al máximo
común divisor como una combinación lineal. Este algoritmo tiene
aplicaciones en diversas áreas como álgebra, teoría de números y
ciencias de la computación entre otras. Con unas ligeras
modificaciones suele ser utilizado en computadoras electrónicas
debido a su gran eficiencia.

Definición

El algoritmo de Euclides es un método eficaz para calcular el máximo


común divisor (mcd) de dos números enteros.

El algoritmo consiste en varias divisiones euclídeas sucesivas. En la primera


división, se toma como dividendo el mayor de los números y como divisor el
otro (se ahorra así un paso). Luego, el divisor y el resto sirven
respectivamente de dividendo y divisor de la siguiente división. El proceso
se para cuando se obtiene un resto nulo. El mcd es entonces el penúltimo
resto del algoritmo.

BIBLIOGRAFIA

http://es.wikipedia.org

http://b3co.com/archivo/459

http://www.exa.unicen.edu.ar/catedras/inv_op/apuntes/Apunte_Teorico_MC_
2005.pdf

http://es.wikipedia.org
http://tprc.blogspot.com/2007/05/ela-lgoritmos-mas-importante-de-la.html

http://www.ual.es/~andrei/Practicas/practica14b.pdf

http://enciclopedia.us.es/index.php/Algoritmo_de_Euclides

También podría gustarte