7
Complejidad de Algoritmos Autor José Juan Herrera García [email protected]

Complejidad de Algoritmos

Embed Size (px)

DESCRIPTION

La resolución práctica de un problema exige por una parte un algoritmo o método de resolución y por otra un programa o codificación de aquel en un ordenador real. Ambos componentes tienen su importancia; pero la del algoritmo es absolutamente esencial, mientras que la codificación puede muchas veces pasar a nivel de anécdota.A efectos prácticos o ingenieriles, nos deben preocupar los recursos físicos necesarios para que un programa se ejecute. Aunque puede haber muchos parámetros, los más usuales son el tiempo de ejecución y la cantidad de memoria (espacio). Ocurre con frecuencia que ambos parámetros están fijados por otras razones y se plantea la pregunta inversa: ¿cuál es el tamaño del mayor problema que puedo resolver en T segundos y/o con M bytes de memoria? En lo que sigue nos centraremos casi siempre en el parámetro tiempo de ejecución, si bien las ideas desarrolladas son fácilmente aplicables a otro tipo de recursos.Para cada problema determinaremos una medida N de su tamaño (por número de datos) e intentaremos hallar respuestas en función de dicho N. El concepto exacto que mide N depende de la naturaleza del problema. Así, para un vector se suele utilizar como N su longitud; para una matriz, el número de elementos que la componen; para un grafo, puede ser el número de nodos (a veces es mas importante considerar el número de arcos, dependiendo del tipo de problema a resolver); en un fichero se suele usar el número de registros, etc. Es imposible dar una regla general, pues cada problema tiene su propia lógica de coste.

Citation preview

Page 1: Complejidad de Algoritmos

Complejidad de AlgoritmosAutor José Juan Herrera García [email protected]

Page 2: Complejidad de Algoritmos

Matemática Discreta. 1Complejidad de Algoritmos

Introducción.

La resolución práctica de un problema exige por una parte un algoritmo o método de resolución y por

otra un programa o codificación de aquel en un ordenador real. Ambos componentes tienen su

importancia; pero la del algoritmo es absolutamente esencial, mientras que la codificación puede muchas

veces pasar a nivel de anécdota.

A efectos prácticos o ingenieriles, nos deben preocupar los recursos físicos necesarios para que un

programa se ejecute. Aunque puede haber muchos parámetros, los más usuales son el tiempo de

ejecución y la cantidad de memoria (espacio). Ocurre con frecuencia que ambos parámetros están

fijados por otras razones y se plantea la pregunta inversa: ¿cuál es el tamaño del mayor problema que

puedo resolver en T segundos y/o con M bytes de memoria? En lo que sigue nos centraremos casi

siempre en el parámetro tiempo de ejecución, si bien las ideas desarrolladas son fácilmente aplicables a

otro tipo de recursos.

Para cada problema determinaremos una medida N de su tamaño (por número de datos) e intentaremos

hallar respuestas en función de dicho N. El concepto exacto que mide N depende de la naturaleza del

problema. Así, para un vector se suele utilizar como N su longitud; para una matriz, el número de

elementos que la componen; para un grafo, puede ser el número de nodos (a veces es mas importante

considerar el número de arcos, dependiendo del tipo de problema a resolver); en un fichero se suele usar

el número de registros, etc. Es imposible dar una regla general, pues cada problema tiene su propia

lógica de coste.

Órdenes de Complejidad

Se dice que O(f(n)) define un "orden de complejidad". Escogeremos como representante de este orden a

la función f(n) más sencilla del mismo. Así tendremos

O(1)

O(log n)

O(n)

O(n log n)

O(n2)

O(na)

O(an)

O(n!)

orden constante

orden logarítmico

orden lineal

orden cuadrático

orden polinomial (a > 2)

orden exponencial (a > 2)

orden factorial

Es más, se puede identificar una jerarquía de órdenes de complejidad que coincide con el orden de la

tabla anterior; jerarquía en el sentido de que cada orden de complejidad superior tiene a los inferiores

como subconjuntos. Si un algoritmo A se puede demostrar de un cierto orden O1, es cierto que tambiénpertenece a todos los órdenes superiores (la relación de orden cota superior de' es transitiva); pero en la

práctica lo útil es encontrar la "menor cota superior", es decir el menor orden de complejidad que lo

cubra.

Page 3: Complejidad de Algoritmos

Matemática Discreta. 2Complejidad de Algoritmos

Equipo Utilizado:

Interpretación del espacio de archivo de paginación y archivo de paginación en el sistema operativo

Windows®.

Este archivo es muy especial y lo usa Windows para almacenar temporalmente datos los

cuales son intercambiados entre la memoria RAM y éste, con el fin de disponer de un

bloque más grande de memoria, a ésta se le conoce como MEMORIA VIRTUAL.

El nombre del archivo es pagefile.sys se crea en el momento de la instalación de Windows

en la unidad raíz (normalmente C:\) donde se encuentra el boot del sistema y sus atributos

son de oculto.

El archivo pagefile.sys normalmente no se debería poder ver en el explorador de Windows,

a menos que hayas desactivado la opción "Ocultar archivos protegidos del sistema".

El tamaño de archivo pagefile.sys normalmente es 1.5 veces más grande que la memoriaRAM del sistema. (Por ejemplo, si se tiene 1GB de RAM, el archivo debería pesar algocomo 1.5GB, si tienes 256MB, el archivo debería pesar algo como 384B, y así, etc.)

Page 4: Complejidad de Algoritmos

Tiem

po

140

120

100

80

60

40

20

0

0 5000 10000 15000 20000 25000 30000 35000

Datos

MergeSort

Matemática Discreta. 5Complejidad de Algoritmos

Merge Sort

El algoritmo MergeSort (u Ordenamiento por mezcla) es un algoritmo que sirve para ordenar secuencias

de datos.

Este algoritmo consiste en:

- Dividir el grupo de datos en dos y ordenar por separado cada mitad.

- Cuando se tengan las mitades ordenadas, pueden irse mezclando para obtener fácilmente una

secuencia ordenada.El algoritmo MergeSort Utiliza los siguientes tres pasos:

DIVIDIR: divide la secuencia de "n" elementos a ordenar en dos subsecuencias de "n/2" elementos

cada una.

VENCER: ordena las dos subsecuencias de manera recursiva mediante el algoritmo MERGESORT.

COMBINAR: combina las dos subsecuencias ordenadas para generar la solución.

De ahí su comparación con el paradigma algorítmico: "Divide y Vencerás"

En éste método de unen dos estructuras ordenadas para formar una sola ordenada correctamente.

Tiene la ventaja de que utiliza un tiempo proporcional a: n log (n), su desventaja radica en que se

requiere de un espacio extra para el procedimiento. Este tipo de ordenamiento es útil cuando se tiene una

estructura ordenada y los nuevos datos a añadir se almacenan en una estructura temporal para después

agregarlos a la estructura original de manera que vuelva a quedar ordenada.

Grafica Obtenida:

Se inicio el

algoritmo con

1000 datos

aleatorios y se

termino con

30,000;

obteniendo así este

grafico.

Page 5: Complejidad de Algoritmos

Matemática Discreta. 6Complejidad de Algoritmos

Grafica teórica del método:

Observaciones:

La eficiencia de este algoritmo es bastante notable en tiempo de ejecución en comparación con otros, ya

que su manera de trabajo por grupos pequeños agiliza la organización de los datos.

Su utilización se da con mucha frecuencia cuando la cantidad de registros no es muy grande ya que

para hacer las mezclas éste método utiliza el doble del espacio que gasta el arreglo original de valores.

Este es un algoritmo estable (no intercambia los registros con claves iguales) dependiendo de la forma en

que se implemente, recursivo y por tanto de complejidad O(n log2n) tanto en el peor caso como en elmejor o en el caso promedio pues el tiempo que emplea no depende de la disposición inicial de los

datos

Una gran ventaja del MergeSort es que su algoritmo tiene mucha estabilidad (se evitan los

problemas de intercambio de claves en la manipulación de datos). En la gestión de Bases de

Datos se utiliza comúnmente cuando la cantidad de registros en el índice es relativamente baja,

ya que en caso contrario es poco productivo debido a que gasta el doble de espacio del que

ocupan inicialmente los datos.

Su principal desventaja radica en que está definido recursivamente y su implementación no

recursiva emplea una pila, por lo que requiere un espacio adicional de memoria para

almacenarla.

O(n log n)

Page 6: Complejidad de Algoritmos

Tiem

po

-5-2000000 0 2000000 4000000 6000000 8000000

Matemática Discreta. 7Complejidad de Algoritmos

Búsqueda.

La búsqueda es una operación que tiene por objeto la localización de un elemento dentro de la estructura

de datos. A menudo un programador estará trabajando con grandes cantidades de datos almacenados

en arreglos y pudiera resultar necesario determinar si un arreglo contiene un valor que coincide con algún

valor clave o buscado.Búsqueda Binaria.

La búsqueda binaria es el método más eficiente para encontrar elementos en un arreglo ordenado. El

proceso comienza comparando el elemento central del arreglo con el valor buscado. Si ambos coinciden

finaliza la búsqueda. Si no ocurre así, el elemento buscado será mayor o menor en sentido estricto que el

central del arreglo. Si el elemento buscado es mayor se procede a hacer búsqueda binaria en el subarray

superior, si el elemento buscado es menor que el contenido de la casilla central, se debe cambiar el

segmento a considerar al segmento que está a la izquierda de tal sitio central.

Grafica Obtenida:

BusquedaBinaria25

20

15

10

5

0

Datos

Grafica Teórica:

O( log n)

Page 7: Complejidad de Algoritmos

Matemática Discreta. 8Complejidad de Algoritmos

La grafica complejidad del anterior algoritmo, es variable de acuerdo con la elemento a buscar.

Así se obtuvo el anterior grafico, con muy poca tendencia logarítmica; se puede decir que tiempos de

ejecución del programa al variar el numero de iteraciones, además de que los procesos de ejecución de

CPU le limitan tiempo al equipo.

Podemos concluir afirmando que cuando los procesos son de larga duración la CPU los interrumpe para

dar paso a otros procesos y es por esto por lo que el tiempo real difiere del tiempo de CPU de manera

más clara a mayor número de iteraciones.

Conclusión.

El objetivo del análisis de tiempo es predecir cuánto tiempo toma un programa con una entradaespecífica para ser ejecutado sin tener que ejecutarlo. Problemas que se presentan:

el tiempo de ejecución depende del computador,

el tiempo de ejecución depende del sistema operativo y

el tiempo de ejecución depende del compilador.

El tiempo de ejecución depende además de la entrada específica; demora más tiempo el ordenamiento

de 1.000.000 que de 10 elementos. Si la entrada específica tiene la misma cantidad de elementos se

pueden distinguir problemas simples y problemas no tan simples.

La cantidad de elementos de entrada n se denomina el tamaño del problema. Para calcular el tiempo que

se ocupa para ejecutar un programa se asocia con el tamaño a través de la formula t = O(n), donde O

es generalmente denominado la complejidad de tiempo.

Son muchos los elementos que pueden influir en la evaluación y el funcionamiento de un algoritmo, entre

los cuales es importante analizar: tiempo de ejecución, número de líneas de código, estructura del

algoritmo, implementación.