Está en la página 1de 7

Algoritmos Fundamentales sobre Arreglos

Guido Urdaneta Enero, 2010

Esta gua es simplemente una referencia informal y toma elementos de diversas fuentes, especialmente del libro Introduction to Algorithms de Cormen et al.

1 Bsqueda Secuencial
Este algoritmo permite encontrar un elemento en un arreglo.

E J >KI?=H+

F=H=> A ? +

F=H=> A E 

=HH

B H E J E  E =HH A CJD EB =HH E AGK= I? HAJKH E

Se denomina bsqueda secuencial porque examina secuencialmente cada uno de los elementos del arreglo. Si el nmero de elementos en el arreglo es n, este algoritmo realiza n = (n) comparaciones en el peor caso. En el caso promedio realizara n/2 = (n) comparaciones. Como puede verse, este algoritmo tiene un tiempo de ejecucin lineal y por eso tambin se le conoce como bsqueda lineal.

2 Bsqueda binaria
La bsqueda secuencial es rpida para arreglos pequeos, pero en el caso de arreglos grandes es ms eciente utilizar bsqueda binaria.

E J >KI?=H+

F=H=> A ? +

F=H=> A

=HH

E J E B  E J IKF =HH MDE A E B E J A@ E J ? F EB ? F IKF

A CJD  IKF E B IKF =HH A@ ? F=HA6 ?  A@ 

A IA EB ? F  E B A@  A IA HAJKH HAJKH  A@ IA A ? JH

Este algoritmo, por supuesto, slo funciona si el arreglo est ordenado previamente. El anlisis de este algoritmo para el peor caso es ms sencillo si lo interpretamos como si fuera recursivo ya que en cada iteracin se repite el mismo proceso pero considerando la mitad de los elementos a analizar. El tiempo T (d) requerido para resolver el problema cuando quedan pendientes por analizar d elementos es T (d) = T (d/2) + b, siendo b un tiempo constante para realizar las operaciones dentro del lazo y T (d/2) el tiempo requerido para analizar d/2 elementos ya que en la siguiente iteracin se realiza sobre la mitad de los elementos. Para n elementos, esto da lugar a una recurrencia T (n) = T (n/2) + b con T (1) = k, que sera el tiempo requerido para terminar el lazo. Para resolver esta relacin de recurrencia realizamos un cambio de variable y establecemos que n = 2m , por lo tanto, T (n) = T (2m ) = T (2m1 ) + b. Si hacemos tm = T (2m ) nos queda que t m = t m 1 + b (1) y tambien t m 1 = t m 2 + b restando 2 de 1 y agrupando trminos nos queda t m 2 t m 1 + t m 2 = 0 (3) (2)

la cual es una relacin de recurrencia lineal homognea cuyo polinomio caracterstico es x2 2x + 1 = ( x 1)2 que tiene la raz x = 1 con multiplicidad 2. Entonces la solucin de esta recurrencia es tm = cm 1m + c2 m1m = c1 + c2 m. Como n = 2m entonces m = lg n y T (n) = tlg n = c1 + c2 lg n = (log n) = O(log n) 2

3 Quicksort
Quicksort es uno de los mejores algoritmos que existe para ordenar arreglos. La idea general es la siguiente: 1. Si el nmero de elementos es 0 o 1, retornar. 2. Seleccionar un elemento del arreglo. Este elemento recibe el nombre de pivote. 3. Particionar los otros elementos en dos grupos disjuntos: A1 con los elementos menores que el pivote y A2 con los elementos mayores o iguales que el pivote. 4. Retornar quicksort( A1 ), seguido del pivote y seguido de quicksort( A2 ). Como puede verse, quicksort es un algoritmo recursivo y, por lo tanto, su anlisis involucra la resolucin de una relacin de recurrencia. Es evidente que siempre la seleccin del pivote es (1) y una vez seleccionado el pivote, se realizan n 1 = (n) comparaciones para determinar los grupos A1 y A2 .

3.1 Anlisis de peor caso


El peor caso de quicksort es cuando el pivote siempre resulta ser el menor de los elementos del arreglo y por lo tanto el tiempo T (n) para ordenar los n elementos es la suma del tiempo requerido para particionar que es (1) + (n) = (n) y la podemos aproximar como kn (k > 0), el tiempo requerido para procesar un grupo de cero elementos que es T (0) = (1) y el tiempo requerido para procesar n 1 elementos, que es T (n 1). Entonces nos queda, despus de eliminar los trminos absorbidos por la notacin asinttica, la expresin T (n) = T (n 1) + kn (4) que es una recurrencia lineal no homognea. El polinomio caracterstico es x 1 = 0 y por lo tanto la nica raz es 1 y la solucin homognea es c1 1n = c1 . Para encontrar una solucin particular podemos hacer T (n) = An2 + Bn + C y sustituyendo en 4 nos queda An2 + Bn + C = A(n 1)2 + B(n 1) + C + kn = An2 2 An + A + Bn B + C + kn = An2 + n( B 2 A + k) + ( A B + C ) de donde nos queda A = k /2, B = k/2, C = 0. La solucin nal es la suma de la solucin homognea y la solucin particular y es T (n) = k 2 k n n + c1 = ( n2 ) 2 2 3 (5)

3.2 Anlisis de mejor caso


El mejor caso ocurre cuando el pivote siempre divide el arreglo en dos partes iguales. En este caso T (n) sera el tiempo requerido para realizar la divisin del arreglo, que ya sabemos que es (n) y que aproximamos como kn (k > 0) y el tiempo requerido para ordenar dos subarreglos cuyo tamao no es superior a la mitad del arreglo original (de hecho los tamaos son n/2 y n/2 1). Entonces la relacin de recurrencia la aproximamos como T (n) = 2T (n/2) + kn (6) lo cual es ligeramente ms que T ( n/2 1) + T ( n/2 ) + kn, pero es aceptable para simplicar el anlisis, ya que estamos interesados en una cota superior. Para resolver esta ecuacin de nuevo hacemos n = 2m y nos queda T (2m ) = 2T (2m1 ) + k2m . Haciendo tm = T (2m ) y reordenando los trminos nos queda t m 2 t m 1 = k 2m y tambin, sustituyendo m por m 1 t m 1 2 t m 2 = k 2m 1 (8) (7)

restando 7 menos 2 veces 8 nos queda tm 4tm1 + 4tm2 = 0, que es una relacin de recurrencia lineal homognea cuyo polinomio caracterstico es x2 4x + 4 = ( x 2)2 , que tiene la raz doble 2. Entonces la solucin de la recurrencia tm es t m = c 1 2m + c2 m 2m como n = 2m entonces m = lg n y como tm = T (2m ) entonces tlg n = T (2lg n ) = T (n) = c1 2lg n + c2 lg n2lg n = c1 n + c2 n lg n = O(n lg n) (9)

3.3 Anlisis de caso promedio


En general, para ordenar n elementos, quicksort particiona (a un costo kn) el arreglo en dos subarreglos de tamao m y n m 1. Por lo tanto la relacin de recurrencia general es T (n) = T (m) + T (n m 1) + kn. Si asumimos que todas las posibles particiones son igualmente probables, el tiempo promedio de T (m) y T (n m 1) es el mismo y es 1 n 1 T (i ) n i =0 Entonces el tiempo promedio sera 2 n 1 T (n) = T (i ) + kn n i =0 4 (11) (10)

multiplicando 11 por n tenemos


n 1

nT (n) = 2 sustituyendo n por n 1 nos queda

i =0

T (i) + kn2

(12)

( n 1) T ( n 1) = 2
Si restamos 13 de 12 obtenemos

n 2 i =0

T ( i ) + k ( n 1)2

(13)

nT (n) (n 1) T (n 1) = 2T (n 1) + 2kn k Reagrupando nos queda T (n) =

(14)

( n + 1) k T ( n 1) + 2k n n

(15)

Demostraremos por induccin que T (n) (n + 1) lg(n + 1) = O(n lg n), o lo que es lo mismo, T (n 1) cn lg n. Fcilmente podemos encontrar valores de c y n sucientemente grandes tales que (n0 + 1) lg(n0 + 1) T (n0 ), as que lo que resta es demostrar que T (n) c(n + 1) lg(n + 1) asumiendo que T (n 1) cn lg n. Multipliquemos la hiptesis por
n +1 n

y summosle 2k

k n

y nos queda

n+1 k k T (n 1) + 2k = T (n) c(n + 1) lg n + 2k n n n Entonces, slo resta demostrar que c(n + 1) lg n + 2k lo cual es equivalente a k 2k c(n + 1) lg(n + 1) c(n + 1) lg n + n ( ) n+1 k = c(n + 1) lg + n n ) ( ) ( 1 k 1 + c lg 1 + + = cn lg 1 + n n n ( ) 1 Cuando n es grande, los ltimos dos trminos tienden a cero, pero cn lg 1 + n tiende a c (calcular lmite cuando n para vericar), la cual arbitrariamente podemos jarla con un valor mayor que 2k. k c(n + 1) lg(n + 1) n

4 Mergesort
La operacin clave del ordenamiento por fusin es la operacin de fusin, la cual consiste en combinar dos arreglos ordenados en un nico arreglo ordenado ms grande. Si A es un arreglo y p, q, r son ndices de A, tales que el subarreglo 1 est denido entre los ndices p y q y el subarreglo 2 est denido entre los ndices q + 1 y r, entonces denimos la operacin de fusion como:

AHCA) F G H  G F  H G 1 3 AI K KAL =HHAC @A J= = ,-4 AI K KAL =HHAC @A J= = B H E  E  E  1 3 E ) F E B H    ,-4 ) G  1 3  1 .1 16 ,-4 1 .1 16 E   B H  F H  EB 1 3 E ,-4  ) 1 3 E A IA ) ,-4

  

Si n = r p, entonces el tiempo de ejecucin es (n). El centinela sera la evaluacin de la condicin en el ciclo (k<=r), que se ejecuta n + 1 = (n) veces. El procedimiento de ordenamiento por fusin es entonces:

AHCAI HJ) F H EB F H G F H AHCAI HJ) F G AHCAI HJ) G  H AHCA) F G H

El tiempo de ejecucin es T (n) = 2T (n/2) + kn, donde el T (n/2) es el tiempo que toma ordenar un subarreglo de la mitad del tamao y kn = (n) es el tiempo que toma realizar la fusin de los dos subarreglos. Esta relacin de recurrencia es idntica a la correspondiente al mejor caso de quicksort y sabemos que el resultado es (n log(n)). 6

5 Arreglos de tamao variable (listas basadas en arreglos)


Con frecuencia, se desea tener una lista relativamente pequea de elementos, pero de tamao variable y en muchos casos los arreglos son la opcin ms apropiada. Para minimizar el costo de la asignacin de memoria, el arreglo debe crecer en pedazos ms o menos grandes y toda la informacin sobre el arreglo se debe manetener organizada en un solo lugar. Los arreglos son la manera ms simple de agrupar datos. Proporcionan las siguientes operaciones en tiempo O(1): agregar al nal del arreglo, borrar al nal del arreglo y obtener el i-simo elemento. Las siguientes operaciones tienen un tiempo O(n): aadir en posicin i, encontrar elemento e, borrar posicin i, borrar elemento e.

También podría gustarte