Risolvere una relazione di ricorrenza con √n come parametro


18

Considera la ricorrenza

T(n)=nT(n)+cn

per con qualche costante positiva e .c T ( 2 ) = 1n>2cT(2)=1

Conosco il teorema del Maestro per risolvere le ricorrenze, ma non sono sicuro di come potremmo risolvere questa relazione utilizzandola. Come approcci il parametro radice quadrata?


5
Il teorema del Maestro non è applicabile qui; n non può essere scritto comenb . Cos'altro hai provato?
Raffaello

@Raphael: ho provato il metodo di sostituzione, ma mi sono bloccato su quale valore avrei dovuto scegliere di sostituire.
cercatore

1
Che ne dici di "spiegare alcune volte la ricorrenza, osservare uno schema, indovinare la soluzione e dimostrarla "?
Raffaello

Bene, questo è un primo incontro di questo tipo, forse un po 'di aiuto qui mi aiuterebbe a risolvere facilmente i problemi futuri della natura.
cercatore

Dato che menzioni il Teorema del Maestro, presumo che tu debba risolvere questa relazione per limiti asintotici e non hai davvero bisogno dell'espressione in forma chiusa. Di seguito, ci sono alcune buone soluzioni per trovare l'espressione in forma chiusa, che danno anche la complessità asintotica. Tuttavia, se hai solo bisogno della complessità asintotica, l'analisi è più semplice. Dai un'occhiata qui per una buona spiegazione sulla ricerca di complessità asintotiche, con una bella soluzione intuitiva per l'istanza del tuo problema.
Paresh,

Risposte:


9

Useremo il suggerimento di Raffaello e spiegheremo la ricorrenza. Di seguito, tutti i logaritmi sono di base 2. Otteniamo

doveβ(n)è quante volte devi prendere la radice quadrata per iniziare con n e raggiungere 2. Si scopre cheβ(n)=loglogn. Come puoi vederlo? 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 Quindi il numero di volte che devi prendere la radice quadrata per raggiungere 2 è la soluzione a1
n=2lognn1/2=212lognn1/4=214logn
, che èloglogn. Quindi la soluzione per la ricorsione ècnloglogn+112tlogn1loglogn. Per renderlo assolutamente rigoroso, dovremmo usare il metodo di sostituzione ed essere molto attenti a come le cose vengono arrotondate. Quando avrò tempo, proverò ad aggiungere questo calcolo alla mia risposta.cnloglogn+12n

"Devi prendere il radice quadrata n volte" - ci si può aspettare che un principiante veda? Inoltre, il risultato non corrisponde a quello di Yuval; è inteso solo asintoticamente? loglogn
Raffaello

@Raphael: Yuval ha commesso un errore, che ora è stato corretto. Spiegherò la radice quadrata nella mia risposta.
Peter Shor,

3
Un'altra idea per vedere che la ricorsione prende è la seguente: Prendendo la radice quadrata di n dimezzate le cifre necessarie per la rappresentazione binaria di n . Quindi il tuo input ha bisogno di w = log n bit e dividi la dimensione della parola per 2 per ogni livello della ricorsione. Quindi ti fermi dopo il log w = log log n passaggi. O(loglogn)nnw=lognlogw=loglogn
A.Schulz,

10

Nel tuo commento hai detto che hai provato a sostituire ma sei rimasto bloccato. Ecco una derivazione che funziona. La motivazione è che vorremmo sbarazzarci di moltiplicatore sul lato destro, lasciandoci con qualcosa che assomiglia aU(n)=U(n. In questo caso, le cose funzionano molto bene: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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.