111
DIVIDE Y VENCERÁS
PROCEDURE BuscBin3(VAR a:vector;prim,ult:CARDINAL;x:INTEGER):BOOLEAN; VAR nterc:CARDINAL; (* 1/3 del numero de elementos *) BEGIN IF (prim>=ult) THEN RETURN a[ult]=x END; (* 1 *) nterc:=(ult-prim+1)DIV 3; (* 2 *) IF x=a[prim+nterc] THEN RETURN TRUE (* 3 *) ELSIF x<a[prim+nterc] THEN (* 4 *) RETURN BuscBin3(a,prim,prim+nterc-1,x) (* 5 *) ELSIF x=a[ult-nterc] THEN RETURN TRUE (* 6 *) ELSIF x<a[ult-nterc] THEN (* 7 *) RETURN BuscBin3(a,prim+nterc+1,ult-nterc-1,x) (* 8 *) ELSE (* 9 *) RETURN BuscBin3(a,ult-nterc+1,ult,x) (* 10 *) END (* 11 *) END (* 12 *) END BuscBin3;
Para estudiar su complejidad calcularemos el número de operaciones elementales que se realizan: – En la línea (1) se ejecutan la comparación del IF (1 OE), y un acceso a un vector (1 OE), una comparación (1 OE) y un RETURN (1 OE) si la condición es verdadera. – En la línea (2) se realizan 4 OE (resta, suma, división y asignación). – En la línea (3) hay una suma (1 OE), un acceso a un vector (1 OE) y una comparación (1 OE), más 1 OE si la condición del IF es verdadera. – En la línea (4) se realiza una suma (1 OE), un acceso a un vector (1 OE) y una comparación (1 OE). – En la línea (5) se efectúan 2 operaciones aritméticas (2 OE), una llamada a la función BuscBin3 (lo que supone 1 OE), más lo que tarde en ejecutarse la función con un tercio de los elementos y un RETURN (1 OE). – Las líneas (6) y (7) suponen las mismas OE que las líneas (3) y (4). – Por último, las líneas (8) y (10) efectúan 6+T(n/3) y 4+T(n/3) cada una: 4 y 2 operaciones aritméticas respectivamente, una llamada a la función BuscBin3 (lo que supone 1 OE), más lo que tarde en ejecutarse la función con un tercio de los elementos y un RETURN (1 OE). Por tanto, en el peor caso obtenemos la ecuación T(n) = 23 + T(n/3), con la condición inicial T(1) = 4. Para resolverla, haciendo el cambio tk=T(3k) obtenemos tk – tk–1 = 23, ecuación no homogénea cuya ecuación característica es (x–1)2 = 0. Por tanto, tk = c1k +c2 y, deshaciendo el cambio, T(n) = c1log3n + c2.