09.05.2013 Views

Algoritmos y Programación en Pascal

Algoritmos y Programación en Pascal

Algoritmos y Programación en Pascal

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

416 Capítulo 18. Complejidad algorítmica<br />

En este caso, el paso Dividir v <strong>en</strong> dos subvectores A y B consiste <strong>en</strong>:<br />

Asignar a A el subvector [v1, . . . , vn div 2]<br />

Asignar a B el subvector [vn div 2+1, . . . , vn]<br />

mi<strong>en</strong>tras que Mezclar las ord<strong>en</strong>aciones de A y B consiste <strong>en</strong> ir <strong>en</strong>tremezclando<br />

adecuadam<strong>en</strong>te las compon<strong>en</strong>tes ya ord<strong>en</strong>adas de A y de B para obt<strong>en</strong>er el resultado<br />

buscado.<br />

El análisis de la complejidad de este algoritmo no es complicado. Parti<strong>en</strong>do de<br />

que la operación de Mezclar las ord<strong>en</strong>aciones de A y B se ejecuta <strong>en</strong> un tiempo<br />

proporcional a n (la longitud del vector por ord<strong>en</strong>ar), el coste <strong>en</strong> tiempo del<br />

algoritmo completo vi<strong>en</strong>e dado por la sigui<strong>en</strong>te relación de recurr<strong>en</strong>cia, donde ki<br />

son cantidades constantes:<br />

<br />

T (n) =<br />

k1<br />

si n = 1<br />

2T ( n<br />

2 ) + k2n + k3 si n > 1<br />

En esta fórmula k1 repres<strong>en</strong>ta el coste del caso trivial (v de tamaño 1); T (n/2)<br />

es el coste de cada llamada recursiva, y k2n + k3 es el coste de mezclar los<br />

subvectores A y B, ya ord<strong>en</strong>ados.<br />

Esta ecuación se resuelve mediante sustituciones sucesivas cuando n es una<br />

pot<strong>en</strong>cia de 2 (es decir, existe j, tal que n = 2 j ), de la sigui<strong>en</strong>te forma:<br />

T (n) = 2(2T ( n n<br />

) + k2<br />

4 2 + k3) + k2n + k3<br />

= 4T ( n<br />

4 ) + 2k2n + k4<br />

= 4(2T ( n n<br />

) + k2<br />

8 4 + k3) + 2k2n + k4<br />

= . . .<br />

= 2 j T (1) + jk2n + kj<br />

= nk1 + k2nlog 2n + kj<br />

Y <strong>en</strong> el caso <strong>en</strong> que n no sea una pot<strong>en</strong>cia de 2, siempre se verifica que existe<br />

k > 0 tal que 2 k < n < 2 k+1 , y, por tanto, se ti<strong>en</strong>e que T (n) ≤ T (2 k+1 ). En<br />

consecu<strong>en</strong>cia, se puede afirmar que, <strong>en</strong> todo caso, T (n) ∈ O(nlog 2n).<br />

Esta conclusión indica que Merge Sort es un algoritmo de ord<strong>en</strong>ación con<br />

una complejidad <strong>en</strong> tiempo óptima 9 <strong>en</strong> el peor caso, aunque no es tan bu<strong>en</strong>o <strong>en</strong><br />

cuanto a la complejidad <strong>en</strong> espacio, ya que es necesario mant<strong>en</strong>er dos copias del<br />

vector. Exist<strong>en</strong> versiones mejoradas de este algoritmo que ti<strong>en</strong><strong>en</strong> m<strong>en</strong>or coste <strong>en</strong><br />

espacio, pero su estudio excede a las pret<strong>en</strong>siones de este texto.<br />

9 Hay que recordar que esta complejidad es óptima bajo la notación O-grande, esto es, salvo<br />

constantes de proporcionalidad.

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!