20.03.2015 Views

Tabla de Contenidos

Tabla de Contenidos

Tabla de Contenidos

SHOW MORE
SHOW LESS

Create successful ePaper yourself

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

2.3. QUICKSORT 33<br />

n<br />

Θ(n)<br />

Θ(n)<br />

1 n − 1<br />

n−1<br />

2<br />

n−1<br />

2<br />

⇐⇒<br />

n<br />

n−1<br />

2<br />

+ 1<br />

n−1<br />

2<br />

Figura 2.7: Porción <strong>de</strong>l árbol <strong>de</strong> recursión para Quick-Sort cuando las particiones se producen<br />

intercalando buenas y malas (izquierda), y cómo esta pue<strong>de</strong> representarse por una porción <strong>de</strong> un<br />

árbol con sólo particiones buenas (<strong>de</strong>recha).<br />

Quicksort Aleatorio<br />

Hemos entregado evi<strong>de</strong>ncia acerca <strong>de</strong> que, si todas las posibles entradas son igualmente probables,<br />

entonces Quick-Sort tiene un buen comportamiento esperado, Θ(nlog n). ¿Qué tan razonable es la<br />

suposición <strong>de</strong> que todas las entradas son igualmente probables? Depen<strong>de</strong> <strong>de</strong>masiado <strong>de</strong> la aplicación.<br />

Por ejemplo, suponga una aplicación que or<strong>de</strong>na datos <strong>de</strong> personas por fecha <strong>de</strong> nacimiento, si ocurre<br />

el caso <strong>de</strong> que los datos se encontraban inicialmente or<strong>de</strong>nados por RUT, Quick-Sort tendrá un mal<br />

comportamiento ¿por qué? El caso peor ocurre si quien entrega la entrada es un adversario. Si él sabe<br />

que estamos utilizando Quick-Sort para or<strong>de</strong>nar el arreglo pue<strong>de</strong> forzar un mal comportamiento.<br />

Una alternativa para solucionar estos problemas es, en vez <strong>de</strong> suponer que todas las entradas<br />

son igualmente probables, imponer que todas lo sean. Esto se pue<strong>de</strong> lograr, por ejemplo, haciendo<br />

permutaciones aleatorias <strong>de</strong> los elementos antes <strong>de</strong> comenzar a or<strong>de</strong>narlos. Entonces Quick-Sort<br />

podría obtener un mejor comportamiento esperado si antes <strong>de</strong> comenzar a or<strong>de</strong>nar los valores, se<br />

asegura <strong>de</strong> que estos estén suficientemente “<strong>de</strong>sor<strong>de</strong>nados”, <strong>de</strong>sor<strong>de</strong>nados en el sentidos <strong>de</strong> que no<br />

<strong>de</strong>pendan <strong>de</strong> una aplicación en particular. Importante es notar que esta modificación no mejora el<br />

peor comportamiento <strong>de</strong> Quick-Sort, <strong>de</strong> hecho podría tenerse tan mala suerte que en el proceso<br />

<strong>de</strong> “<strong>de</strong>sor<strong>de</strong>n” el arreglo que<strong>de</strong> ya or<strong>de</strong>nado, en cuyo caso se obtendrá <strong>de</strong> todas maneras un mal<br />

comportamiento. Lo que si estamos seguros que se logra es in<strong>de</strong>pendizarse <strong>de</strong> la fuente <strong>de</strong> datos<br />

<strong>de</strong> entrada, la probabilidad <strong>de</strong> obtener un mal <strong>de</strong>sempeño ya no <strong>de</strong>pen<strong>de</strong>rá <strong>de</strong> la aplicación o <strong>de</strong> si<br />

un adversario es quién provee los datos <strong>de</strong> entrada.<br />

El siguiente algoritmo Rand-Quick-Sort implementa esta i<strong>de</strong>a llamando al procedimiento<br />

Rand-Partition para realizar la partición.<br />

Rand-Quick-Sort(A,p,r)<br />

if p < r<br />

then q := Rand-Partition(A,p,r)<br />

Rand-Quick-Sort(A,p,q)<br />

Rand-Quick-Sort(A,q + 1,r)

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

Saved successfully!

Ooh no, something went wrong!