Вы находитесь на странице: 1из 2

EJERCICIOS DE ALGORTMICA Y COMPLEJIDAD

DIVIDE Y VENCERS


Ejercicio 1.

La funcin mostrada implementa un algoritmo que busca un nmero dentro de un array de
nmeros naturales y devuelve el ndice del elemento que lo contiene. Los ndices del
array son mayores que 0, por lo que en caso de que el nmero no se encuentre, ste ser
el valor a devolver. Adems, el nmero de elementos del array siempre es potencia de 2.

function Buscar (A : vector; prim, ult, buscado : natural) return natural is
primero, ultimo, medio : natural;
encontrado : boolean;
begin
primero := prim; ------ 1
ultimo := ult; ------ 1
encontrado := false; ------ 1
while primero <= ultimo and not encontrado loop ------ 3
medio := (primero + ultimo) / 2; ------ 4
if buscado = A(medio) then ------ 2
encontrado := true; ------ 1
elsif buscado < A(medio) then ------ 2
ultimo := medio - 1; ------ 2
else
primero := medio + 1; ------ 2
end if;
end loop;
if encontrado then ------ 1
return medio; ------ 1
else
return 0; ------ 1
end if;
end Buscar;

1) Cul es la complejidad del algoritmo en funcin del nmero de elementos del array?
2) Calcular el tiempo de ejecucin T(n) en estas situaciones:
a) Para el mejor caso.
b) Para el peor caso.
3) Proponer una versin del algoritmo acorde con la tcnica de divide y vencers.
4) Cul es la complejidad del nuevo algoritmo?
5) Asignar una duracin razonable a cada sentencia del nuevo algoritmo y calcular los
nuevos tiempos de ejecucin T(n).
a) Cuando el array consta de un nico elemento.
b) Para el mejor caso cuando el array contiene ms de un elemento.
c) Para el peor caso.


Ejercicio 2.

La siguiente funcin devuelve la suma de los dgitos que componen el nmero positivo
que se le pasa como parmetro.

function SumaDigitos (n: natural) return natural is
suma, numero : natural;
begin
numero := n; ------ 1
suma := numero mod 10; ------ 3
while numero >= 10 loop ------ 1
numero := numero / 10; ------ 3
suma := suma + (numero mod 10); ------ 4
end loop;
return suma; ------ 1
end SumaDigitos;

1) Calcular la complejidad del algoritmo.
2) Analizar la problemtica que entraara el clculo del tiempo de ejecucin en funcin
del nmero.
3) Modificar el algoritmo para que utilice divide y vencers.
4) Cul ser la complejidad ahora?
5) Qu condicin debera cumplir el nmero para que se pudiera aplicar la tcnica del
cambio de variable?
6) Para finalizar, una curiosidad. Cmo sera la funcin ms sencilla que devolviera la
suma de los dgitos suponiendo que se da la condicin del apartado anterior?


Ejercicio 3.

Dados dos nmeros naturales x y n, se desea desarrollar un algoritmo que resuelva la
expresin x
n
mediante multiplicaciones sucesivas de la base.

1) Escribir el algoritmo mediante la tcnica divide y vencers.
2) Calcular su complejidad en funcin del valor de n.
3) Si n siempre fuera una potencia de 2, cmo se podra modificar el algoritmo para que
fuera ms eficiente?
4) Calcular, en funcin de n, el tiempo de ejecucin del algoritmo modificado asimilando
dicho tiempo con el nmero de veces que se le invoca.

Вам также может понравиться