Anda di halaman 1dari 6

ESTRUCTURAS DE DATOS

UNIDAD UNO - SEMANA DOS


ANÁLISIS DE ALGORITMOS *

TABLA DE CONTENIDO

1. MOTIVACIÓN 2
2. COMPLEJIDAD TEMPORAL Y COMPLEJIDAD ESPACIAL 2
3. NOTACIÓN O 3
4. ANÁLISIS DE COMPLEJIDAD DE PROGRAMAS ITERATIVOS 3
5. ANÁLISIS DE COMPLEJIDAD DE PROGRAMAS RECURSIVOS 5
6. TIPOS DE ANÁLISIS DE COMPLEJIDAD 6
EN RESUMEN 6
PARA TENER EN CUENTA 6

*
Resumen del libro Estructuras de Datos en Java de Alejandro Sotelo Arévalo, cuya publicación está pendiente.

ESTRUCTURAS DE DATOS 1
1. MOTIVACIÓN

Muchas veces uno se pregunta lo siguiente:


¿Qué tan demorado será mi programa?
¿Cuál solución será más eficiente, la mía o la de mi amigo?
¿Qué tantos recursos consumirá mi programa?
¿De qué manera depende el consumo de tiempo respecto al tamaño del problema a
resolver?
¿Habrá algoritmos más eficientes que el que acabé de desarrollar?

Sabemos que la ejecución de todo algoritmo demanda recursos computacionales, entre


estos:
Procesador: se refleja en el consumo de tiempo utilizado para ejecutar las instrucciones del
programa.
Memoria RAM: se refleja en el consumo de espacio ocupado por las variables del programa.
Disco duro.
Recursos de red.

Respecto a un recurso computacional, la complejidad de un algoritmo es la cantidad de


recurso que el programa demanda para su ejecución. La demanda de procesador se mide con
la complejidad temporal, mientras que la demanda de memoria RAM se mide con la
complejidad espacial.

2. COMPLEJIDAD TEMPORAL Y COMPLEJIDAD ESPACIAL

Hay dos mecanismos para medir complejidad: el teórico y el práctico. El mecanismo práctico
es completamente inviable, puesto que hay computadores más rápidos que otros y el tiempo
de ejecución depende de factores como el sistema operativo de la máquina, el lenguaje de
programación, el compilador utilizado, los procesos que se estén corriendo en el computador
en el momento de la prueba (como juegos y antivirus), etc.

Para calcular complejidades temporales de forma teórica:


1. Identifique las variables que describen el tamaño del problema a resolver. Por ejemplo, si
se están sumando dos matrices de dimensiones el tamaño del problema estaría
descrito por la variable (el alto de las matrices) y por la variable (el ancho de las
matrices).
2. Defina las operaciones básicas que desea contabilizar. En el ejemplo anterior de suma de
matrices importaría contar cuántas sumas de celdas se realizan, razón por la que la suma de
números reales podría ser una operación básica interesante.

ESTRUCTURAS DE DATOS 2
3. Encuentre una función que relacione el tamaño del problema con el número de
operaciones básicas ejecutadas, analizando el peor escenario posible. Esta función refleja la
complejidad temporal, porque entre más operaciones se ejecuten, más tiempo se demoraría
el algoritmo en ejecutar.

Para calcular complejidades espaciales de forma teórica:


1. Identifique las variables que describen el tamaño del problema a resolver. Por ejemplo, si
se están sumando dos matrices de dimensiones el tamaño del problema estaría
descrito por la variable (el alto de las matrices) y por la variable (el ancho de las
matrices).
2. Encuentre una función que relacione el tamaño del problema con el número de variables
declaradas en el programa. Esta función refleja la complejidad espacial porque entre más
variables se declaren, más espacio en memoria RAM requeriría el algoritmo para ejecutarse.

En pocas palabras, la complejidad temporal mide el tiempo gastado y la complejidad espacial


mide el espacio requerido.

3. NOTACIÓN O

Para medir complejidades se utiliza la notación (¡ojo!: es la letra O del alfabeto, no es un


cero), conocida en inglés como Big-Oh notation. La notación se centra en un análisis en el
peor caso, es decir, en el escenario más adverso imaginable que haga que la función ejecute
el máximo número de operaciones posible.

Dada una función se dice que un algoritmo tiene complejidad temporal si la


cantidad de operaciones que ejecuta siempre está por debajo de un múltiplo constante de
, para grande. Similarmente se define para la complejidad espacial, pero sobre la
cantidad de variables declaradas.

4. ANÁLISIS DE COMPLEJIDAD DE PROGRAMAS ITERATIVOS

Normalmente, la complejidad temporal de los algoritmos iterativos se analiza mediante un


proceso de inspección, estudiando la forma de las instrucciones del programa. Como la
complejidad espacial generalmente es más fácil de calcular porque involucra un conteo de
variables, haremos énfasis sobre el cálculo de la complejidad temporal.

Para calcular la complejidad temporal de una secuencia de instrucciones en Java


instrucción 1;
instrucción 2;
instrucción 3;
...

ESTRUCTURAS DE DATOS 3
instrucción m;
halle la complejidad de cada instrucción por separado y quédese con la más grande de éstas.

Para calcular la complejidad temporal de una asignación en Java


variable=expresión;
halle la complejidad del cálculo de la expresión que está siendo asignada.

Para calcular la complejidad temporal de un condicional en Java halle la complejidad de cada


guarda y de cada comando por separado y quédese con la más grande de éstas.

Para calcular la complejidad temporal de un ciclo while o for en Java multiplique el número
de iteraciones que hace el ciclo por la complejidad del cuerpo del ciclo.

Tabla 1: Ejemplos que buscan enseñar a calcular complejidades temporales de forma intuitiva.
Programa Complejidad temporal
double x=7,y=x+3,z=0;
if (x>=6) {
z=x+y;
} porque hace un número constante de operaciones.
else {
z=x-y;
}
int f01(int n) {
int r=0,i=0; porque el ciclo realiza iteraciones y la complejidad
while (i<n) {
r+=i; del cuerpo
i++; r+=i;
} i++;
return r; es .
}

int f02(int n) {
porque el ciclo realiza iteraciones y la complejidad
int r=0; del cuerpo
for (int i=0; i<n; i++) { r+=i;
r+=i; i++;
} es .
return r;
Nótese que este for es traducción del while del ejemplo
}
anterior.
int f03(int n, int m) {
int r=0;
for (int i=0; i<n; i++) {
for (int j=0; j<m; j++) {
porque los dos ciclos están anidados, el primer
r+=i*j;
} ciclo hace iteraciones, y el segundo hace iteraciones.
}
return r;
}

ESTRUCTURAS DE DATOS 4
int f04(int n) { porque los dos ciclos están anidados, el primer ciclo
int r=0;
for (int i=0; i<n; i++) {
hace iteraciones, y el segundo nunca hace más de
for (int j=i; j<n; j++) { iteraciones. Observe que el número de iteraciones del
r+=i*j; segundo ciclo depende del valor de i porque j varía desde
} i hasta n-1. ¡No se complique!: como estamos analizando
}
return r; el peor caso, nos contentamos con decir que el segundo
} ciclo nunca hace más de iteraciones, lo que es cierto.
int f05(int n) {
int r=0;
for (int i=0; i<n; i++) {
r+=i; porque un ciclo está después del otro, el primer ciclo
} hace iteraciones, y el segundo hace también
for (int j=0; j<n; j++) { iteraciones. Además sabemos que la función es
r+=j;
} porque es un múltiplo constante de .
return r;
}
int f06(int n, int m) {
int r=0;
for (int i=0; i<n; i++) {
r+=i*i+3;
} porque un ciclo está después del otro, el primer
for (int j=0; j<m; j++) { ciclo hace iteraciones, y el segundo hace iteraciones.
r+=j*5-2;
}
return r;
}
int f07(int n) {
int r=0;
if (n>=15) {
for (int i=1; i<n; i++) {
for (int j=i; j<n; j++) {
r+=i-j;
}
}
} . ¿Por qué? Piense en el peor caso.
else {
for (int i=1; i<n; i++) {
r+=i;
}
}
return r;
}

5. ANÁLISIS DE COMPLEJIDAD DE PROGRAMAS RECURSIVOS

Para calcular la complejidad temporal de un algoritmo recursivo se debe formular una


ecuación de recurrencia que describa el consumo de tiempo y después se debe encontrar la
versión cerrada de esta ecuación. En la lectura anterior, donde se trató el tema de recursión,
se practicó con varios ejemplos el cálculo de complejidad de programas recursivos.

ESTRUCTURAS DE DATOS 5
6. TIPOS DE ANÁLISIS DE COMPLEJIDAD

En muchas situaciones, el peor caso de un algoritmo ocurre sólo en situaciones


extraordinarias. Por ejemplo, imagine un algoritmo con complejidad temporal que el
99.999% de las veces se comporta como si tuviera complejidad temporal , pero que en
el 0.001% restante alcanza su peor caso, adquiriendo la complejidad temporal de . Es
muy injusto, ¿cierto? Por esta razón hay tres tipos de análisis que se pueden hacer sobre los
algoritmos:

Análisis en el peor caso: se calcula la complejidad temporal pensando en el peor escenario


para el algoritmo, donde se ejecuta el máximo número de operaciones posible.
Análisis en el mejor caso: se calcula la complejidad temporal pensando en el mejor
escenario para el algoritmo, donde se ejecuta el mínimo número de operaciones posible.
Análisis en el caso promedio: se calcula la complejidad temporal pensando en un escenario
típico que no sea ni el mejor ni el peor.

EN RESUMEN
Dado cierto recurso, la complejidad de un algoritmo es la cantidad de recurso que el programa
demanda para su ejecución. La demanda de procesador se mide con la complejidad temporal,
mientras que la demanda de memoria RAM se mide con la complejidad espacial.
Calcular la complejidad de nuestros programas nos sirve para:
 Medir los recursos que gasta un algoritmo.
 Estimar la demanda de recursos que necesita un programa.
 Comparar programas para saber cuál es más eficiente en tiempo o en espacio utilizado.
La complejidad temporal mide el tiempo gastado y la complejidad espacial mide el espacio requerido.
Para medir complejidades se utiliza la notación , que se centra en un análisis en el peor caso.
Todo programa que ejecute un número de operaciones que siempre esté por debajo de una
constante multiplicada por (para valores grandes de ), tiene complejidad temporal .

PARA TENER EN CUENTA


 Uno de los trucos para calcular complejidades temporales es identificar las porciones de código más
lentas y concentrarse solamente en estas porciones.
 En todo el módulo estaremos calculando complejidades temporales. El estudio de las Estructuras de
Datos se basa fuertemente en la teoría de la complejidad computacional, así que ¡póngale cuidado!.
 Habiendo estudiado esta lectura sobre análisis de algoritmos, es aconsejable que realice una ojeada
sobre la lectura anterior (recursión) deteniéndose sobre los párrafos que tratan sobre complejidad
temporal. De esta manera puede fortalecer los conceptos adquiridos.

ESTRUCTURAS DE DATOS 6

Anda mungkin juga menyukai