Resolver una relación de recurrencia con √n como parámetro


18

Considera la recurrencia

T(n)=nT(n)+cn

para n>2 con alguna constante positiva c , y T(2)=1 .

Conozco el teorema del Maestro para resolver las recurrencias, pero no estoy seguro de cómo podríamos resolver esta relación usándola. ¿Cómo aborda el parámetro de raíz cuadrada?


55
El teorema maestro no es aplicable aquí; n no se puede escribir comonb . ¿Qué más has intentado?
Rafael

@Raphael: probé el método de sustitución, pero me quedé estancado en el valor que debería elegir sustituir.
buscador

1
¿Qué tal "desplegar la recurrencia varias veces, observar un patrón, adivinar la solución y probarlo "?
Rafael

Bueno, esta es la primera vez que me encuentro con este tipo, tal vez alguna ayuda aquí me ayudaría a resolver problemas futuros de la naturaleza con facilidad.
buscador

Como menciona el Teorema maestro, supongo que necesita resolver esta relación para los límites asintóticos, y realmente no necesita la expresión de forma cerrada. A continuación, se presentan algunas buenas soluciones para encontrar la expresión de forma cerrada, que también dan la complejidad asintótica. Sin embargo, si solo necesita la complejidad asintótica, el análisis es más simple. Eche un vistazo aquí para obtener una buena explicación sobre cómo encontrar complejidades asintóticas, con una buena solución intuitiva para la instancia de su problema.
Paresh

Respuestas:


9

Usaremos la sugerencia de Raphael y desarrollaremos la recurrencia. A continuación, todos los logaritmos son de base 2. Obtenemos

dondeβ(n)es cuántas veces tienes que sacar la raíz cuadrada para comenzar con n, y llegar a 2. Resulta queβ(n)=loglogn. ¿Cómo puedes ver eso? Considera: n

T(n)=n1/2T(n1/2)+cn=n3/4T(n1/4)+n1/2cn1/2+cn=n7/8T(n1/8)+n3/4cn1/4+2cn=n15/16T(n1/16)+n7/8cn1/8+3cn=n2T(2)+cnβ(n).
β(n)β(n)=loglogn Entonces, la cantidad de veces que necesitas sacar la raíz cuadrada para llegar a 2 es la solución a1
n=2lognn1/2=212lognn1/4=214logn
, que esloglogn. Entonces, la solución a la recursión escnloglogn+112tlogn1loglogn. Para hacer esto absolutamente riguroso, debemos usar el método de sustitución y tener mucho cuidado con la forma en que se redondean las cosas. Cuando tenga tiempo, intentaré agregar este cálculo a mi respuesta.cnloglogn+12n

"Tienes que tomar el raíz cuadrada n veces". ¿Es eso algo que se espera que un principiante vea? Además, su resultado no se ajusta al de Yuval; ¿Está destinado solo asintóticamente? loglogn
Raphael

@Raphael: Yuval cometió un error, que ahora está corregido. Explicaré la raíz cuadrada en mi respuesta.
Peter Shor

3
Otra idea para ver que la recursividad toma es la siguiente: Al sacar la raíz cuadrada de n, se reducen a la mitad los dígitos necesarios para la representación binaria de n . Por lo tanto, su entrada necesita w = log n bits y divide el tamaño de palabra por 2 para cada nivel de la recursión. Por lo tanto, se detiene después de log w = log log n pasos. O(loglogn)nnw=lognlogw=loglogn
A.Schulz el

10

En su comentario, mencionó que intentó la sustitución pero se atascó. Aquí hay una derivación que funciona. La motivación es que nos gustaría deshacernos de multiplicador en el lado derecho, dejándonos con algo que se parece aU(n)=U(n. En este caso, las cosas funcionan muy bien:U(n)=U(n)+something

T(n)=n T(n)+nso, dividing by n we getT(n)n=T(n)n+1and letting n=2m we haveT(2m)2m=T(2m/2)2m/2+1
Now let's simplify things even further, by changing to logs (since lgn=(1/2)lgn). Let
S(m)=T(2m)2mso our original recurrence becomesS(m)=S(m/2)+1
Aha! This is a well-known recurrence with solution
S(m)=Θ(lgm)
Returning to T(), we then have, with n=2m (and so m=lgn),
T(n)n=Θ(lglgn)
So T(n)=Θ(nlglgn).

6

If you write m=logn  you have T(m)=m2T(m2)+c2m .

Now you know the recursion tree has hight of order O(logm), and again it's not hard to see it's O(2m)  in each level, so total running time is in: O((logm)2m) , which concludes O(nloglogn)  for n.

In all when you see n or nab,a<b , is good to check logarithm.

P.S: Sure proof should include more details by I skipped them.


2

Let's follow Raphael's suggestion, for n=22k:

T(n)=T(22k)=22k1T(22k1)+c22k=22k1+2k2T(22k2)+c(22k+22k)==22k1+2k2++20T(220)+c(22k+22k++22k)=22k1+ck22k=(cloglogn+1/2)n.

Edit: Thanks Peter Shor for the correction!


How did you come up with 22k? Note for OP: "" is not a proof, you'll have to provide that still (usually by induction).
Raphael

@Raphael: It's nearly a proof. You just need to show that it's also correct for numbers not of the form 22k.
Peter Shor

Actually, the recurrence is only well-defined for numbers of the form 22k, since otherwise, at some point n wouldn't be an integer, and you'll never reach the base case T(2).
Yuval Filmus

1
If this recurrence actually came from an algorithm, it would probably really be something more like T(n)=nT(n)+cn.
Peter Shor

1

Unravel the recurrence once as follows:

T(n)=n T(n)+n=n1/2(n1/4 T(n1/4)+n1/2)+n=n11/4 T(n1/4)+2n.

Continuing the unraveling for k steps, we have that:

T(n)=n11/2kT(n1/2k)+kn.

These steps will continue until the base case of n1/2k=2. Solving for k we have:

n1/2k=2logn=2kk=loglogn.

Substituting k=loglogn into the unraveled recurrence, we have

T(n)=n2T(2)+nloglogn.

2
Could you rewrite your picture to MathJax? We discourage images with text as the answers.
Evil

1
@PKG it seems like your edit is slightly different and also you explain steps, maybe you could answer on your own.
Evil
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.