Algoritmo
-
Upload
clarke-norton -
Category
Documents
-
view
56 -
download
0
description
Transcript of Algoritmo
Algoritmo
Al-Khowarizmi nunca pensó que su nombre, seria el origen de palabras mas importantes que el mismo:
– Álgebra.
– Logaritmo.
– Algoritmo.
Abu Ja’Far Mohammed lbn Musa al-Khowarizmi (780 - 850), astronomo y matemático arabe. Era miembro de la “Casa de la sabiduria”, el cual era una academia de cientificos en Bagdad.
El nombre al-Khowarizmi significa de la ciudad de Khowarizmi, que actualmente es llamada Khiva.
Al-Khowarizmi escribió libros de matemáticas, astronomía y geografía. El álgebra fue introducida en Europa a través de sus trabajos. La palabra álgebra proviene del arabe al-jabr, el cual es parte del título de su libro Kitab al-jabr w’al muquabala. Este libro fue traducido al latin y fue usado por mucho tiempo.
En su libro, sobre el uso de los numerales, Khowarizmi describe procedimiento para realizar las operaciones aritméticas. Los autores europeos usaron una adaptación latina de su nombre, hasta que finalmente llegaron a la palabra algoritmo.
Gracias a ese matemático árabe del siglo IX, hoy tenemos conocimiento de conceptos tan básicos.
Algoritmos y Estructuras de Datos forman el núcleo de la Ciencia de la Computación, siendo los componentes básicos de cualquier software.
Por lo tanto, aprender algoritmos es importante para que quien desee desarrollar software de calidad.
¿ Qué es el diseño de algoritmos – Un algoritmo es una entidad matemática, independiente de un lenguaje de
programación especifico, máquina o compilador.
– Diseñar algoritmos, en algún sentido, es todo acerca de la teoría matemática detrás del diseño de buenos programas.
¿ Porque se estudia diseño de algoritmos
Los algoritmos son parte del día de las personas.– Instrucciones: para el uso de medicamentos medicinales.
– Indicaciones : de cómo montar un equipo de maquinaria.
– Establecer : un recorrido desde la casa a la universidad.
Algoritmo es la sucesión de pasos ejecutables para obtener una solución para un determinado tipo de problema.
Dijkstra: Un algoritmo corresponde a una descripción de un patrón de comportamiento, expresado en términos de un conjunto finito de acciones.
– Ejecutando la operación a + b, notamos un patrón de comportamiento.
Definición: – Algoritmo es un conjunto finito de instrucciones precisas para ejecutar un
proceso computacional.
– Un algoritmo es una herramienta para resolver un problema computacional bien especificado.
Definiciones de algoritmo– El diccionario Houaiss de la lengua portuguesa, 2001:
Conjunto de reglas y procedimientos lógicos bien definidos que llevan a la solución de un problema en etapas.
– Diccionario Webster de la lengua inglesa:
Bibliografía:
Introductions to algorithms. Chapters 1, 2, 3 and 4.Thomas H. Cormen, Charles E. Leiserson and Ronald L. Rivest
Analizando algoritmos
• El análisis de un algoritmo es para predecir los recursos que este requiere.
• Recursos como:– Tiempo (complexity time).
– Memoria (complexity space).
– Comunicación (complexity communication).
• Lo mas frecuente es la complejidad de tiempo (complexity time).
• Generalmente, para un problema se analizan diversos algoritmos candidatos, esto permite identificar al mas eficiente.
• El análisis puede indicar mas de un candidato viable, pero en el proceso diversos algoritmos generalmente son descartados.
• Analizar un algoritmo simple puede ser un descubrimiento. Pues− Como el comportamiento de un algoritmo puede ser diferente para cada
entrada posible, entonces es necesario resumir el comportamiento en fórmulas fácilmente entendibles.
− Aunque, generalmente, se selecciona un solo modelo de máquina (para analizar un algoritmo); es posible enfrentarse a muchas opciones (decidir cómo expresar nuestro análisis).
¿Que modelo debo usar?
Algunos algoritmos presentan:– Complejidad de tiempo:
O(n3C), donde C denota la capacidad máxima de cada arco en la red.
O(n5).
– Complejidad de espacio: O(n2).
• Antes de analizar un algoritmo, primero se debe tener claro:1) Modelo computacional.
2) Dominación asintótica.
3) Análisis de algoritmos.– Costo de un algoritmo.– Función de complejidad de un algoritmo.– Tamaño de la entrada de los datos.– Clases de comportamiento asintótico.– Jerarquía de las funciones.– Casos de complejidad.– Comparación de programas.– Técnicas para el análisis de algoritmos.
Introducción
• Aquel que incluye los recursos que serán usados, además de los costos que implica su uso.• RAM
• PRAM
1) Modelo computacional
¿Que modelo debo usar?
• Modelo RAM:– Las instrucciones son ejecutadas una después de la otra, con operaciones
no concurrentes.
X1 X2 . . . XnCinta de entrada
Programa
.
.
.Memoria
Acumulador
Contador
Cinta de salida y1 y2 . . . yn
• Modelo PRAM:– Investigar modelos para computadores paralelos.
Unidad de Control
Pp
...
Memoria Privada
P2
Memoria Privada
...
P1
Memoria Privada
.... . .
Interconexión en Red
...
Memoria Global
2) Dominación asintótica
El análisis de un algoritmo cuenta con algunas operaciones elementales.
La medida de costo o medida de complejidad indica el crecimiento asintótico de la operación considerada.
Definición: Una función f(n) domina asintóticamente a otra función g(n), si existen las constantes c, m 0 tal que, para n m, se tiene
|g(n)| c.|f(n)|
– Sean g(n) = (n+1)2 y f(n) = n2 . Entonces: g(n) y f(n) se dominan asintoticamente, pues:
– |(n+1)2 | 4|n2|, para n 1.– |n2| |(n+1)2 | , para n 0.
Notación O
f(n) = O(g(n)) expresa: Que g(n) domina asintóticamente a f(n).
La notación O significa que g(n) es el límite superior para el crecimiento de f(n).
O(g(n)) = {f(n) : n constantes positivas c y n0, tal que n n0,
tenemos 0 f(n) cg(n) }
– Cualquier función lineal an + b esta en O(n2). ¿cómo?
– Mostar que 3n3 = O(n4) para un c y un n0 apropiado.
Lo tengo asintoticament
e dominado
Cuando la notación O se usa para expresar el tiempo de ejecución de un algoritmo en el peor caso, entonces estaremos definiendo el limite superior del tiempo de ejecución de tal algoritmo para todas las entradas.
Ejemplo:– Algoritmo de ordenación por inserción es en el peor caso O(n2).
Técnicamente es un abuso decir que el tiempo de ejecución del algoritmo de ordenación por inserción es O(n2), sin especificar de que caso se trata.
a) El tiempo de ejecución de este algoritmo depende de cómo estén dados los datos de entrada.
b) Si los datos de entrada ya estuviesen ordenados, entonces el algoritmo tiene un tiempo de ejecución de O(n) en el mejor caso
Notación
Especifica un límite inferior para el crecimiento de g(n).
(g(n)) = { f(n) : constantes positivas c y n0, tal que n n0,
tenemos 0 cg(n) f(n) }
– Para mostrar que f(n) = 3n3 + 2n2 es (n3), basta hacer c = 1. Entonces n3 3n3 + 2n2 , para n 0.
– f(n) es (n2), haciendo c = 1/10 y n = 0, 2, 4, . . .
Al fin domino la situación
Cuando la notación se usa para expresar el tiempo de ejecución de un algoritmo en el mejor caso, entonces estaremos definiendo el limite inferior del tiempo de ejecución de tal algoritmo para todas las entradas.
Ejemplos:1) El tiempo de ejecución del algoritmo de ordenación por inserción es, en el mejor
caso es (n).
2) Para mostrar que f(n) = 3n3 + 2n2 es (n3), basta hacer c = 1. Entonces n3 3n3 + 2n2 , para n 0.
3) Sea
Entonces f(n) es (n2), haciendo c = 1/10 y n = 0, 2, 4, . . .
0,
1,
102 nparn
nimparnnnf
n
Limites del algoritmo de ordenación por inserción
De acuerdo con las notaciones anteriores, notamos que el tiempo de ejecución del algoritmo esta entre (n) y O(n2).
Notación
(g(n)) = {f(n) :n constantes positivas c1, c2, y n0,
tal que n n0, donde 0 c1g(n) f(n) c2g(n) }
Sea f(n) = n2/3 – 2n. Dq: f(n) = (n2) Debemos obtener c1, c2 y n0 tal que:
c1n2 (1/3)n2 – 2n c2n2, n n0 . Dividiendo tenemos:
c1 1/3 – 2/n c2, n n0 .
• Lado derecho de la desigualdad es válido n 1, cuando se escoge c2 1/3.• Escogiendo c1 1/21, el lado izquierdo de la desigualdad es válido n 7.• Luego, considerando
– c1 = 1/21; c2 = 1/3; m = 7
• Tenemos que: n2/3 – 2n = (n2).
Somos iguales
Ejemplo: Muestre que 22
32
nnn
En efecto
Por definición
22
22
1 32
ncnn
nc 0nn
Dividiendo por : 2n
21
3
2
1c
nc
21
2,1 cn
141
1,7 cn
Por tanto : 22
32
nnn
se verifica para: 141
1 c 21
2 c 70 n
3) Análisis de algoritmos
Determinar las características de la performance del algoritmo.– Tiempo.– Memoria.– Ancho de banda de la comunicación.
¿Porque analizar algoritmos?– De todos los algoritmos que se tenga, elegir aquel que sea el mas eficiente
para el mismo problema.
¿Es posible obtener el mejor tiempo de ejecución para un problema razonablemente finito ?.
Determinar el menor costo para resolver problemas de una clase dada.
Cuando el Costo de un Algoritmo es igual al Menor Costo Posible, entonces el algoritmo es óptimo.
3.1 Costo de un algoritmo
Pueden existir varios algoritmos para resolver el mismo problema.
Si la misma medida de costo se aplica a diferentes algoritmos, entonces se puede compararlos y escoger el mas adecuado.
Ejemplo:– Ordenación selección.
– Ordenación inserción.
– Ordenación Quicksort.
– Ordenación HeapSort.
Para medir el costo de ejecución de un algoritmo:– Se debe definir la función de costo o función de complejidad f.
f(n) denota la medida del tiempo necesario para ejecutar un algoritmo para un problema de tamaño n.
3.2 Función de complejidad de un algoritmo
Función de complejidad de tiempo f(n):– Mide el tiempo que es necesario para ejecutar un algoritmo en un problema
de tamaño n.
– La complejidad de tiempo no representa directamente tiempo. Esta complejidad representa la cantidad de veces que una operación se ejecuta.
Función de Complejidad de Espacio f(n):– Mide la cantidad de memoria necesaria para ejecutar un algoritmo en un
problema de tamaño n.
La medida del costo de ejecución de un algoritmo depende del tamaño de la entrada de los datos.
Es común considerar el tiempo de ejecución de un algoritmo, como una función.
3.3 Tamaño de la entrada de los datos
Para algunos algoritmos, el costo de ejecución es una función de la entrada particular de los datos.
– En la función Max, el costo es uniforme sobre todos los problemas de tamaño n.
– En un algoritmo de ordenación esto no ocurre: Si los datos de entrada ya estuviesen casi ordenados, entonces el algoritmo trabaja menos.
Complejidad constante: f(n) = O(1)– El uso del algoritmo es independiente del tamaño de n.
– Las instrucciones del algoritmo son ejecutadas una cantidad fija de veces.
3.4 Clases de comportamiento asintótico
Complejidad logarítmica: f(n) = O(log n)– Se presenta, comúnmente, en algoritmos que resuelven un problema
transformándolo en problemas menores.
– El tiempo de ejecución puede ser considerado como menor que una constante grande.
Para n = 1000, log2 1000 10.
– Ejemplo: Busca binaria.
Complejidad lineal: f(n) = O(n)– Un pequeño trabajo se realiza sobre cada elemento de entrada.
– Esto es bueno para un algoritmo que tiene que procesar y/o producir n elementos de entrada y/o salida.
– Ejemplo: Busca secuencial, teste de la planaridad de un grafo.
Complejidad lineal logaritmica: f(n) = O(nlog n)– Ocurre en algoritmos que solucionan un problema dividiéndolo en
subproblemas. Luego resuelve cada subproblema y finalmente agrupa las soluciones.
– Es común en algoritmos basados en el paradigma dividir para conquistar.
– Ejemplo: Ordenación MergeSort.
Complejidad cuadrática: f(n) = O(n2)– Ocurre en algoritmos que presentan anillos (loops) uno dentro del otro.
– Es útil en algoritmos que usan datos relativamente pequeño.
– Ejemplo: Ordenación por selección e inserción.
Complejidad exponencial: f(n) = O(2n)– No son útiles del punto de vista practico.
– Se presentan cuando en la solución de los problemas se usa la fuerza bruta.
– Ejemplo: Cartero viajante.
Complejidad factorial: f(n) = O(n!)– Su comportamiento es mucho peor que el caso exponencial.
– Se presentan cuando se usa la fuerza bruta en la solución del problema.
– 20! = 2432902008176640000
220 = 1048576