Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Algoritmos Fundametales
Algoritmos Fundametales
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
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
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 .
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)
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)
(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:
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