análisis de algoritmo

13
ANÁLISIS DE ALGORITMOS Gastón Demundo / Pascual Fernández / Nicolás Radrizzani / Claudio Sebastián Vietri

Upload: ucasalalumno

Post on 21-Jul-2015

746 views

Category:

Sports


0 download

TRANSCRIPT

ANÁLISIS DE ALGORITMOS

Gastón Demundo / Pascual Fernández / Nicolás Radrizzani / Claudio Sebastián Vietri

ALGORITMO0 ó más

entradas

1 ó más

salidas

Algoritmo: Conjunto de reglas para resolver un problema. Su ejecución requiere unos recursos.

Un algoritmo es mejor cuantos menos recursos consuma.

• Eficiencia: Relación entre los recursos consumidos y los productos conseguidos.

• Recursos consumidos:

– Tiempo de ejecución.

– Memoria principal.

– Entradas/salidas a disco.

– Comunicaciones, procesadores,...

• Lo que se consigue:

– Resolver un problema de forma exacta.

– Resolverlo de forma aproximada.

– Resolver algunos casos...

• Factores que influyen en el consumo de recursos:

– Factores externos.

• El ordenador donde se ejecute.

• El lenguaje de programación y el compilador usado.

• La implementación que haga el programador del algoritmo. En particular, de las estructuras de datos utilizadas.

– Tamaño de los datos de entrada.

• Ejemplo. Procesar un fichero de blog: número de mensajes.

– Contenido de los datos de entrada.

• Mejor caso (tm). El contenido favorece una rápida ejecución.

• Peor caso (tM). La ejecución más lenta posible.

• Caso promedio (tp). Media de todos los posibles contenidos.

• Los factores externos no aportan información sobre el algoritmo.

• Conclusión: Estudiar la variación del tiempo y la memoria necesitada por un algoritmo respecto al tamaño de la entrada y a los posibles casos, de forma aproximada (y parametrizada).

• Ejemplo. Algoritmo de búsqueda secuencial.– Mejor caso. Se encuentra x en la 1ª posición:

tm(N) = a– Peor caso. No se encuentra x:

tM(N) = b·N + c

• Ojo: El mejor caso no significa tamaño pequeño

Normalmente usaremos la notación t(N)=..., pero ¿qué significa t(N)?

Tiempo de ejecución en segundos. t(N) = bN + c.Suponiendo que b y c son constantes, con los segundos que tardan las operaciones básicas correspondientes.

Instrucciones ejecutadas por el algoritmo.t(N) = 2N + 4.

¿Tardarán todas lo mismo?Ejecuciones del bucle principal. t(N) = N+1.

¿Cuánto tiempo, cuántas instrucciones,...?Sabemos que cada ejecución lleva un tiempo constante, luego se diferencia en una constante con los anteriores.

• El proceso básico de análisis de la eficiencia algorítmica es el conocido como conteo de instrucciones (o de memoria).

• Conteo de instrucciones: Seguir la ejecución del algoritmo, sumando las instrucciones que se ejecutan.

• Conteo de memoria: Lo mismo. Normalmente interesa el máximo uso de memoria requerido.

• Alternativa: Si no se puede predecir el flujo de ejecución se puede intentar predecir el trabajo total realizado.

– Ejemplo. Recorrido sobre grafos: se recorren todas las adyacencias, aplicando un tiempo cte. en cada una.

0 2 4 6 8 10

0

25

50

75

100

125

150

n

t(n)

t(n)

f(n)

g(n)

Uso de los órdenes de complejidad

• 1) Dado un tiempo t(n), encontrar la función f más simple tal que t O(f), y que más se aproxime asintóticamente.

• Ejemplo. t(n) = 2n2/5 + 6n + 3·log2 n + 2 t(n) O(n2)

• 2) Acotar unafunción difícilde calcularcon precisión.

• Ejemplo.t(n) O(f(n))

Ordenes de Complejidad

0.00

5.00

10.00

15.00

20.00

25.00

30.00

35.00

1.0

0

1.1

01.2

01.3

0

1.4

01.5

0

1.6

01.7

01.8

0

1.9

02.0

03.0

0

5.0

0

O(lo

g n

)

O(n)

O(n log n

)

O(n^

2)

O(a^

n)

O(log n)

O(n)

O(n log n)

O(n^2)

O(a^n)

O(1): Complejidad constante. Cuando las instrucciones se ejecutan una única vez.

O(log n): Complejidad logarítmica, ejemplo la búsqueda binaria.

O(n): Complejidad lineal. Ejenplo ciclo “for”

O(n log n): Complejidad cuasi-lineal. Ejemplo método de ordenación quicksort.

O(n2): Complejidad cuadrática. Aparece en bucles o ciclos doblemente anidados. Si n se duplica, el tiempo de ejecución aumenta cuatro veces.

O(n3): Complejidad cúbica: bucles con triple anidación.

O(na): Complejidad polinómica (a > 3). Si a crece, la complejidad del programa es bastante mala.

O(2n): Complejidad exponencial. No suelen ser muy útiles en la práctica por el elevadísimo tiempo de ejecución.

Métodos de ordenamientoVista de cómo operan estos algoritmos para ordenar una serie de datos en forma aleatoria

Inserción Selección Burbuja Shell Merge Heap Quick

Método ComplejidadInserción n^2Selección n^2Burbuja n^2Shell n log2 nMezcla (merge) n log2 nMontículo (heap) n log2 nQuicksort n log2 n

Complejidad de estos algoritmos

• En lo que ordenación se refiere cada algoritmo se comporta de modo diferente de acuerdo a la cantidad y la forma en que se le presenten los datos, entre otras cosas.

• No existe EL algoritmo de ordenamiento. Sólo existe el mejor para cada caso particular.• Para eso tenemos que preguntarnos estas preguntas: • ¿Qué grado de orden tendrá la información que vamos a manejar?• Si la información va a estar casi ordenada y no quieres complicarte, un algoritmo sencillo como el ordenamiento

burbuja será suficiente. Si por el contrario los datos van a estar muy desordenados, un algoritmo poderoso como Quicksort puede ser el más indicado. Y si no puedes hacer una presunción sobre el grado de orden de la información, lo mejor será elegir un algoritmo que se comporte de manera similar en cualquiera de estos dos casos extremos.

• ¿Qué cantidad de datos vamos a manipular?• Si la cantidad es pequeña, no es necesario utilizar un algoritmo complejo, y es preferible uno de fácil

implementación. Una cantidad muy grande puede hacer prohibitivo utilizar un algoritmo que requiera de mucha memoria adicional.

• ¿Qué tipo de datos queremos ordenar?• Algunos algoritmos sólo funcionan con un tipo específico de datos (enteros, enteros positivos, etc.) y otros son

generales, es decir, aplicables a cualquier tipo de dato.

• ¿Qué tamaño tienen los registros de nuestra lista? • Algunos algoritmos realizan múltiples intercambios (burbuja, inserción). Si los registros son de gran tamaño

estos intercambios son más lentos.

Conclusiones Personales :

Nosotros como ingenieros en informática y en telecomunicaciones llegamos a la conclusión con este trabajo a los siguientes puntos:

• No debemos dejarnos llevar solamente por las nuevas capacidades de los procesadores y Pc’s de hoy en día que cada vez son mas rápidos.

• Debemos analizar previamente el problema a resolver para poder deducir que algoritmo usar para que nuestro programa se comporte lo más eficientemente posible.

¡Muchas gracias!

Gastón Demundo / Pascual Fernández / Nicolás Radrizzani / Claudio Sebastián Vietri