You are on page 1of 13

Algoritmia elemental.

Octubre 2011

Contenido ndice
1. Introduccin. 2. Eciencia de algoritmos. 2.1. Tiempo de ejecucin. . . . . . . . . . . . . . . . . . . . . . . . 3. El caso medio y el caso peor. 4. Operacin elemental. 5. Necesidad de eciencia. 6. Bsquedas lineal y binaria. 7. Ordenacin. 7.1. Insercin. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.2. Seleccin. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 2 3 4 4 6 6 9 9 11

1.

Introduccin.

En el captulo anterior hemos visto varios algoritmos que nos permitan multiplicar dos nmeros naturales. Cada pareja a los que se les aplicaba el algoritmo era un ejemplar o caso del problema. Un problema ms general es multiplicar dos nmeros naturales que tiene un conjunto innito de ejemplares. Un algoritmo debe funcionar correctamente en todos los ejemplares del problema que maniesta resolver. Recordar que un algoritmo debe especicar su dominio de denicin o conjunto de valores que admite como sus entradas. Espacio de almacenamiento. Puesto que debe ejecutarse por una mquina real en su ejecucin pueden presentarse problema de almacenamiento de variables, memoria del ordenador, etc. Para obviar estos problemas supondremos que el ejecutor es una mquina ideal, sin limitacin fsica alguna. Eleccin de un algoritmo. Para resolver un problema podemos tener a nuestra disposicin varios algoritmos. Para seleccionar el mejor, podemos

seguir varios criterios. Como criterios o ideas generales tenemos: Enfoque emprico (o a posteriori): una vez probados sobre varios ejemplares, se toma el de mejor rendimiento. Enfoque terico (o a priori).Se analizan los recursos necesarios para cada algoritmo como funcin del tamao de los casos considerados. Los recursos que ms interesan son el tiempo de computacin y el espacio de almacenamiento.

2.

Eciencia de algoritmos.

De las condiciones exigidas a un algoritmo (vase Tema 1), la ms interesante es la efectividad (ha de ser ejecutable en tiempo nito), lo que depende de los recursos y de ellos el ms importante es el tiempo de ejecucin y despus el espacio de almacenamiento. Entenderemos por eciencia la rapidez con que se ejecuta que suele estar en relacin directa con el tamao del ejemplar considerado. Tamao de un ejemplar Cualquier entero positivo que mida de algn modo el nmero de sus componentes. Por ejemplo: Problema Bsqueda en una lista Multiplicar dos matrices Ordenar una lista Recorrer un rbol binario Resolver SEL Explorar y recorrer grafos Tamao Nmero de elementos de la lista Dimensiones de las matrices Nmero de elementos de la lista Nmero de nodos del rbol Nmero de ecuaciones y/o incgnitas Nmero de nodos y/o aristas

Este planteamiento para el tamao de un problema es terico y no depende de la mquina, ni del lenguaje de programacin, ni de las habilidades del programador. Principio de Invarianza A la hora de usar distintos compiladores o lenguajes de programacin, claramente un algoritmo no tardar lo mismo en ejecutarse. Por ello no podramos hablar de un algoritmo con un tiempo de ejecucin exactamente T (n).

Se puede dar una idea aproximada del tiempo de ejecucin mediante el principio de invarianza, por el que dos implementaciones del algoritmo en una mquina real no dieren en su eciencia en ms de un factor constante. Es decir, ante un ejemplar de un problema de tamao n un algoritmo tarda T1 (n) y T2 (n) en dos mquinas distintas, entonces existen C1 , C2 R0 tales que para n es T1 (n) C2 T2 (n), T2 (n) C1 T1 (n)

2.1.

Tiempo de ejecucin.

Tiempo de ejecucin de orden Denicin: 1. Decimos que un algoritmo requiere un tiempo de ejecucin de orden T (n) si existe una implementacin del algoritmo capaz de resolver cualquier ejemplar de tamao n en un tiempo inferior a CT (n) siendo C un nmero real positivo. Lo denotaremos O(T (n)). La constante C depender de la mquina y/o del lenguaje. Segn la forma de T (n) se dir que el algoritmo es lineal, cuadrtico, polinomial, exponencial, etc. Usualmente no se conocen las constantes ocultas que afectan a T (n) o no interesan, pero no se pueden olvidar por completo dichas constantes ocultas. Ejemplos Cuidado: Considerar dos algoritmos cuyas implementaciones en cierta mquina requieren n2 das y n3 segundos, respectivamente. Solamente en algoritmos que requiera 20 millones de aos para resolverlos, el algoritmo cuadrtico ser mejor que el cbico. Sin embargo, desde el punto de vista terico el primero es asintticamente mejor. Al implementar un algoritmo se obtiene que su tiempo de ejecucin es T (0) = 1, T (1) = 4, T (n) = (n + 1)2 para n 2. Probar que el tiempo de ejecucin est en el orden de n2 . Solucin: Necesitamos una constante C y un nmero natural n0 que verique (n + 1)2 Cn2 . Podemos tomar, por ejemplo, n0 = 1 y C = 4, n0 = 3 y C = 2, etc. Demostrar que T (n) = 4n3 + 2n es O(n3 ). Al igual que utilizamos la notacin O para dar una cota superior del tiempo de ejecucin, la notacin que utilizamos para dar una cota inferior del mismo, es:

Diremos que el tiempo de ejecucin T (n) de un algoritmo es (f (n)) si existe c R0 y n0 N tal que T (n) cf (n) para todo n n0 Diremos que el tiempo de ejecucin de un algoritmo es de (f (n)), si es a la vez O(f (n)) y (f (n)) Demostrar que T (n) = 3n3 + 2n2 es de (n3 )

3.

El caso medio y el caso peor.

El tiempo de ejecucin, muchas veces, no depende slo del tamao de la entrada, si no de la entrada particular. Esta dependencia se puede estudiar mediante dos mtodos: Anlisis de caso medio: se analiza el tiempo de ejecucin para todas las entradas de tamao n y se hace su media. Y s no todas las entradas son equiprobables? Anlisis del caso peor: localiza la entrada que haga ms largo el tiempo de ejecucin del algoritmo; es decir la que realice todos su pasos o la gran mayora si hay sentencias condicionales. Es el que utilizaremos por defecto

4.

Operacin elemental

Es aquella cuyo tiempo de ejecucin se puede acotar superiormente por una constante, que no depende del tamao del ejemplar ni de los parmetros que se est considerando, puede depender de la implementacin, de la mquina, del programa usado. Operacin elemental: El el siguiente algoritmo Suma, que calcula la suma de los n primeros nmeros naturales, se puede considerar elemental la instruccin s = s + i, siempre y cuando consideremos los nmeros involucrados pequeos, si son grandes no. int Suma (int n) ENTRADA: n entero SALIDA: La suma 1 + 2 + + n 1. s = 0 2. para i = 1 hasta n hacer 3. s=s+i 4

4. n para 5. devolver (s) Operacin no elemental: El el siguiente algoritmo SumaRecu, que calcula la suma de los n primeros nmeros naturales, evidentemente no es elemental la instruccin si entonces sino int SumaRecu (int n) ENTRADA: n entero SALIDA: La suma 1 + 2 + + n 1. Si n = 1 entonces 2. devolver(n)

3. si no 4. devolver(n)+SumaRecu (n 1)

5. n si Ejemplo Sea a[1 n] un array de n nmeros enteros. Se puede armar que x =mn{a[i]; i = 1, 2, , n} es una operacin elemental? Solucin: No, ya que el tiempo de ejecucin crece con n. Esa instruccin es una abreviatura de x =Minimo(a) con la funcin Minimo dada por array Minimo (array a) ENTRADA: a[1 n] array de n enteros SALIDA: mn{a[i]; i = 1, 2, , n} 1. x = a[1] 2. para i = 2 hasta n hacer 3. 4. 5. si a[i] < x entonces x = a[i] n si

6. n para 7. devolver(x) con al menos n operaciones elementales si entonces 5

5.

Necesidad de eciencia

Es necesaria la eciencia? Esencialmente es la velocidad de crecimiento de un algoritmo la que determina el tamao de un problema que se puede resolver en una mquina. A menos que un algoritmo tenga una velocidad de crecimiento tan baja como O(ln(n)) u O(n) un incremento pequeo en la rapidez de la mquina no inuye en el tamao del problema ms grande que se pueda resolver. Por tanto, es necesaria la eciencia de un algoritmo y no la fuerza bruta. Veamos algn ejemplo. Ejemplo Sean A1 , A2 y A3 tres algoritmos para resolver un problema. Se sabe que en una determinada mquina el tiempo de ejecucin no supera 100n, 5n2 y 3n , respectivamente. Cul es ms ecaz? Una tabla con los primeros valores de las acotaciones par los tres algoritmos es; Ejemplo n 1 2 3 4 5 6 . . . 19 20 21 . . .

A1 100 200 300 400 500 600 . . . 1900 2000 2100 . . .

A2 5 20 45 80 125 180 . . . 1805 2000 2205 . . .

A3 3 6 27 81 243 729 . . . . . .

6.

Algoritmos de Bsqueda

LinearSearch En el contexto de bsqueda y ordenacin, supondremos que los elementos lo son de un conjunto ordenado.

Sea a[1 n] una secuencia de n elementos. El problema consiste en determinar si un elemento x es de a. Si x a hallar un ndice j ; 1 j n tal que x = a[j ]; si no j = 0. Se llama bsqueda secuencial o lineal, ya que el mximo nmero de comparaciones crece linealmente con n. Tambin estudiaremos el algoritmo de bsqueda binaria. array LinearSearch (array a, int x) ENTRADA: a[1 n] array de n elementos x Z SALIDA: Si x a el ndice de x en a, sino, el nmero 0. 1. i = 2 2. mientras (i n) (a[i] = x) hacer 3. i=i+1

4. n mientras 5. si i > n entonces 6. i=0

7. n si 8. devolver(i) Notar que tal como est escrito devuelve el primer ndice j encontrado. En el peor caso debe compara x con todas las entradas de a, su orden es O(n). En promedio1 el tiempo de ejecucin del algoritmo LinearSearch es:
n

1. Si x a es A(n) =
i=1

i n+1 = n 2
n

2. Si x a x / a es A(n) =
i=1

q n+1 i + (1 q )n = q + (1 q )n n 2

donde p es la probabilidad de que x a. En ambos casos A(n) (n). Si p = 1, es A(n) = n+1 50 % y si p = 1/2 2 , y se examinan en promedio 3n+1 es A(n) = 4 y ahora 75 %. array BinarySearch (array a, int x) ENTRADA: a[1 n] array con a[1] a[2] a[n] x Z SALIDA: Si x a el ndice de x en a, sino, el nmero 0.
1

Por comodidad de razonamiento supondremos que todos los elementos son distintos

1. l = 1; h = n; j = 0 2. mientras (l h) (j = 0) hacer 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. m = (l + h)/2 si x = a[j ] entonces j=m si no si x < a[m] entonces h=m1 si no l =m+1 n si n si

13. n mientras 14. devolver(j ) Ejemplo: 1. Considerar el array a[1 14] = (1, 4, 5, 7, 8, 9, 10, 12, 15, 22, 23, 27, 32, 35) Como instancia buscamos x = 22. Comparamos con a (1 + 14)/2 = a[7] = 10. Como 22 > a[7] y el array est ordenado, x no puede estar en a[1 7] Ahora comparamos con a (8 + 14)/2 = a[11]. Como 22 < a[11] descartamos la porcin a[11 14] del array y la bsqueda queda reducida a a[8 10]. Comparamos x con a (8 + 10)/2 = a[9]. Como 22 > a[9] descartamos a[8 9] y la nica entrada que puede ser alcanzada es a[10] = 22. Teorema: 1. El nmero de comparaciones realizadas por el algoritmo BinarySearch en un array ordenado de tamao n es a lo ms log n + 1. Notar que el mnimo nmero de comparaciones es 1. Para calcular el nmero mximo, supongamos que x a[i]; 1 i n. El nmero de elementos restantes en la segunda iteracin es n/2 , ya que si n es impar es n/2 y si es par es (n 1)/2. 8

Anlogamente, en la tercera iteracin es n/2 /2 = n/4 . En el j simo paso, el nmero de elementos restante es n/2j 1 . La iteracin contina hasta que el tamao de la subsecuencia es 1 encontremos a x. Por tanto, el mximo nmero de iteraciones para encontrar x es el valor de j tal que n/2j 1 = 1. Es decir, 1 n/2j 1 < 2 2j 1 n < 2j y tomando logaritmos (en base 2), es j 1 log n < j . Como j es entero j = log n + 1

7.

Algoritmos de Ordenacin.

El problema es la ordenacin de una secuencia de nmeros en orden creciente. Puede denirse como: ENTRADA Una secuencia de n nmeros (a1 , a2 , , an ) SALIDA Una permutacin (a1 , a2 , an ) con a1 a2 an . Si la entrada es (31, 41, 59, 26, 41, 58) un algoritmo de ordenacin debe devolver en salida la secuencia (26, 31, 41, 41, 58, 59). Se dir que tal secuencia de entrada es una instancia del problema de ordenacin. La ordenacin es un problema fundamental en informtica (muchos programas la utilizan como paso intermedio. Ello conduce al desarrollo de numerosos buenos algoritmos de ordenacin. La eleccin del mejor algoritmo para una aplicacin dada depende del nmero de elementos a ordenar, de la proporcin que ya estn ordenados y del tipo de unidad de almacenamiento utilizada. Estudiaremos, basicamente, los algoritmos de ordenacin por insercin y por seleccin.

7.1.

Ordenacin por insercin.

El algoritmo de ordenacin por insercin InsertionSort tiene como idea bsica la siguiente: supuestos en orden los elementos a[1], , a[i 1], se inserta a[i] em el orden adecuado de ellos.2 En concreto, primero ordena el subarray de tamao 1, a[1], que ya est ordenado; supuesto ordenado el subarray a[1 i 1], inserta a[i] de modo que a[1 i] quede ordenado. array InsertionSort (array a[1 n]) ENTRADA: Array a[1 n] de n enteros con n 1
2 Este algoritmo es el utilizado para la ordenacin de cartas. Supuestas ordenadas de menor a mayor 1, , i 1, se toma la isima y se pone en su lugar ordenada

SALIDA: Array a[1 n] ordenado en orden creciente 1. para i = 2 hasta n hacer 2. 3. 4. 5. 6. 7. x = a[i], j = i 1 mientras (j > 0) (a[j ] > x) hacer a[j + 1] = a[j ] j =j1 n mientras a[j + 1] = x

8. n para 9. devolver(a[1 n]) Ejemplo Dados el array a = (5, 2, 4, 6, 1, 3) observar el comportamiento del algoritmo InsertionSort Dado el array a[30, 12, 13, 13, 44, 12, 24, 13] aplicar el algoritmo InsertionSort, contabilizando el nmero de operaciones que se efectan. Lo mismo si el array es a = (4, 3, 12, 5, 6, 7, 2, 9) Proposicion: 1. El nmero de comparaciones efectuadas por el algoritmo +1) InsertionSort est entre n 1 y n(n2 . El nmero de asignaciones es igual al nmero de comparaciones ms n 1. Decimos que la complejidad del algoritmo es de orden n2 . Anlisis del caso peor: Para cada i [2 n] el mximo nmero de comparaciones posibles en el bucle mientras del algoritmo es i 1 (cuando el array est en orden descendente), luego en total se efectan W (n) = n n(n 1) (i 1) = Por tanto W (n) O(n2 ) 2 i=2 Anlisis del caso medio: Supondremos los elementos distintos y todas las permutaciones equiprobables. Calcularemos cuntas comparaciones se hacen en promedio para insertar a[i] en orden con los anteriores a[1], , a[i1], es decir cuantas iteraciones del bucle mientras se hacen en promedio para cada valor del item i Anlisis del caso medio: Cuntas iteraciones del bucle mientas se hacen en promedio para cada valor del item i? 10

Hay i posiciones a las que x = a[i] puede ir. Para ubicar al item x en: a[1] se necesitan i 1 comparaciones. a[2] se necesitan i 1 comparaciones. . a[3] se necesitan i 2 comparaciones. . . a[i 1] se necesitan 2 comparaciones. a[i] se necesitan 1 comparacin. Adems la probabilidad de que x se ubique en cualquiera de las i posiciones es la misma. Anlisis del caso medio: El promedio de comparaciones para insertar x = a[i] en a[1], , a[i 1] ser i 1 (i 1) + (i 2) + + 2 + 1 i2 + i 2 i+1 1 + = = i i 2i 2 i Sumando todas las posiciones i [2 n] es
n

A(n) =
i=2

i+1 1 2 i

3 + 4 + + (n + 1) 2

n i=2

1 i

(n + 4)(n 1) ln(n). Evidentemente A(n) O(n2 ). 2 Notar que la ordenacin es in situ y que el algoritmo es sensible a la ordenacin previa de a

7.2.

Ordenacin iterativa por seleccin.

El algoritmo iterativo de ordenacin por seleccin SelectionSort trabaja de forma muy simple: primero selecciona el menor elemento de a y lo coloca en a[1], luego selecciona el mnimo de los restantes n 1 elementos y lo coloca en a[2]. Contina hasta que en la ltima iteracin, al penltimo elemento ms grande lo coloca en a[n 1], quedando as el mayor en a[n]. array SelectionSort (array a) ENTRADA: a array de tamao n, con n 1 SALIDA: El array a ordenado segn 1. para i = 1 hasta n 1 hacer 2. 3. 4. /*Se supone, de momento, que el mnimo est en a[i]*/ m=i /*Ahora se localiza la posicin del mnimo*/ 11

5. 6. 7. 8. 9. 10. 11.

para j = i + 1 hasta n hacer si a[j ] < a[m] m=j n si n para /*Se intercambian el mmino a[m] con a[i]*/ x = a[m]; a[m] = a[i]; a[i] = x

12. n para 13. devolver(a) Se toma n como tamao de la entrada y como medida del tiempo el tiempo de ejecucin de la instruccin barmetro si entonces Proposicion: 2. W (n) O(n2 ) El nmero de veces que se ejecuta dentro de los bucles la instruccin barmetro (6) Si a[j ] < a[m] entonces... es
n1 n

1=
i=1 j =i+1

n(n 1) 2

No es relevante que a est ordenado. Proposicion: 3. Sea n el tamao del array a[1 n]. Se tienen: 1. El nmero de comparaciones efectuadas por SelectionSort es n(n 1)/2 2. El nmero de elementos intercambiados est entre 0 y n 1 3. El nmero de asignaciones efectuadas est entre 0 y 3(n 1), ya que cada intercabio requiere tres asignaciones. Ejercicio: Escribir un algoritmo recursivo de ordenacin por seleccin que llamamos SelectionSortRecu. Empezamos con SelectionSortRecu(a,1)?

12

You might also like