Este documento describe conceptos básicos de complejidad de algoritmos como órdenes de complejidad (O(1), O(log n), etc.), el algoritmo de ordenamiento MergeSort y su complejidad O(n log n), y el algoritmo de búsqueda binaria y su complejidad O(log n). También analiza gráficas del tiempo de ejecución de estos algoritmos y factores que afectan la medición precisa del tiempo.
GUIA DE CIRCUNFERENCIA Y ELIPSE UNDÉCIMO 2024.pdf
Algoritmos-Complejidad-Ordenes
1.
2. Matemática Discreta. 1 Complejidad 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(n 2 ) O(n a ) O(a n ) 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 O 1 , es cierto que también pertenece 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.
3. Matemática Discreta. 2 Complejidad 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 memoria RAM del sistema. (Por ejemplo, si se tiene 1GB de RAM, el archivo debería pesar algo como 1.5GB, si tienes 256MB, el archivo debería pesar algo como 384B, y así, etc.)
4. Tiempo 140 120 100 80 60 40 20 0 0 5000 10000 15000 20000 25000 30000 35000 Datos MergeSort Matemática Discreta. 5 Complejidad 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 .
5. Matemática Discreta. 6 Complejidad 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 log 2 n) tanto en el peor caso como en el mejor 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)
6. Tiempo -5 -2000000 0 2000000 4000000 6000000 8000000 Matemática Discreta. 7 Complejidad 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: BusquedaBinaria 25 20 15 10 5 0 Datos Grafica Teórica: O( log n)
7. Matemática Discreta. 8 Complejidad 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 entrada especí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.