Descarga la aplicación para disfrutar aún más
Vista previa del material en texto
REPÚBLICA BOLIVARIANA DE VENEZUELA UNIVERSIDAD JOSÉ ANTONIO PAEZ ESCUELA DE INGENIERÍA EN COMPUTACIÓN Sección: 305C1 Romina Betancourt CI: 16052570 Catedra: Algoritmo y Estructuras II Prof. Ing. Adolfo Simeone San Diego, Diciembre, 2014 Informe: Orden de Complejidad 2 Informe de Algoritmo y Estructuras II: Orden de Complejidad INDICE Pág. 1) Definición de orden de complejidad…………………………………………03 2) La Eficiencia de los Algoritmos……………………………………………..03 3) Tipos de órdenes de complejidad que existen a. Polinómicos (P)………………………………………………………05 b. No polinómicos (NP)………………………………………………...05 4) Cuadro comparativo entre al menos 03 algoritmos de ordenamientos, con lo siguiente: Orden de complejidad, Cantidad de comparaciones, Cantidad de intercambios………………………………………………………………….07 5) Lista de algoritmos de ordenamiento………………………………………..11 3 Informe de Algoritmo y Estructuras II: Orden de Complejidad ORDEN DE COMPLEJIDAD Se dice que una función es de orden , , si existe una constante positiva tal que para se verifica que . La estimación que ofrece la notación es una acotación sobre la tasa de crecimiento que, aplicado al número de operaciones que se han de hacer en un algoritmo, acota el crecimiento que puede tener el coste de realizar el programa al aumentar la complejidad del problema. Definición: la complejidad del algoritmo es del orden de g(n) (lo representaremos por O(g(n)) ) si existe un n0 tal que, para todo valor de n≥n0 , existe una constante C tal que |f(n)|≤C |g(n)|. Con esta definición, si f(n) es un polinomio de grado k, el algoritmo correspondiente tendrá una complejidad O(nk), independientemente de cuales sean los coeficientes y términos de menor grado del polinomio. De esta forma se formaliza la idea de que dos algoritmos de distinta eficiencia tengan la misma complejidad. Tabla N° 01: En éste caso, la complejidad de los algoritmos es de O(n) y O(2n) respectivamente. LA EFICIENCIA DE LOS ALGORITMOS. Coste Computacional. Uno de los aspectos fundamentales que diferencian a un programador medio de un ingeniero en computación es que posee conocimientos de base mucho más amplios y elevados es el aspecto de la eficiencia de los algoritmos. La idea de la eficiencia de los algoritmos se basa en la premisa de que el éxito de un algoritmo no debe de depender en ningún caso de la velocidad ni del potencial del sistema en que se ejecute. Un algoritmo eficiente siempre tiene que ser mejor que otro que no lo es, aun en el caso de que el segundo se ejecute en un sistema claramente superior. Un análisis de coste puede efectuarse en cualquiera de los ámbitos de su uso. Los dos más frecuentes son: 4 Informe de Algoritmo y Estructuras II: Orden de Complejidad • El análisis de coste computacional, que mide la eficiciencia de coste temporal de los algoritmos y, • El análisis de consumo de memoria, que mide la cantidad de memoria consumida por un algoritmo. Para comparar y analizar la eficiencia de los algoritmos, éstos se consideran escritos en un lenguaje de programación de alto nivel, pero aun empleando la misma representación, establecer una medida precisa de la eficiencia de un algoritmo no es fácil. En efecto, una definición de eficiencia podría ser el número de instrucciones que tiene el programa; sin embargo esto no se correspondería, con el concepto intuitivo que tiene eficiencia (según el cual, el algoritmo más eficiente sería aquel que tardase menos tiempo en resolver el problema sobre una misma máquina), dado que todas las instrucciones no utilizan el mismo tiempo de procesador aun realizando la misma función. Tabla N° 02: El primer algoritmo es más costoso que el segundo, a pesar de hacer la misma función, a causa de que la potencia es mucho más lenta que el producto. Es más, el número de instrucciones puede reducirse sin que por ello disminuya el número de instrucciones que realmente deben procesarse; así por ejemplo, un bucle lo podemos programar tanto con una estructura desde-hasta como con una estructura mientras y aunque en este último caso se necesitan más instrucciones Tabla N° 03: Los dos bucles implican los mismos cálculos, con independencia del número de instrucciones de sus estructuras. Por otra parte, el propio concepto de tipo de dato se utiliza, entre otras cosas, para emplear los métodos más adecuados para realizar las operaciones entre los datos. Así, para un mismo procesador, efectuar el producto de dos números es mucho más lento si estos números son de tipo Real que si son de tipo Entero, aun siendo los mismos números; sin embargo ambos casos son similares desde el punto de vista algorítmico. 5 Informe de Algoritmo y Estructuras II: Orden de Complejidad 2) Tipos de Ordenes de Complejidad a) Polinomial (Clase P): Es cuando un algoritmo tiene una complejidad de O(nk). También conocidos como Algoritmos de tiempo polinomial (en el caso de k=1 se le llama lineal, para k=2 Cuadrático y para k=3 cúbico). Los algoritmos de complejidad polinómica se dice que son tratables en el sentido de que suelen ser abordables en la práctica. Los problemas para los que se conocen algoritmos con esta complejidad se dice que forman la clase P. Si por ejemplo, se encuentra que un algoritmo crece con con la tasa es correcto decir que es , pero es mucho más preciso afirmar que es . En el caso de la búsqueda secuencial, el algoritmo es , es decir, lineal. b) No-Polinomiales (Clase NP): También encontramos algoritmos cuyo coste computacional aumenta muy rápidamente con el tamaño del problema, como aquellos no polinómicos (por ejemplo ). Los problemas cuya complejidad crece exponencialmente son intratables, pues solo podrán resolverse en casos muy sencillos. Algunos ejemplos son la búsqueda de la distancia más corta entre puntos o la factorización de un número en sus componentes primos. Esa complejidad se utiliza en algunos casos, como la factorización del número, para construir claves criptográficas. Con frecuencia algoritmos que crecen sólo de un modo logarítmico con el tamaño de problema ( ), o algo más rápido que linealmente ( ). En esos casos consideraremos que son algoritmos eficientes. Las funciones de complejidad algorítmica más habituales en las cuales el único factor del que dependen es el tamaño de la muestra de entrada n, ordenadas de mayor a menor eficiencia son: 6 Informe de Algoritmo y Estructuras II: Orden de Complejidad TIPOS Orden Nombre Comentario POLINOMIAL O(1) Orden constante Cuando las instrucciones se ejecutan una vez. O(n) Orden lineal Es una complejidad buena y también muy usual. Aparece en la evaluación de bucles simples siempre que la complejidad de las instrucciones interiores sea constante. O(n2) Orden cuadrático Aparece en bucles o ciclos doblemente anidados. Si n se duplica, el tiempo de ejecución aumenta cuatro veces. O(n3) Orden cúbico Suele darse en bucles con triple anidación. Si n se duplica, el tiempo de ejecución se multiplica por ocho. Para un valor grande de n empieza a crecer dramáticamente. O(na) Orden polinómico (a > 3). Si a crece, la complejidad del programa es bastante mala. NO POLINOMIAL O(log n) Orden logarítmico Complejidad logarítmica. Esta suele aparecer en determinados algoritmos con iteración o recursión no estructural, ejemplo la búsqueda binaria. O(n log n) Orden cuasi- lineal Se encuentra en algoritmos de tipo divide y vencerás como por ejemplo en el método de ordenación quicksort y se considera una buena complejidad. Si n se duplica, el tiempo de ejecución es ligeramente mayor del doble. O(2n) Orden exponencial No suelen ser muy útiles en la práctica por el elevadísimo tiempo de ejecución. Se dan en subprogramas recursivos que contengan dos o más llamadas internas. N O(n!) Orden factorial Es el típicode aquellos algoritmos que para un problema complejo prueban todas las combinaciones posibles. O(n n ) combinatorio Tan intratable como el anterior. A menudo no se hace distinción entre ellos. Tabla N° 04: Funciones de complejidad algorítmica. 7 Informe de Algoritmo y Estructuras II: Orden de Complejidad 3) Dar un ejemplo en pseudocódigo de cada orden de complejidad. Orden Nombre Pseudocódigo (inglés o español, ambos incluso) O(1) Orden constante int y, z, k = 10; O(1) for(int i = 0; i < k; i++) k * O(1) { y = y + i; O(1) z = z + k; O(1) } O(n) Orden lineal O(na) Orden polinómico inicio P←a(n) Desde j=n-1 hasta 0 hacer P←P*x+a(i) fin-desde fin 8 Informe de Algoritmo y Estructuras II: Orden de Complejidad O(n 2 ) Orden cuadrático O(log n) Orden logarítmico int c, x; O(1) for(int i= 0; i < n; i++) O(n) { c = i; O(1) while(c > 0) O(log n) { x = x % c; O(1) c = c / 2; O(1)} x = x + 2; O(1) } O(n log n) Orden cuasi- lineal inicio variables A: arreglo[1..n] entero variables i,j,central:entero variables primero, ultimo: entero para i = 1 hasta n leer(A[i]) Fin para primero = 1 9 Informe de Algoritmo y Estructuras II: Orden de Complejidad ultimo = n qsort(A[],100) Fin Funcion qsort(primero, ultimo:entero) i = primero j = ultimo central = A[(primero,ultimo) div 2] repetir mientras A[i]central j = j - 1 fin mientras si i < = j aux = A[i] A[j] = A[i] A[i] = aux i = i + 1 j = j - 1 fin si hasta que i > j si primero < j partir(primero,j) fin si si i < ultimo partir(i, ultimo) fin si fin funcion qsort 10 Informe de Algoritmo y Estructuras II: Orden de Complejidad O(n!) Orden factorial Una versión iterativa: PROCEDURE Factorial(n : CARDINAL) : CARDINAL BEGIN VAR Resultado,i : CARDINAL ; Resultado :=1 ; FOR i :=1 TO n DO Resultado :=Resultado*i ; END ; RETURN Resultado END Factorial Una versión recursiva del mismo algoritmo, es: PROCEDURE Factorial(n: CARDINAL): CARDINAL; BEGIN IF n=0 THEN RETURN 1 ELSE RETURN ( n* Factorial(n-1) ) END END Factorial; O(n n ) combinatorio P(0)←0 C←N K←1 Mientras k<>N hacer C←C/2 Desde j=k hasta2*k-1hacer P(j) ←P(j-k)+C fin-desde k←k*2 fin-mientras Tabla N° 05: pseudocódigo para cada Orden de Complejidad Importante 11 Informe de Algoritmo y Estructuras II: Orden de Complejidad 1) Realizar un cuadro comparativo entre al menos 03 algoritmos de ordenamiento. Ordenamiento Orden de complejidad Cantidad de comparaciones Cantidad de intercambios Rápido (Quicksort) O(n*log(n)) primero = 1 ultimo = n Bucle Mientras: j = j - 1 Condicional i < = j aux = A[i] A[j] = A[i] A[i] = aux i = i + 1 j = j - 1 fin si por Inserción O(n2) Bucle Desde : 2 + 2 + 2 ... + 2 + 2 =2(n-1) Bucle Mientras: 1 + 2 + 3 + ... + n-2 + n-1 = n(n-1)/2 Por Intercambio O(n2) (1 + 2 + + n-1) = (n -1) * (n/2) AUX←A(I) A(I)←A(I+1) A(I+1)←AUX Tabla N° 06: Cuadro Comparativo para tres algoritmos de ordenamiento, en donde se visualiza la cantidad de comparaciones y de intercambios dentro a modo pseudocódigo en español. 12 Informe de Algoritmo y Estructuras II: Orden de Complejidad Lista de algoritmos de ordenamiento: Algunos algoritmos de ordenamiento agrupados según estabilidad tomando en cuenta la complejidad computacional. Estables Nombre traducido Nombre original Complejidad Método Ordenamiento de burbuja Bubblesort O(n²) Intercambio Ordenamiento de burbuja bidireccional Cocktail sort O(n²) Intercambio Ordenamiento por selección Selection Sort O(n²) Intercambio Ordenamiento por inserción Insertion sort O(n²) Inserción Ordenamiento por casilleros Bucket sort O(n) No comparativo Ordenamiento por cuentas Counting sort O(n+k) No comparativo Ordenamiento por mezcla Merge sort O(n log n) Mezcla Ordenamiento con árbol binario Binary tree sort O(n log n) Inserción Pigeonhole sort O(n+k) Ordenamiento Radix Radix sort O(nk) No comparativo Distribution sort O(n³) versión recursiva Gnome sort O(n²) 13 Informe de Algoritmo y Estructuras II: Orden de Complejidad Inestables Nombre traducido Nombre original Complejidad Método Ordenamiento Shell Shell sort O(n1.25) Inserción Comb sort O(n log n) Intercambio Ordenamiento por selección Selection sort O(n²) Selección Ordenamiento por montículos Heapsort O(n log n) Selección Smoothsort O(n log n) Selección Ordenamiento rápido Quicksort Promedio: O(n log n), peor caso: O(n²) Partición Several Unique Sort Promedio: O(n u), peor caso: O(n²); u=n; u = número único de registros Cuestionables, imprácticos Nombre traducido Nombre original Complejidad Método Bogosort O(n × n!), peor: no termina Pancake sorting O(n), excepto en máquinas de Von Neumann Randomsort Promedio: O(n!) Peor: No termina Tabla N° 07: Algoritmos de Ordenamiento según su estabilidad a modo de consulta.
Compartir