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.

454 Capítulo 20. Esquemas algorítmicos fundam<strong>en</strong>tales<br />

Esta organización permite distinguir claram<strong>en</strong>te las acciones compon<strong>en</strong>tes<br />

de los esquemas divide y v<strong>en</strong>cerás comparándolo con el esquema g<strong>en</strong>eral. El<br />

sigui<strong>en</strong>te algoritmo, Quick Sort, resuelve el mismo problema sigui<strong>en</strong>do también<br />

una estrategia divide y v<strong>en</strong>cerás:<br />

si v es de tamaño 1 <strong>en</strong>tonces<br />

v ya está ord<strong>en</strong>ado<br />

si no<br />

Dividir v <strong>en</strong> dos bloques A y B<br />

con todos los elem<strong>en</strong>tos de A m<strong>en</strong>ores que los de B<br />

fin {si}<br />

Ord<strong>en</strong>ar A y B usando Quick Sort<br />

Devolver v ya ord<strong>en</strong>ado como concat<strong>en</strong>ación<br />

de las ord<strong>en</strong>aciones de A y de B<br />

Aunque ambos algoritmos sigu<strong>en</strong> el mismo esquema, <strong>en</strong> el primero la mayor<br />

parte del trabajo se efectúa al combinar las subsoluciones, mi<strong>en</strong>tras que <strong>en</strong> el<br />

segundo la tarea principal es el reparto de los datos <strong>en</strong> subconjuntos. De hecho,<br />

lo normal es operar reestructurando el propio vector, de modo que no es preciso<br />

combinar las subsoluciones concat<strong>en</strong>ando los vectores. Además, como se analizó<br />

<strong>en</strong> el apartado 18.3.2, el algoritmo Merge Sort resulta ser más efici<strong>en</strong>te <strong>en</strong> el<br />

peor caso, ya que su complejidad es del ord<strong>en</strong> de n log n fr<strong>en</strong>te a la complejidad<br />

cuadrática de Quick Sort, también <strong>en</strong> el peor caso.<br />

20.2.1 Equilibrado de los subproblemas<br />

Para que el esquema algorítmico divide y v<strong>en</strong>cerás sea efici<strong>en</strong>te es necesario<br />

que el tamaño de los subproblemas obt<strong>en</strong>idos sea similar. Por ejemplo, <strong>en</strong> el caso<br />

del algoritmo Quick Sort, y <strong>en</strong> relación con estos tamaños, se podrían distinguir<br />

dos versiones:<br />

• La pres<strong>en</strong>tada anteriorm<strong>en</strong>te, cuya complejidad <strong>en</strong> el caso medio es del<br />

ord<strong>en</strong> de n log n.<br />

• La deg<strong>en</strong>erada, <strong>en</strong> la que uno de los subproblemas es la lista unitaria es<br />

de tamaño 1, y <strong>en</strong> la que se ti<strong>en</strong>e una complejidad cuadrática. De hecho,<br />

esta versión de Quick Sort es equival<strong>en</strong>te al algoritmo de ord<strong>en</strong>ación por<br />

inserción (véase el apartado 15.2.2).<br />

No obstante, hay problemas <strong>en</strong> los que el esquema divide y v<strong>en</strong>cerás no<br />

ahorra coste, ni siquiera equilibrando los subproblemas. Por ejemplo, el cálculo<br />

de b i=a i. En efecto, su versión recursiva con los subproblemas equilibrados<br />

b<br />

<br />

i =<br />

i=a<br />

1 si b < a<br />

mi=a i ∗ b i=m+1 i, para m = (a + b) div 2, e. o. c.

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

Saved successfully!

Ooh no, something went wrong!