análisis a priori, a posteriori, costo de algoritmos, análisis iterativo, análisis recursivo, complejidad del algoritmo, orden de complejidad, notación asintótica
Análisis de algoritmos y complejidad computacional
1. ACTIVIDAD 4
ALUMNA:
Vanessa Ramírez Corral 1103150016
PROFESOR:
Iván González Peyro
MATERIA:
Técnicas de Programación
Software 2° A
Aula 12, UD-2
Enero – Abril 2012
2.
3. La eficiencia de un programa tiene dos ingredientes
fundamentales: espacio y tiempo.
La eficiencia en espacio es una medida de la cantidad
de memoria requerida por un programa.
La eficiencia en tiempo se mide en términos de la
cantidad de tiempo de ejecución del programa. Ambas
dependen del tipo de computador y compilador
6. Precisión es la razón del número de documentos relevantes entre el
número total de documentos arrojados por la búsqueda.
Recuperación es la razón de documentos relevantes obtenidos para
una consulta dada entre el total de documentos relevantes en la
base de datos; aquí, con excepción de colecciones de prueba
relativamente pequeñas, el denominador es generalmente
desconocido y debe ser estimado mediante muestreo o algún otro
método.
7.
8. El análisis A Priori (o teórico)
En el análisis A Posteriori
(experimental o empírica)
9.
10. En lugar de medir el tiempo de ejecución en
microsegundos o algo por el estilo, nos
preocuparemos del número de veces que se
ejecuta una operación primitiva.
Para estimar la eficiencia de este algoritmo,
podemos preguntarnos, "si el argumento es una
frase de N números, ¿cuántas multiplicaciones
realizaremos?"
La respuesta es que hacemos una multiplicación
por cada número en el argumento, por lo que
hacemos N multiplicaciones. La cantidad de tiempo
que se necesitaría para el doble de números sería
el doble.
11.
12. En general, el análisis se realizará sobre ejemplos expresados según el
esquema básico de un algoritmo iterativo:
Inicializar;
mientras B hacer
Restablecer;
Avanzar;
Fmientras
Se ha de tener en cuenta que cada uno de los bloques básicos:
(Inicializar, Restablecer, Avanzar, incluso el cálculo de la expresión lógica B)
pueden a su vez estar formados por una combinación de cada una de las
estructuras fundamentales de un lenguaje imperativo:
SECUENCIA: Composición secuencial de instrucciones: S1, S2, ..., Sn
ALTERNATIVA: Instrucciones condicionales del tipo: si B entonces S1 si no
S2 fsi, o del tipo más
general: caso B1 ® S1 ð caso B2® S2....... caso Bn®Sn fcaso
ITERACION: Iteración, en sus varias
formas: mientras B hacer S fmientras,repetir S hasta B, para i desde E1 hasta
E2 hacer S fpara, ...
Cualquiera de estas formas es transformable a una expresión del primer tipo
(bucle "mientras")
13.
14. PROCEDURE Factorial (n : CARDINAL) : CARDINAL
BEGIN
VAR Resultado, i: CARDINAL;
Resultado: =1;
FOR i: =1 TO n DO
Resultado: = Resultado*i;
END ;
RETURN Resultado
END Factorial;
15.
16. Dos implementaciones de un mismo algoritmo
no diferirán más que en una constante
multiplicativa.
Estrategia para la ordenación:
1.- Considerar el vector dividido en dos zonas:
- elementos que ya están ordenados
- elementos por reubicar.
2.- Se utiliza una variable “i” para marcar el
límite
entre ambas zonas.
17.
18.
19. Peor Caso:
Indica el mayor tiempo obtenido, teniendo en consideración todas las entradas posibles.
En el peor escenario posible (nos permite acotar el tiempo de ejecución).
Mejor Caso:
Indica el menor tiempo obtenido, teniendo en consideración todas las entradas posibles.
En condiciones óptimas (no se usa por ser demasiado optimista).
Media:
Indica el tiempo medio obtenido, considerando todas las entradas posibles.
Caso difícil de caracterizar en la práctica.
Asume una distribución de probabilidad sobre las posibles entradas.
Como no se puede analizar el comportamiento sobre todas las entradas posibles, va a
existir para cada problema particular un análisis en él
20.
21.
22. Permite medir la dificultad inherente de un problema y evaluar la eficiencia
de un algoritmo.
El análisis de algoritmos es el proceso que empleamos para determinar la
cantidad de recursos (tiempo, espacio, etc.), necesarios para la ejecución de
un algoritmo en particular. Siendo el tiempo de ejecución una función del
tamaño de entrada, puede ser lineal, cuadrática, cúbica o logarítmica. El
valor exacto de esta función dependerá de más factores, tales como la
velocidad de la máquina, la calidad del compilador, y en alguno casos la
calidad del programa. Lo que nosotros vamos a tratar de medir es el índice
de crecimiento de éstas funciones.
De las funciones que mencionamos, la lineal representa el algoritmo más
eficiente. Por esta razón trataremos que nuestros algoritmos según sea el
caso se comporten como una función lineal. Incluso los trucos de
programación más inteligentes no pueden hacer rápido un algoritmo
ineficiente.
Por tanto, antes de perder el tiempo intentando optimizar un código,
debemos tratar optimizar el algoritmo.
23.
24. Esta función se puede medir físicamente
(ejecutando el programa, reloj en mano) o
calcularse sobre el código contando
instrucciones a ejecutar y multiplicando por
el tiempo requerido por cada instrucción.
25. Para medir el tiempo de ejecución de un algoritmo existen varios métodos.
Benchmarking
La técnica de benchmark considera una colección de entradas típicas representativas de
una carga de trabajo para un programa.
Profiling
Consiste en asociar a cada instrucción de un programa un número que representa la
fracción del tiempo total tomada para ejecutar esa instrucción particular. Una de las
técnicas más conocidas (e informal) es la Regla 90-10, que afirma que el 90% del
tiempo de ejecución se invierte en el 10% del código.
Análisis
Consiste en agrupar las entradas de acuerdo a su tamaño, y estimar el tiempo de
ejecución del programa en entradas de ese tamaño, T(n). Esta es la técnica que se
estudiará en el curso. De este modo, el tiempo de ejecución puede ser definido como
una función de la entrada. Denotaremos T(n) como el tiempo de ejecución de un
algoritmo para una entrada de tamaño n.
26.
27. La complejidad (o costo) de un algoritmo es una
medida de la cantidad de recursos (tiempo,
memoria) que el algoritmo necesita.
La complejidad de un algoritmo se expresa en
función del tamaño (o talla) del problema.
28. TALLA DE UN PROBLEMA:
Es cualquier parámetro en función del cual se
pueda expresar la complejidad del problema:
Nº de datos de entrada
Nº de datos de salida
Valor de las variables numéricas
Una función de los anteriores
Suele guardar relación con el volumen de los datos
a tratar, y por ello se le suele llamar “tamaño” del
problema.
29.
30. Si compramos una computadora diez veces más
rápida, ¿en qué tiempo podremos ahora ejecutar un
algoritmo?
La respuesta depende del tamaño de la entrada de datos,
así como de la razón de crecimiento del algoritmo.
Si la razón de crecimiento es lineal es decir, T(n)=cn)
entonces por ejemplo, 100.000 números serán
procesados en la nueva máquina en el mismo tiempo que
10.000 números en la antigua computadora.
31.
32. Clasifica los algoritmos en buenos o malos.
Clasifica los problemas de acuerdo a la
complejidad inherente de resolverlos.
Complejidad Temporal: tiempo requerido por
un algoritmo para encontrar la solución.
Complejidad Espacial: almacenamiento
requerido por un algoritmo para encontrar la
solución.
33. • O(1) orden constante
• O(log n) orden logarítmico
• O(n) orden lineal
• O(n2) orden cuadrático
• O(na) orden polinomial (a> 2)
• O(an) orden exponencial (a> 2)
• O(n!) orden factorial
34. Si un programa se va a ejecutar muy pocas veces, los costes de codificación y
depuración son los que más importan, relegando la complejidad a un papel
secundario.
Si a un programa se le prevé larga vida, hay que pensar que le tocará mantenerlo
a otra persona y, por tanto, conviene tener en cuenta su legibilidad, incluso a
costa de la complejidad de los algoritmos empleados.
Si podemos garantizar que un programa sólo va a trabajar sobre datos pequeños
(valores bajos de N), el orden de complejidad del algoritmo que usemos suele
ser irrelevante, pudiendo llegar a ser incluso contraproducente.
35.
36.
37. El interés principal del análisis de algoritmos
radica en saber cómo crece el tiempo de
ejecución, cuando el tamaño de la entrada
crece. Esto es la eficiencia asintótica del
algoritmo.
La notación asintótica se describe por medio
de una función cuyo dominio es los números
naturales (Ν) estimado a partir de tiempo de
ejecución o de espacio de memoria de
algoritmos en base a la longitud de la entrada.
38.
39. La notación O se utiliza para comparar funciones.
Resulta particularmente útil cuando se quiere
analizar la complejidad de un algoritmo, en otras
palabras, la cantidad de tiempo que le toma a un
computador ejecutar un programa.
Decimos que una función T(n) es O(f(n))
si existen constantes n0 y c
tales que T(n) ≤ cf(n) para todo n ≥ n0:
T(n) es O(f(n)) ⇔
∃c∈R, ∃n0∈N, tal que ∀n>n0∈N, T(n) ≤ cf(n)
40.
41. Para o la desigualdad se mantiene
para todas las constantes positivas,
mientras que para O la desigualdad
se mantiene sólo para algunas
constantes positivas
42.
43.
44. Ω Es el reverso de O.
f (x) =Ω(g(x)) →←g(x) =O(f (x))
Ω Grande dice que asintóticamente f (x) domina a g(x).
Θ Grande dice que ambas funciones se dominan mutuamente, en
otras palabras, son asintóticamente equivalentes.
f (x) =Θ(g(x))
→←
f (x) =O(g(x))∧f (x) =Ω(g(x))
f =Θ (g): “f es de orden g”
45.
46.
47. Los enteros positivos:
•f ∈ O (g(x)) ↔ f ≤ g (se dice que f es asintóticamente menor o igual
que g)
•f ∈ o (g(x)) ↔ f <g
•f ∈ Θ (g(x)) ↔ f =g
•f ∈ Ω (g(x)) ↔ f ≥g
• f ∈ ω (g(x)) ↔ f >g