Вы находитесь на странице: 1из 25

ESTRUCTURA DE DATOS Y ANÁLISIS DE ALGORITMOS

Capítulo 2: Análisis de Algoritmos (6h)


Universidad de Cuenca
Facultad de Ingeniería
Ma. Fernanda Granda
fernanda.granda@ucuenca.edu.ec

SEPTIEMBRE 2016
PROGRAMACION II: ESTRUCTURA DE DATOS Y ANÁLISIS DE ALGORITMOS - CAPÍTULO II 1
Contenido
Introducción
Análisis de un Algoritmo
¿Qué es la complejidad de Espacio?
¿Qué es la complejidad de Tiempo
Notación Cota Superior O(f)
Limitaciones de la Notación cota Superior O(f)
Balance Tiempo-Espacio
Ejercicios Prácticos

PROGRAMACION II: ESTRUCTURA DE DATOS Y ANÁLISIS DE ALGORITMOS - CAPÍTULO II 2


Introducción
Cuando solucionamos un problema mediante la construcción de un algoritmo, normalmente
podemos atacar el problema desde distintos puntos de vista, aplicando distintas estrategias, y
por tanto, llegando a soluciones algorítmicas distintas.
Para comparar las diferentes formas (algoritmos) de resolver un problema debe ser posible
medirlos : Tiempo y memoria
La medida de la eficiencia requiere determinar la complejidad de un algoritmo.

PROGRAMACION II: ESTRUCTURA DE DATOS Y ANÁLISIS DE ALGORITMOS - CAPÍTULO II 3


Análisis de un Algoritmo
La complejidad algorítmica es una métrica teórica que se aplica a los algoritmos
en este sentido.
Saber valorar su valor de complejidad puede ayudarnos mucho a conocer cómo
se va a comportar el algoritmo e incluso a escoger uno u otro.
Escoger un algoritmo particular depende de la siguientes mediciones y análisis
de rendimiento
 Complejidad de espacio
 Complejidad de tiempo

PROGRAMACION II: ESTRUCTURA DE DATOS Y ANÁLISIS DE ALGORITMOS - CAPÍTULO II 4


¿Qué es la Complejidad del Espacio?
Analizar la cantidad de memoria que un algoritmo o programa necesita para
ejecutarse completamente.
Por qué estudiar esto:
Si el programa es para ejecutarse en un sistema multi usuario, puede requerir especificar la
cantidad de memoria para ejecutar el programa.
Podemos estar interesados en conocer con anterioridad la cantidad de memoria disponible
que require para ejecutarse.
Pueden haber varias soluciones con diferentes requerimientos de espacio.
Puede ser usado para estimar el tamaño del problema más grande que el programa puede
resolver.

PROGRAMACION II: ESTRUCTURA DE DATOS Y ANÁLISIS DE ALGORITMOS - CAPÍTULO II 5


Complejidad de Espacio
La necesidad de espacio de un programa consiste de los siguientes componentes:
 Espacio de Instrucción: para almacenar la version ejecutable del programa. Es de tamaño fijo.
 Espacio de Datos: necesario para almacenar las constants, valores de variables y además tiene dos
componentes:
 Espacio para constantes, variables simples y estructuradas de tamaño fijo (e.j vectores y estructuras)
 Espacio asignado dinámicamente. Este espacio varía.
 Espacio de Pila: requerido para almacenar información para restaurar funciones suspendidas
(parcialmente completas). Cada vez que una función es invocada los siguientes datos son almacenados
en la pila:
 Dirección de retorno: donde debe continuar desspués de completar la función
 Valores de las variables y parámetros de la función que está siendo invocada.

La cantidad de espacio requerido por una función recursiva es llamado espacio de pila de
recursión y depende del espacio requerido para las variables locales y los parámetros.
Adicionalmente, este espacio depende de la máxima profundidad de la recursion. i.e. máximo
número de llamadas recursivas anidadas.

PROGRAMACION II: ESTRUCTURA DE DATOS Y ANÁLISIS DE ALGORITMOS - CAPÍTULO II 6


¿Qué es Complejidad de Tiempo?
 Es la cantidad de tiempo necesario para ejecutar completamente el programa.
El tiempo exacto dependerá de factores como:
 Datos de entrada: la dimension del vector a ordenarla o el tamaño de las matrices a
multiplicar
 Calidad del código generado por el compilador: las capacidades de optimización del
compilador
 Arquitectura del procesador (cisc, risc): la velocidad del cpu
 Complejidad intrínseca del algoritmo
 Lenguaje de programación, entre otros.
Para medir la complejidad del tiempo con exactitud, hay que contar todo tipo
de operaciones realizadas en un algoritmo y el tiempo requerido por cada
instrucción.

PROGRAMACION II: ESTRUCTURA DE DATOS Y ANÁLISIS DE ALGORITMOS - CAPÍTULO II 7


Cota Superior O(n)
Este tiempo variará de máquina en máquina, y es una tarea dura el de determinar el tiempo exacto.
La unidad de tiempo no puede ser concreta, no existe un ordernador estándar al que puedan hacer
referencia todas las medidas.
 T(n) el tiempo de ejecución para una entrada de tamaño n.
 Donde T(n) es la suma del tiempo de cada una de las líneas multiplicado por su factor de costo de operación
Ck . Se le conoce como Notación de Cota Superior O(n)=T(n)
 La forma general del Teorema es: T(n)= Ck nk + Ck-1 nk-1 + Ck-2 nk-2 + .. +C2 n2 +C1 n1 + C0 n0 , donde la Ck >0
Basado en la representación de la complejidad de tiempo, el algoritmo puede ser categorizado como:
 Tiempo constant O(c)
 Tiempo Logaritmico Olog(n)
 Tiempo Lineal O(n)
 Tiempo Polinomial O(nc)
 Tiempo Exponencial O(cn) donde c>1

PROGRAMACION II: ESTRUCTURA DE DATOS Y ANÁLISIS DE ALGORITMOS - CAPÍTULO II 8


Cota Superior O(n)
Para entender el análisis de la tasa de crecimiento de un algoritmo mire la figura:

La función que tiene ‘n’ como un exponente i.e. 2n, nn, n! son llamadas funciones exponenciales.
Las funciones n3, n2, nlog2n, n, log2 n, son polinomiales.

PROGRAMACION II: ESTRUCTURA DE DATOS Y ANÁLISIS DE ALGORITMOS - CAPÍTULO II 9


Limitaciones de la Cota Superior
La notación de cota superior O(n) tiene dos limitaciones:
 No discute la forma y medios para mejorar la eficiencia del algoritmo, solo
ayuda a analizar y calcular (encontrando la complejidad de tiempo) de el
algoritmo.
 No muestra el potencial de las constantes. Por ejemplo, un algoritmo que
toma 1000 n2 de tiempo para ejecutarse y otro que toma n3 de tiempo. El
primer algoritmo es de orden O(n2) y tomará menos tiempo que el otro
algoritmo O(n3). Sin embargo, el segundo algoritmo será más rápido para
n<1000.

PROGRAMACION II: ESTRUCTURA DE DATOS Y ANÁLISIS DE ALGORITMOS - CAPÍTULO II 10


Balance Tiempo-Espacio
Hay más de un algoritmo para resolver un problema.
El mejor algoritmo es uno que requiere menos espacio en memoria y toma menos tiempo para
completar su ejecución.
En la práctica no siempre es possible lograr los dos objetivos.
Nosotros podemos tener que sacrificar uno por el costo del otro dependiendo de las
restricciones que se tenga (ej. Sistema de tiempo real el tiempo es una restricción).
Medidas:
 A priori (Acotación teórica del algoritmo)
 A posteriori (empírica o práctica) para un conjunto de datos y para un ordenador concreto.

PROGRAMACION II: ESTRUCTURA DE DATOS Y ANÁLISIS DE ALGORITMOS - CAPÍTULO II 11


Operaciones Elementales (OE)
Medida básica de complejidad de algoritmos
◦ las operaciones aritméticas básicas: +,-,/,*, ...
◦ asignaciones a variables
◦ los saltos (llamadas funciones y procedimientos, retorno desde ellos, etc.)
◦ las comparaciones y operaciones lógicas (2 > 5 AND 5 == 3)
◦ El acceso a vectores y matrices

Ejemplos :
◦ a++ 2 OE (=,+)
◦ b = a*5 – Vector[2*2] 5 OE (=,*,- ,[],*)
◦ b += suma(a,b<2) 4OE (=,+,salto, <)
◦ C++==E[1] AND B>3 6 OE (=,+,==,[],AND,>)

PROGRAMACION II: ESTRUCTURA DE DATOS Y ANÁLISIS DE ALGORITMOS - CAPÍTULO II 12


Ejemplo de Cálculo de Tiempo
PROCEDURE Buscar (Var a: vector, c:INTEGER): CARDINAL;
VAR j:CARDINAL;
BEGIN
j:=1; (1) 1 OE (una asignación)
WHILE (a[j]<c) AND (j<n) DO (2) 4 OE (dos comparaciones, un acceso al vector y un AND)
j:=j+1; (3) 2 OE (un increment y una asignacón)
END; (4)
IF a[j]=c THEN (5) 2 OE (una condición y un acceso al vector)
RETURN j (6) 1 OE (contiene un RETURN si la condición se cumple)
ELSE RETURN 0 (7) 1 OE (contiene un RETURN si la condición IF es falsa)
END (8)
END BUSCAR;

PROGRAMACION II: ESTRUCTURA DE DATOS Y ANÁLISIS DE ALGORITMOS - CAPÍTULO II 13


Ejemplo de Cálculo de Tiempo
j:=1; (1) 1 OE
Caso Mejor: WHILE (a[j]<c) AND (j<n) DO (2) 4 OE
j:=j+1; (3) 2 OE
T(n)= líneas (1) + (2) solo la primera parte + (5) + (7)= END; (4)
IF a[j]=c THEN (5) 2 OE
T(n)=1+2+2+1=6. RETURN j (6) 1 OE
ELSE RETURN 0 (7) 1 OE
Caso Peor: END (8)
T(n) = (1) + bucle se repite n–1 veces hasta que se cumple la segunda condición + (5) hasta línea
(7). Cada iteración del bucle compuesta (2) y (3), + ejecución adicional de la línea (2)

PROGRAMACION II: ESTRUCTURA DE DATOS Y ANÁLISIS DE ALGORITMOS - CAPÍTULO II 14


Ejemplo de Cálculo de Tiempo
Caso Medio: el bucle se ejecutará un número de veces entre 0 y n-1, como cada una tiene la
misma probabilidad de suceder y por tanto cada una tendrá una probabilidad asociada de 1/n.

Entonces:

En el caso major, el order de la complejidad es constante. En los casos peor y medio el orden de
la complejidad es lineal O(n).

PROGRAMACION II: ESTRUCTURA DE DATOS Y ANÁLISIS DE ALGORITMOS - CAPÍTULO II 15


Calculo de Operaciones Elementales
CASE C OF v1:S1|v2:S2|...|vn:Sn END
 T = T(C)+max{T(S1),T(S2),...,T(Sn)}.

IF C THEN S1 ELSE S2 END


 T = T(C) + max{T(S1),T(S2)}

WHILE C DO S END
 T = T(C) + (nº iteraciones)*(T(S) + T(C))
 tanto T(C) como T(S) pueden variar en cada iteración

 Para resto de sentencias iterativas (FOR,etc...) basta expresarlas como un bucle WHILE

PROGRAMACION II: ESTRUCTURA DE DATOS Y ANÁLISIS DE ALGORITMOS - CAPÍTULO II 16


Fórmulas
Sumatorias
1) La sumatoria de una suma es igual a la suma de las sumatorias:

2) Cuando el cuerpo de la sumatoria es independiente de los índices, el valor es el número de


valores diferentes que toma el índice multiplicado por el valor del cuerpo:

PROGRAMACION II: ESTRUCTURA DE DATOS Y ANÁLISIS DE ALGORITMOS - CAPÍTULO II 17


Fórmulas
3) Cuando el cuerpo de la sumatoria se puede expresar como una constante independiente de
los índices multiplicada por una expresión, el valor es el valor de la constante multiplicada por la
sumatoria de la expresión:

4) Suma de los valores de una progresión aritmética: Ej:(1+2+3+4+5),(4+6+8+10) ,(2+5+8+11+14)

El primer elemento más el último, multiplicado por el número de elementos y dividido por 2

PROGRAMACION II: ESTRUCTURA DE DATOS Y ANÁLISIS DE ALGORITMOS - CAPÍTULO II 18


Fórmulas
5) Suma de los valores de una progresión geométrica: Ej:(1+2+4+8+16), (2+6+18+54)

El primer elemento multiplicado por la razón elevada al número de elementos menos 1 y todo
dividido por la razón menos 1”

PROGRAMACION II: ESTRUCTURA DE DATOS Y ANÁLISIS DE ALGORITMOS - CAPÍTULO II 19


Ejercicios prácticos
Ordenamiento de la burbuja:
For i:=1 to n-1 do Asignación Suma comparación 3OE {
For j:=n to i+1 by -1 do Asignación Suma comparación 3OE {
if a[j-1]>a[j] then Comparación 4OE
temp:=a[j-1]; 3OE
a[j-1]:=a[j]; 4OE
a[j]:=temp; 2OE
end
end Comp }
End Comp }
Caso Mejor: la condición será falsa,
no se ejecuta de (4) a (6), el bucle interno (n-i) iteraciones

PROGRAMACION II: ESTRUCTURA DE DATOS Y ANÁLISIS DE ALGORITMOS - CAPÍTULO II 20


Ejercicios prácticos
Caso Peor: la condición será verdadera, se ejecuta (4) a (6) el bucle interno (n-i) iteraciones

Caso Medio: la condición será verdadera un 50% de las veces

PROGRAMACION II: ESTRUCTURA DE DATOS Y ANÁLISIS DE ALGORITMOS - CAPÍTULO II 21


Ejercicios prácticos
Cuando se analiza un algoritmo, hay que fijarse en el término que crece más rápido para ver si
es una función lineal, cuadrática, logarítmica, etc.. Por lo que se pueden eliminar las constants.
En nuestro caso el término de mayor crecimiento es la n cuadrada.

Por lo que decimos que la Ordenación por Burbuja tiene una complejidad cuadrática del orden
de O(n2)

PROGRAMACION II: ESTRUCTURA DE DATOS Y ANÁLISIS DE ALGORITMOS - CAPÍTULO II 22


Ejercicios prácticos
Busca el máx en un vector empezando en la posición i hasta la j, por lo que el tamaño de la entrada T(n) = T(j-i)
pmax:=i; 1OE
For k:=i+1 to j do 3OE asignación, suma, comparación {
if a[k]>a[pmax] then 3OE
pmax:=k 1OE
end
End; }
Return pmax; 1OE
Mejor Caso:

Peor caso:

Caso Medio:

PROGRAMACION II: ESTRUCTURA DE DATOS Y ANÁLISIS DE ALGORITMOS - CAPÍTULO II 23


¿Qué hemos aprendido?

PROGRAMACION II: ESTRUCTURA DE DATOS Y ANÁLISIS DE ALGORITMOS - CAPÍTULO II 24


Recursos Adicionales
Leer y comprender el tema sobre el cálculo de la complejidad de Tiempo usando algoritmos de
Ordenación.
Revisar los ejemplos resueltos.
Profundizar el estudio en cada uno de temas del capítulo, investigando en bibliografía
complementaria, internet, etc.

PROGRAMACION II: ESTRUCTURA DE DATOS Y ANÁLISIS DE ALGORITMOS - CAPÍTULO II 25

Вам также может понравиться