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

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

18.3. Reglas prácticas para hallar el coste de un programa 413<br />

obt<strong>en</strong>i<strong>en</strong>do como resultado final 25 + 50 + 200 = 275 debido a que sus términos<br />

divididos correspondi<strong>en</strong>tes (11, 5 y 1) son impares.<br />

❡❡ <br />

La justificación de por qué sumar sólo estos valores es la sigui<strong>en</strong>te: si se<br />

ti<strong>en</strong>e un producto de la forma k × (2l), un paso del algoritmo lo transforma<br />

<strong>en</strong> otro producto igual (2k) × l; sin embargo, si el producto es de la forma<br />

k × (2l + 1), un paso del algoritmo lo transforma <strong>en</strong> (2k) × l (debido a que<br />

(2l + 1) div 2 = l), mi<strong>en</strong>tras que el verdadero resultado del producto es<br />

k × (2l + 1) = (2k) × l + k. Por lo tanto, se t<strong>en</strong>drá que sumar la cantidad<br />

perdida k y esto es lo que se hace siempre que el número que se divide es<br />

impar.<br />

Dada la s<strong>en</strong>cillez del algoritmo, se pres<strong>en</strong>ta directam<strong>en</strong>te su implem<strong>en</strong>tación<br />

<strong>en</strong> <strong>Pascal</strong>:<br />

function ProductoRuso(n,m: integer):integer;<br />

{PreC.: n,m ≥ 0}<br />

{Dev. n×m}<br />

var<br />

prod: integer;<br />

begin<br />

prod:= 0;<br />

while m > 0 do begin<br />

if Odd(m) th<strong>en</strong><br />

prod:= prod + n;<br />

n:= n + n; {n:= n * 2, sin usar *}<br />

m:= m div 2<br />

<strong>en</strong>d; {while}<br />

ProductoRuso:= prod<br />

<strong>en</strong>d; {ProductoRuso}<br />

Como la variable m se divide por dos <strong>en</strong> cada vuelta del bucle, hasta llegar a<br />

0, el algoritmo es de complejidad O(log m).<br />

Ord<strong>en</strong>ación de vectores<br />

En el capítulo 15 se pres<strong>en</strong>taron varios algoritmos para la ord<strong>en</strong>ación de<br />

vectores, vi<strong>en</strong>do cómo, intuitivam<strong>en</strong>te, unos mejoraban a otros <strong>en</strong> su efici<strong>en</strong>cia<br />

<strong>en</strong> tiempo. En este apartado se estudia con detalle la complejidad de algunos de<br />

estos algoritmos 7 utilizando las técnicas expuestas <strong>en</strong> los apartados anteriores.<br />

7 Dado que no es necesario t<strong>en</strong>er <strong>en</strong> cu<strong>en</strong>ta todos los detalles de un algoritmo para su análisis,<br />

se ha optado <strong>en</strong> este apartado por estudiar la complejidad sobre el seudocódigo, llegando hasta<br />

el nivel m<strong>en</strong>os refinado que permita su análisis. Los autores consideran que desc<strong>en</strong>der a niveles<br />

inferiores no es necesario, ya que los fragm<strong>en</strong>tos que tardan un tiempo constante (o acotado por<br />

una constante) no importa qué detalles cont<strong>en</strong>gan.

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

Saved successfully!

Ooh no, something went wrong!