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.

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

Como el primer bucle for se repite n veces y el segundo m veces, y puesto que<br />

el resto de las instrucciones son asignaciones (con tiempo de ejecución constante),<br />

se deduce que el algoritmo ti<strong>en</strong>e una complejidad <strong>en</strong> tiempo T (n, m) ∈ O(nm).<br />

Para mejorar el algoritmo, se podría utilizar un único bucle, at<strong>en</strong>di<strong>en</strong>do al<br />

sigui<strong>en</strong>te diseño:<br />

prod:= 0<br />

repetir n veces<br />

prod:= prod + m<br />

Este diseño también se implem<strong>en</strong>ta fácilm<strong>en</strong>te <strong>en</strong> <strong>Pascal</strong> mediante una función:<br />

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

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

{Dev. n×m}<br />

var<br />

i,prod: integer;<br />

begin<br />

prod:= 0;<br />

for i:= 1 to n do<br />

prod:= prod + m;<br />

Producto2:= prod<br />

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

Se obti<strong>en</strong>e así un código cuya complejidad es, claram<strong>en</strong>te, O(n).<br />

Este algoritmo se puede mejorar ligeram<strong>en</strong>te si se controla que el bucle se<br />

repita n veces si n ≤ m, o m veces si m ≤ n. La implem<strong>en</strong>tación de esta mejora<br />

se deja como ejercicio al lector.<br />

Es posible conseguir una complejidad aún m<strong>en</strong>or utilizando el algoritmo conocido<br />

con el nombre de multiplicación a la rusa. 6 El método consiste <strong>en</strong> multiplicar<br />

uno de los términos por dos mi<strong>en</strong>tras que el otro se divide por dos (división<br />

<strong>en</strong>tera) hasta llegar a obt<strong>en</strong>er un uno. El resultado se obt<strong>en</strong>drá sumando aquellos<br />

valores que se han multiplicado por dos tales que su correspondi<strong>en</strong>te término<br />

dividido por dos sea un número impar. Por ejemplo, al realizar la multiplicación<br />

a la rusa de 25 × 11, se obti<strong>en</strong>e la sigui<strong>en</strong>te tabla de ejecución:<br />

25 11 ∗<br />

50 5 ∗<br />

100 2<br />

200 1 ∗<br />

6 Curiosam<strong>en</strong>te, muchos autores dic<strong>en</strong> que este algoritmo es el que utilizaban los romanos para<br />

multiplicar.

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

Saved successfully!

Ooh no, something went wrong!