Sei sulla pagina 1di 12

Programacin 3

Apuntes de Terico

Anlisis de Algoritmos

Instituto de Computacin,
Facultad de Ingeniera,
Universidad de la Repblica

28 de agosto de 2015

ndice
1. Introduccin

2. Conceptos bsicos
2.1. Contar las operaciones teniendo en cuenta el costo . . . . . . . . . . . . . . . . .
2.2. Contar las operaciones sin tener en cuenta el costo . . . . . . . . . . . . . . . . .
2.3. Complejidad de un algoritmo . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

1
2
2
3

3. Definiciones

4. Ejemplo: Find

5. Comportamiento asinttico
5.1. Nocin informal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5.2. Notacin asinttica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

6
6
7

iii

1.

Introduccin

En esta seccin se desarrollar el tema de Anlisis de Algoritmos. Un algoritmo es un mtodo


para resolver un problema que en particular puede utilizar una computadora para llegar a la
resolucin del mismo. El punto de partida es en la realidad un problema determinado, el cual se
estudia y eventualmente se desarrollan posibles formas de solucionarlo.
Entonces, dado un problema particular (y una arquitectura subyacente donde resolverlo),
es necesario contar con un mtodo preciso que lo resuelva (algoritmo). Es por tanto de inters
desarrollar formas de anlisis y medidas que nos permitan realizar comparaciones entre distintos
algoritmos que resuelven un mismo problema y/o estimar qu tan bueno es un algoritmo particular. En particular interesa estudiar los aspectos relativos a la eficiencia de un algoritmo, es
decir, aquellos aspectos que determinan un uso eficiente de los recursos.
En general la medida de eficiencia de un algoritmo est basada en el tiempo que demora en
ejecutarse y la memoria ocupada o que utiliza. En este curso se har nfasis en el Tiempo de
Ejecucin de un algoritmo.
El Anlisis de Algoritmos consiste en calcular de antemano cunto tiempo puede llevar la
ejecucin de un algoritmo que resuelva un problema dado y ya que no es prctico buscar
el tiempo exacto, ser necesario definir una medida representativa del mismo pero que se obtenga del propio algoritmo. De esta manera se consigue desacoplar la eficiencia temporal de un
algoritmo de otros aspectos arquitectnicos y de contexto que requieren de un anlisis cuya dependencia en estas caractersticas lo convierten en un enfoque difcilmente generalizable y poco
prctico. El objetivo ser entonces conocer la cantidad de operaciones que un algoritmo realiza
a lo largo de su ejecucin.
Como ejemplo informal ante el problema de la bsqueda de un elemento en un arreglo ordenado, pueden considerarse dos formas diferentes de implementar un algoritmo que resuelva
el problema:
Si se realiza una bsqueda lineal, eventualmente habr que recorrer todo el vector para
encontrar el elemento, con lo cual el tiempo crecer linealmente con el largo n del arreglo
y por lo tanto la cantidad de operaciones ser proporcional a n.
Si se realiza una bsqueda binaria, en cada paso se busca en la mitad del arreglo donde
el elemento puede estar, entonces resulta que la cantidad de operaciones ser proporcional
a log n.
Se puede concluir entonces que la segunda forma de resolver el problema es ms eficiente.

2.

Conceptos bsicos

El anlisis de un algoritmo consiste en determinar la cantidad de operaciones que realiza


el algoritmo. Para ello se tendrn en cuenta slo ciertas operaciones simples de los algoritmos,
p.e.: asignacin, comparacin, suma, resta, etc.
Es importante notar que cada operacin de las mencionadas tiene un costo asociado para el
compilador que se utilice (como se mencion en la introduccin no es prctico tener en cuenta
la mquina particular en que se ejecute).
En general la cantidad de operaciones realizadas por un algoritmo depende de diversos factores, como por ejemplo
Tamao de la entrada (medida de las dimensiones de la entrada, por ejemplo, la dimensin
de un vector a ordenar).
Instancia particular de los datos del problema (por ejemplo, el orden de los datos de un
vector de entrada).
El anlisis en concreto consistir en determinar el resultado de contar el total de operaciones
realizadas. Para esto habr que valerse de herramientas matemticas.
Segn el contexto y la finalidad del anlisis se necesitarn distintos niveles de precisin, por
lo tanto se vern tres posibles puntos de vista para el anlisis:
1

1. Contar las operaciones simples con sus costos.


2. Contar las operaciones simples sin tener en cuenta costos.
3. Contar slo una operacin predefinida y/o bsica.
A continuacin se vern ms en detalle estas alternativas utilizando el siguiente ejemplo:
1
2
3
4
5
6
7
8
9
10
11

int minimo (int* A, int n) {


int min;
min = A[0];
int i;
for (i=1; i<n; i=i+1) {
if (A[i] < min) {
min = A[i];
}
}
return min;
}

Ejemplo 1: Encontrar el mnimo de un arreglo a de tamao n


Se contabilizarn para el clculo del costo las siguientes operaciones: asignacin, comparacin
de elementos, comparacin de variable de control, incremento de la variable de control.

2.1.

Contar las operaciones teniendo en cuenta el costo

Este enfoque consiste en asignar un costo a cada operacin para llegar a una expresin
matemtica que nos permita determinar el costo del algoritmo.
Para una mejor comprensin, se analizar el Ejemplo 1. Sean las siguientes definiciones:
C1 = costo de asignacin
C2 = costo de comparacin
C3 = incremento variable de control
Se tienen 2 asignaciones inicialmente, en las lnea 3 y en la 5 asignando a la variable i el
valor 1. El for hace que en cada operacin haya una comparacin (n veces) y el incremento de
una variable de control (n 1 veces). En cada iteracin se realiza a su vez una comparacin en
la lnea 6 y en caso de que se cumpla la condicin se realiza una asignacin (lnea 7).
T = 2C1 + nC2 + (n 1)C3 + (n 1)C2 + x(n 1)C1
= 2C1 + nC2 + (n 1)(xC1 + C2 + C3 )
Donde x [0, 1] es la cantidad de veces que se ejecuta la asignacin para el mnimo hasta
el momento, divido entre la cantidad de veces que se realiza la comparacin. Se distinguen dos
casos extremos:
Si x = 0, entonces el mnimo est en el primer lugar. Este es el mejor caso ya que se
minimiza el costo del Tiempo de Ejecucin.
Si x = 1, entonces la secuencia est ordenada de forma decreciente. Este es el peor caso.

2.2.

Contar las operaciones sin tener en cuenta el costo

Este enfoque implica despreciar la diferencia en el costo entre las operaciones. Centrndonos
en el Ejemplo 1 se tiene que es un caso es similar anterior respecto a la deteccin de operaciones
a considerar. En cuanto al costo es un caso particular del mismo, tomando C1 = C2 = C3 = 1.
Se llega a la siguiente expresin para T:
T = 2 + n + 2(n 1) + x(n 1)
= (x + 3)n x
2

2.3.

Complejidad de un algoritmo

La decisin de qu contar y considerar durante el anlisis de un algoritmo es muy importante.


En general para decidir cules son las operaciones ms relevantes en un algoritmo dado, primero
se deben identificar aquellas que constituyan una parte fundamental e integral en la forma del
algoritmo y determinar cules no (por ejemplo, comparaciones sobre los ndices de control en un
loop no son relevantes en general). Un caso de inters podra ser la estimacin del costo en etapas
tempranas del estudio del mtodo particular, por ejemplo, un pseudocdigo, donde claramente
no existen operaciones de control como las mencionadas anteriormente, pero s se encuentran
explcitas de alguna manera en las operaciones que caracterizan dicho mtodo.
En particular buscamos entonces contar una operacin bsica, la cual termina determinando la forma del algoritmo. Dos clases de operaciones son consideradas en general como operaciones bsicas: operaciones de comparacin y de aritmtica/asignacin. A modo de ejemplo,
en algoritmos de ordenamiento o bsqueda se considera como operacin bsica a la comparacin
entre los elementos a ordenar o buscar.
Retomando el Ejemplo 1, se podra describir informalmente (pseudocdigo) como:
1. Suponer que el mnimo temporal es el primer elemento.
2. Recorrer el arreglo comparando mnimo temporal con los sucesivos elementos.
2.1. Si el elemento es menor, tomarlo como nuevo mnimo temporal.
Notar que el pseudocdigo expuesto no tiene en forma explcita estructuras o variables de
control algunas, pero si se basa en la comparacin entre el mnimo temporal y los sucesivos
elementos.
Considerando lo anterior y volviendo al cdigo del Ejemplo 1, la operacin bsica es la
siguiente:
A[i] < min
Recordando que no se consideran otro tipo de comparaciones como variables de control, al
contar solamente la operacin bsica la funcin T queda de la siguiente forma:
T (n) = n 1
Notar que se hacen n 1 comparaciones en el peor y mejor caso, es decir, no existe distincin
entre los mismos. Con las otras formas de conteo se consideraban todas las operaciones y la que
marcaba la diferencia entre mejor y peor caso era la asignacin dentro del if, que ahora no es
tenida en cuenta.

3.

Definiciones

Definicin (Algoritmo). Dado un conjunto de operaciones, se tiene un algoritmo si se cumplen


las siguientes propiedades:
Secuencia finita de pasos.
Cada paso correctamente definido.
Cada paso debe ejecutarse en un tiempo finito.
Termina en algn momento.
Devuelve el resultado esperado.
Tiene un dominio de definicin.

Definicin (Dominio de definicin). Un dominio de definicin D, es el conjunto de todas


las entradas posibles.
En el Ejemplo 1 seran todas las secuencias (arreglos) que pueden formarse con los elementos
que segn la declaracin contiene el arreglo. En este caso son todos los nmeros enteros, teniendo
por lo tanto hay infinitas entradas posibles.
Por otro lado el dominio de definicin es el conjunto de entradas para la cual fue diseado
el algoritmo y en ese sentido asegura la correctitud del mismo. El mismo algoritmo con otro
dominio de definicin, puede no ser correcto. Por ejemplo, si est diseado para trabajar sobre
nmeros naturales no tiene por qu funcionar si se pretende usar sobre nmeros reales.
En general el dominio de definicin se expresa en funcin del tamao de la entrada:
Dn = {e D/tama
no(e) = n}
1

Se denotar T (e) al costo (individual) de la entrada e (segn la forma de estudio 1, 2 3).


Definicin (Anlisis). Se busca determinar, analizando un algoritmo dado, el costo del mismo
expresndolo como una funcin T que depende del tamao n de la entrada: T (n)
Definicin (Anlisis en el Peor caso, Mejor caso y Caso promedio). Se observ anteriormente
que en muchos casos el comportamiento de un algoritmo cambia de forma significativa segn
la instancia concreta (datos de entrada) del problema a resolver. No es viable estudiar un caso
genrico. Se tratar de obtener la funcin T (n) en:
Peor caso: se obtendr el mayor costo posible. Se define formalmente como:
TW (n) = m
ax {T (e)/e Dn }
El conjunto de entradas que conforman el peor caso es entonces:
{e Dn /T (e) = TW (n)}
Mejor caso: se tendr el menor costo posible:
TB (n) = mn {T (e)/e Dn }
La entradas que conforman el mejor caso son:
{e Dn /T (e) = TB (n)}
Caso promedio: costo en un caso promedio, basado en ciertas hiptesis y probabilidades. TA (n)
es el promedio de todas las T(e), e Dn .
X

TA (n) =

T (e)P (e)

eDn

Donde P (e) es la probabilidad que se d la entrada e, que depende del contexto del problema
en que se encuentre el algoritmo. El caso medio es:
{e Dn /T (e) = TA (n)}
Observar que W es por worst, B es por best y A es por average.
Como punto importante se debe destacar que el estudio por casos corresponde a un tamao
de entrada n dado (genrico). Un error frecuente es considerar que, por ejemplo, el mejor caso
se da con tamaos de entrada con n = 1.
1 Notar que esto es un abuso de notacin, ya que se vena tratando a T como una funcin que va de los naturales
a los reales no negativos. Es decir, que hace corresponder tamaos de entradas con costos. En este caso se usa de
una forma tal que hace corresponder entradas en s mismas con costos.

4.

Ejemplo: Find

El problema se trata sobre encontrar un elemento x dado, en una secuencia A dada. Si el


elemento est, devuelve la posicin. Sino devuelve el valor -1. Se considera que todos los elementos
de la secuencia son distintos.
1
2
3
4
5
6
7
8
9
10
11

int find (int* A, int n, int x) {


int i = 0;
while ((i < n) && (A[i] != x)) {
i++;
}
if (i < n) {
return i;
} else {
return -1;
}
}

Ejemplo 2: Find
A continuacin se hace el anlisis considerando solamente la operacin bsica.
Mejor caso: secuencia donde x est en el primerer lugar: TB (n) = 1
Peor caso: hay dos configuraciones en las que se da el peor caso:
X no est en A
X es el ltimo elemento de A

TW (n) = n
Caso medio: suponemos que si x A, todas las posiciones son equiprobables.
Partimos de la expresin anteriormente mencionada:
X

TA (n) =

T (e)P (e)

eDn

Debemos simplificarla para poder entenderla y para que resulte prctica. Recordemos que
Dn es el conjunto de todas las secuencias de largo n. En la prctica cabe notar que el
algoritmo dado se comporta (ejecuta) de la misma forma para todas las secuencias que
tengan a x en un lugar especfico i: no interesa el resto de los elementos que compongan la
secuencia, si x est en el lugar i-simo se realizan i comparaciones y el algoritmo termina.
Sucede algo similar si el elemento no est en la secuencia.
Caso 1: x A
Observando lo anterior, podemos subdividir Dn en subconjuntos Dni , donde Dni est
formado por las secuencias que tienen a x en la posicin i-sima, 1 i n. Teniendo
en cuenta esto, se puede simplificar el problema considerando que solamente existen
n entradas, ei con 1 i n, diferenciadas en la posicin en donde se encuentra x.
Entonces se tiene que P (ei ) = n1 , debido a la hiptesis de equiprobabilidad. Tambin
que T (ei ) = i. Por lo tanto:

TA (n) =

n
X
i=1

T (ei )P (ei ) =

n
n
X
1
1X
1 n(n + 1)
n+1
i=
i=
=
n
n
n
2
2
i=1
i=1

Caso 2: x puede estar o no en A. Se le asigna una probabilidad a este suceso: P (x A) = q


Tomamos como entradas vlidas las del caso anterior, pero se agrega en+1 que representa a las instancias que no tienen a x. Se tiene entonces que:
q
,1 i n
n
P (en+1 ) = 1 q
P (ei ) =

TA (ei ) = i, 1 i n

n
n
X
qX
q n(n + 1)
q
i = (1 q)n +
TA (n) =
T (ei )P (ei ) = n(1 q) +
i = (1 q)n +
n
n
n
2
i=1
i=1
i=1
q
q
= (1 )n +
2
2
n+1
X

Notar que con q = 1 estamos en el caso 1. Si q = 0, tenemos que x 6 A y el costo es


n.

5.

Comportamiento asinttico

En muchos casos resultar de inters investigar el costo de un algoritmo para entradas de


tamao n arbitrariamente grande. En otras palabras y de forma ms precisa, interesa conocer
el costo cuando n tiende a infinito. Esto implica que hay trminos del costo que se pueden
despreciar ya que su aporte es nfimo. En definitiva interesa determinar la tasa de crecimiento
de T (n). Por ejemplo podra comportarse como: log n, n3 , 2n o n!
Se plantea un ejemplo en donde se comparan tasas de crecimiento. Sean A1 y A2 dos algoritmos con costos TA1 (n) = 106 2n y TA2 (n) = 106 n3 . Supongamos que los costos estn medidos
en segundos. Se muestra tiempos de ejecucin para algunos valores de n en la Tabla 1.
n
5
10
20
30
40
45
100

TA1 (n)
3,2 105 s
103 s
1s
18 min
13 das
4,1 aos
4 1017 aos

TA2 (n)
1,25 104 s
103 s
8 103 s
27 103 s
64 103 s
0,09 s
1s

Tabla 1: Ejemplos de algunos valores para los tiempos de costos del ejemplo
Qu pasa si contamos con una computadora un milln de veces ms rpida? En la Tabla 2
vemos que la ineficiencia sigue de todas maneras con valores reducidos de n.
n
45
65

TA1 (n)
35 s
1,2 aos

Tabla 2: Valores obtenidos con una computadora mucho ms rpida


La tasa de crecimiento exponencial implica una notable mayor sensibilidad al tamao de la
entrada y menor sensibilidad a la velocidad de procesamiento.

5.1.

Nocin informal

Dado un algoritmo con tiempo de ejecucin T (n) y una funcin f (n), se dice que T (n) es del
orden de f (n) si T (n) es acotada por un mltiplo real positivo de f (n). O sea, T (n) kf (n)
donde k R+ .
6

Por ejemplo, si se tiene un algoritmo con T (n) = 20n2 + 15n + 6, se cumple dicha propiedad
con f (n) = n2 :
T (n) = 20n2 + 15n + 6 20n2 + 15n + 6
T (n) 20n2 + 15n2 + 6, n 1
T (n) 20n2 + 15n2 + 6n2 , n 1
T (n) 41n2 , n 1
Observar que: funciones como n3 , 3n2 , 27n2 y n4 tambin cumplen lo antedicho por lo tanto
se tiene un conjunto de funciones que acotan a T (n).
Funciones g(n) como 3n, 27n, 5n y 4 son todas del orden de f (n) = n porque siempre se
puede encontrar un k R de forma que se cumpla g(n) kf (n). Por lo antedicho las funciones
que cumplan esta desigualdad forman un conjunto de funciones, cada una de las cuales es del
orden de f (n).

5.2.

Notacin asinttica

Recordar primero que N es el conjunto de los nmeros naturales, R el de los reales, R+ el de


los reales positivos y R el de los reales positivos y el cero (reales no negativos).
Definicin (Orden: cota superior). Dada una funcion f : N R , se define O(f (n)) como:
O(f (n)) = {g : N R /c R+ , n0 N, n n0 , g(n) cf (n)}
Se dice que una funcin T : N R es del orden de una funcin f si se cumple que
T (n) O(f (n)) (abreviado frecuentemente como T (n) O(f )). Es decir, si T cumple ser alguna
de las funciones g del conjunto definido.
Definicin (Omega: cota inferior). Dada una funcion f : N R , se define (n) como:
(f (n)) = {g : N R /c R+ , n0 N, n n0 , g(n) cf (n)}
Definicin (Orden exacto). Dada una funcion f : N R , se define (f (n)) como:
(f (n)) = O(f (n)) (f (n))
Hay algunas observaciones importantes:
Dadas dos funciones f y g tal que f O(g), es comn ver el abuso de notacin f = O(g).
Sin embargo, en este curso no usaremos esta forma de escribirlo.
Dada T (n), si TW (n) es el costo en el peor caso y TW (n) O(f (n)) para alguna f (n)
entonces T (n) O(f (n)), ya que T (n) TW (n) por ser el peor caso. No puede afirmarse
algo similar para T (n) si Tw (n) (f (n)).
Similarmente TB (n) (f (n)) T (n) (f (n)).
A continuacin se muestran algunas propiedades.
Propiedad 1. f O(g), g O(h) f O(h)
Demostracin.
f O(g) c1 R+ , n1 N, n n1 , f (n) c1 g(n)
g O(h) c2 R+ , n2 N, n n2 , g(n) c2 h(n)
Se debe demostrar que:
c R+ , n0 N, n0 n, f (n) c h(n)
7

Se puede deducir lo siguiente:


f (n) c1 g(n) c1 c2 h(n)
Por lo tanto se cumple esta propiedad tomando c = c1 c2 y n0 = m
ax (n1 , n2 ).
Propiedad 2. f O(g) g (f )
Propiedad 3. f (g) g (f )
Demostracin. Se demuestra la doble inclusin para un slo lado ya que para el otro es bsicamente lo mismo.
f (g) entonces f O(g) y f (g), por definicin de . A su vez por Propiedad 2:
f O(g) g (f )
f (g) g O(f )
Entonces por definicin de T heta, g (n).
Propiedad 4. define una relacin de equivalencia.
Propiedad 5. f + g O(m
ax (f, g))
Para la Propiedad 5, se define lo siguiente:
Definicin. Se cumple f > g si y slo si n0 N tal que n N que cumple n > n0 entonces
f (n) > g(n).
Algunas observaciones:
Cuando utilizamos la notacin anterior notamos que adems de despreciar los trminos
de menor orden tambin se estn despreciando las constantes multiplicativas, las cuales
pueden determinar cul de dos algoritmos de un mismo orden es mejor que otro.
Es importante recalcar que para algoritmos que se comportan de manera ms eficiente
para entradas arbitrariamente grandes puede ocurrir que no se comporten tan bien para
entradas ms chicas.
Cabe destacar que hay algoritmos para los cuales no tiene sentido hablar una entrada arbitrariamente grande. Por otro lado, hay varias clases de algoritmos para los cuales s tiene
sentido, como pueden ser los algoritmos de ordenacin, de generacin de permutaciones,
etc.

Potrebbero piacerti anche