2 minute read

3.10 Repetición de cálculos en Fibonacci

110 TÉCNICAS DE DISEÑO DE ALGORITMOS

ecuación no homogénea con ecuación característica (x–1)2 = 0. Por tanto, tk = c1k + c2

Advertisement

y, deshaciendo el cambio:

T(n) = c1log3/2n + c2. Para calcular las constantes, nos basaremos en la condición inicial T(1) = 4, junto con el valor de T(2), que puede ser calculado apoyándonos en la expresión de la ecuación en recurrencia, es decir, T(2) = 11 + 4 = 15. De esta forma obtenemos que:

T(n) = 11log3/2n + 4 ∈Θ(logn). A pesar de ser del mismo orden de complejidad que la búsqueda binaria clásica, como 3/2 < 2 se tiene que log3/2n > logn, es decir, este algoritmo es más lento en el caso peor que el algoritmo original presentado en el problema 1.16 del primer capítulo. Este hecho puede ser generalizado fácilmente para demostrar que, dividiendo el vector en dos partes de tamaños k y n–k, el tiempo de ejecución del algoritmo resultante en el peor caso es:

Tk(n) = 11logn/max{k,n–k}n + 4 ∈Θ(logn). Ahora bien, para 1 ≤ k < n sabemos que la función n/max{k,n–k} se mantiene por debajo de 2, y sólo alcanza este valor para k = n/2, por lo que

logn/max{k,n–k}n ≥ logn para todo k entre 1 y n. Esto nos indica que la mejor forma de partir el vector para realizar la búsqueda binaria es por la mitad, es decir, tratando de equilibrar los subproblemas en los que realizamos la división tal como comentábamos en la introducción de este capítulo.

3.4 BÚSQUEDA TERNARIA Podemos plantearnos también diseñar un algoritmo de búsqueda “ternaria”, que primero compara con el elemento en posición n/3 del vector, si éste es menor que el elemento x a buscar entonces compara con el elemento en posición 2n/3, y si no coincide con x busca recursivamente en el correspondiente subvector de tamaño 1/3 del original. ¿Conseguimos así un algoritmo mejor que el de búsqueda binaria?

Solución (☺) Podemos implementar el algoritmo pedido, también de simplificación, de una forma similar a la anterior. La única diferencia es la interpretación de la variable nterc, que no indica una posición dentro del vector (como le ocurría a la variable tercio del ejercicio previo), sino el número de elementos a tratar (n/3). Es por eso por lo que se lo sumamos y restamos a los valores de prim y ult para obtener las posiciones adecuadas. El algoritmo resultante es:

This article is from: