Está en la página 1de 6

ESTRUCTURAS DE DATOS

UNIDAD 1 ANÁLISIS DE ALGORITMOS


COMPLEJIDAD DE ALGORITMOS

La teoría de complejidad de los algoritmos tiene que ver directamente con su


eficiencia. La Eficiencia de un algoritmo está determinada por la cantidad de
recursos que consume un programa durante su ejecución. A menor consumo
de recursos (Tiempo/Espacio) será mayor la eficiencia.

Los recursos son básicamente dos:

1) El tiempo de procesador o Complejidad Temporal: Se denota por


“T” y expresa el tiempo que tarda en ejecutarse un programa. Esto
dependerá del número de instrucciones elementales que ejecuta y la
rapidez de cada una de las instrucciones.

2) Espacio en memoria o Complejidad Espacial: Se denota por la letra “E” y


expresa la cantidad de memoria que requiere un programa. Depende
principalmente del número de variables que utiliza y del espacio que
cada variable ocupa.

Factores de los que depende la eficiencia de un programa.

Los factores que determinan la eficiencia de un programa son:

a) El algoritmo utilizado.
b) El tamaño de la entrada, que es una medida de la cantidad de datos que
se deberán procesar.

El tiempo de ejecución y el espacio en memoria requerida se expresan en


función del tamaño de los datos de entrada, denotado por “n”. De esta manera
quien determina el consumo de los recursos será la cantidad de datos
procesados, de ahí que el tiempo y el espacio dependen de ‘n’, Tiempo en
función de ‘n’ T( n) y Espacio en función de ‘n’ E(n).

La noción del tamaño de los datos de entrada tiene una definición para cada
problema en particular y una regla que suele funcionar es:

1) Si la entrada de datos es un solo entero, el tamaño para ‘n’ es el valor


del entero.
2) Si la entrada es una secuencia de datos , el tamaño para ‘n’ es la
cantidad de elementos de la secuencia.
3) Si la entrada de datos es estructurada, el tamaño para ‘n’ es el número
de elementos del dato.

Formas para medir la complejidad de un programa

Existen dos formas de medición de la complejidad:

1
ESTRUCTURAS DE DATOS

1) Prueba empírica: Consiste en implementar el programa y probarlo por


medio de su ejecución, midiendo el tiempo y el espacio en una máquina
concreta y con datos específicos.

2) Análisis de Complejidad: Consiste en estimar el tiempo y el espacio a


partir del análisis de las instrucciones que componen el algoritmo.

La comparación de ambos métodos nos da el siguiente resultado:

Para la prueba empírica:

a) El resultado es dependiente de la máquina

b) Es poco informativo

c) Requiere implementar el algoritmo y ejecutarlo varias veces

d) Nos da valores exactos, como el tiempo en segundos y el espacio de


memoria en bytes, pero solo para una máquina determinada y datos
concretos.

Para el análisis del algoritmo:

a) Es independiente de la máquina

b) Es más informativo

c) Se aplica sin necesidad de implementar el programa

d) Nos da valores aproximados

Notaciones Asintóticas

Las notaciones asintóticas son aquellas que permiten caracterizar el ritmo de


crecimiento de una función, en este caso las notaciones asintóticas nos
permiten caracterizar el comportamiento de T(n) y E(n). Las notaciones
estudian el comportamiento de los algoritmos para volúmenes de datos de
gran tamaño que es justo cuando la eficiencia del algoritmo es más crítica.

Con la notación asintótica no se pretende establecer el tiempo exacto de


ejecución o el espacio de memoria ocupado sino que simplemente se clasifica
el algoritmo en función del tamaño de los datos de entrada. Las notaciones
Asintóticas más comunes son:

Notación Definición
O(f) Conjunto de funciones cuyo
crecimiento es menor o igual a f
Ω(f) Conjunto de funciones cuyo ritmo de
crecimiento es mayor o igual a f
Ѳ(f) Conjunto de funciones con el mismo
ritmo de crecimiento en E(n) y T(n)

ARITMÉTICA DE LA NOTACIÓN O
2
ESTRUCTURAS DE DATOS

Ocupando el tamaño de la entrada como el tamaño o el parámetro que define


el tiempo de ejecución de un programa es posible describir por ejemplo a la
función T(n)=n2+2n y esta función proporciona la información necesaria para
clasificarla en los diferentes algoritmos.

Reglas para el cálculo de una función de tiempo

1) Sentencias simples: Se refiere a sentencias de asignación, operaciones


aritméticas, entradas y salidas. Esta sentencia requiere un trabajo constante
siendo su orden de complejidad igual a 1.

Ejemplo:

Suma= 0 1

2) Ciclos: Su tiempo de ejecución es al menos el tiempo de ejecución de las


instrucciones dentro de él, multiplicado por el número de la iteraciones,
sumándole los componentes del ciclo.

Ejemplo

Suma= 0 == 1

For(i=0;i<n;i++)

1, n+1,n = 2n+2 T(n) = 4n+3

Suma+=i ; == 2n

*Es dos porque se está realizando una suma y una asignación

3) Ciclos anidados: Se analizan desde el ciclo interno hasta el más externo.


Una vez que se obtiene la complejidad del ciclo interno se multiplica por el
número de iteraciones del ciclo externo obteniendo la complejidad final para el
ciclo externo de la misma forma que un ciclo simple.

Ejemplo:

For(j=1;j<=n;j++) 1, n+1, n = 2n+2 + 4n 2+2n T(n)=


4n2+4n+2

For(i=0;i<n;i++) 1, n+1,n = 2n+2 (4n+2)(n)= 4n2+2n

Suma+=i ; == 2n

4) Condicionales: La comparación es de complejidad constante igual a 1 que


se debe sumar con el peor de los casos entre el verdadero y el falso.

Ejemplo:

If (n>i) 1+3 = 4

3
ESTRUCTURAS DE DATOS

Suma+=i*j; 3

Else

Suma=i; 1

Para simplificar el estudio de la complejidad se han adoptado ciertas


convenciones y una de ellas es la del concepto de ORDEN, que indica el grado
de Complejidad del algoritmo.

A partir de la función de tiempo, para determinar el orden el orden del


algoritmo se eliminan todos los términos excepto el de mayor grado, después
se elimina el coeficiente del término.

El concepto de orden de complejidad indica el grado o clasificación de


complejidad del algoritmo, así para T(n)=7n2+11n+6 tenemos que n2 es el
orden de complejidad del algoritmo, es decir O(n2).

Ordenes de Complejidad

Entre los principales órdenes de complejidad se encuentran los siguientes:

O (1) Orden Constante

O (log n) Orden Logarítmico

O(n) Orden lineal

O(n log n) Orden Cuasi-lineal

O (n2) Orden Cuadrático

O (n3) Orden cúbico

O (n a) Orden Polinomial

O (an) Orden Exponencial

O (n!) Orden Factorial

La complejidad constante: Indica cuando las instrucciones se ejecutan una


sola vez.

Complejidad Logarítmica: Suele aparecer en determinados algoritmos y se


considera un caso especial pues en el doble de tiempo permiten resolver
problemas notablemente mayores y para resolver un problema doblemente
mayor solo hace falta un poco más de tiempo pero nunca el doble.

Complejidad Lineal: Es una complejidad buena y también muy usual su


comportamiento es más natural es decir con el doble de datos a procesar nos
dará el doble de tiempo de ejecución. Aparece en la evaluación de ciclos
simples siempre que la complejidad de las instrucciones anteriores sea
constante.

4
ESTRUCTURAS DE DATOS

Complejidad Cuasi-lineal: Se encuentra en algoritmos de tipo divide y


vencerás como el método de ordenación QuickSort. Se considera una buena
complejidad si n se duplica el tiempo de ejecución es ligeramente mayor de el
doble.

Complejidad Cuadrática: Aparece en ciclos doblemente anidados y si n se


duplica el tiempo de ejecución puede aumentar hasta 4 veces.

Complejidad Cúbica: Se da en ciclos de triple anidación si n se duplica el


tiempo de ejecución se multiplica hasta 8 veces.

Complejidad Polinomial: Estos algoritmos se encuentran con dificultad a


problemas de tamaño creciente y se encuentran en el límite de lo tratado. La
complejidad es bastante mala.

Complejidad Exponencial: Estos algoritmos no suelen ser muy útiles en la


práctica por el elevadísimo tiempo de ejecución. Se dan en programas
recursivos que contienen dos o más llamadas internas.

Ejemplo grafico de la comparación de Complejidad Cuadrática y


Exponencial

1000
800
600
400

200

Dado un algoritmo se debe conocer su complejidad temporal clasificándolo en


uno de los órdenes de complejidad anteriores.

COMPLEJIDAD

Dado un algoritmo de debe conocer su complejidad Temporal por medio de


alguna de las dos formas de medirla, recomendándose siempre el Análisis del
Algoritmo. La Complejidad Espacial del algoritmo dependerá de la memoria que
requiera, y puede ser para diferentes conceptos:

a) Variables estáticas y Locales

b) Variables dinámicas

c) Parámetros de funcione y métodos

d) Indicadores de archivos

5
ESTRUCTURAS DE DATOS

La cantidad de memoria que consume un programa durante su ejecución


depende de las variables que haya creando dinámicamente y además de la
sucesión de llamadas a funciones por lo que se puede complicar
considerablemente el análisis.

El caso más sencillo de analizar será el de los algoritmos no recursivos que no


utiliza memoria dinámica y que siguen tres reglas para el cálculo de su
complejidad espacial

1.- Una variable de tipo elemental ocupa una cantidad de espacio constante
que será de acuerdo a su tipo.

2.- Una variable de tipo tupla ocupa la suma de sus campos.

3.- Una variable de tipo tabla con n elementos ocupara n veces el espacio de
cada elemento

SELECCIÓN DE UN ALGORITMO

El impacto relativo de los factores que determinan el consumo de recursos de


un proceso depende de la cantidad de datos a procesar y almacenar.

1.- Para un tamaño de datos de entrada pequeño el lenguaje, el compilador y


el equipo tienen un impacto considerable en el tiempo de ejecución. Esto se
debe a que si la entrada de datos es pequeña, el número de instrucciones que
se ejecutan también será menor por lo que la velocidad individual de cada
instrucción elemental determinará en mayor medida el tiempo de ejecución
sobre todo al comparar el mismo algoritmo en un equipo diferente.

2:- Para un tamaño de datos de entrada grande, el lenguaje, el compilador y el


equipo pierden importancia y lo más importante pasa a ser el algoritmo, esto
se debe a que un cambio en el equipo afecta el tiempo de ejecución en un
factor constante mientras que el cambio en el algoritmo puede llegar a
incrementar, duplicar, elevar al cuadrado, al cubo etc… el tiempo de ejecución.

3.- La eficiencia es especialmente importante en: Aplicaciones Interactivas,


Sistemas operativos multiproceso, Aplicaciones que se usan reiteradamente.

También podría gustarte