Upload
jose-juan-herrera
View
1.204
Download
0
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
Complejidad de AlgoritmosAutor José Juan Herrera García [email protected]
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.
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.)
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.
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)
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)
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.