[Algoritmi]Ricorrenza Metodo Di Sostituzione

oxidojack
ciao a tutti
mi sto preparando per l'esame di algoritmi e
non riesco a capire come risolvere le ricorrenze con il metodo di sostituzione..
per esempio mi potete spiegare senza saltare i passi queste ricorrenza?

T(n) = 2T([N/2]) + N

Grazie mille

Risposte
hamming_burst
Ciao,
vedi un po' qusta discussione, si parla del metodo di sostituzione (o per tentativi).

La parte intera di $n/2$ è floor o ceil? Comunque prova ad applicare ciò che è scritto con tipo $O(nlogn)$, se avrai problemi posta pure i tuoi dubbi.

oxidojack
grazie mille per la risposta... ;-)
ho letto un po di cose e ho capito che mi sa ho qualche lacuna in matematica..
bisogna dimostrare che T(n) <= cn lg n
supponendo che il limite sia valido per n/2 quindi

T(n/2) <= c[n/2] lg[n/2] quindi facendo la sostituzione

T(n) <= 2(c[n/2] lg([n/2])) + n

adesso come si prosegue?

hamming_burst
Ciao,
ok tieni conto che è una dimostrazione per induzione un po' particolare, se non ricordi quella generale vedi queso sunto (scritto da apatriarca).

cmq non mi hai risposto: la parte intera è $\lfloor n/2 \rfloor$ (floor) oppure \(\lceil \frac n 2 \rceil\) (ceil)? cambia la dimostrazione se è un caso o l'altro...

oxidojack
è floor

hamming_burst
vediamo allora...
"oxidojack":

bisogna dimostrare che T(n) <= cn lg n
supponendo che il limite sia valido per n/2 quindi

T(n/2) <= c[n/2] lg[n/2] quindi facendo la sostituzione

T(n) <= 2(c[n/2] lg([n/2])) + n

adesso come si prosegue?

aggiungendo le formule:

\[T(n) \leq 2c \lfloor \frac{n}2 \rfloor log_2(\lfloor\frac{n}2 \rfloor) + n\]
\[\leq 2c \frac{n}2 log_2(\frac{n}2) + n\] per \(\lfloor \frac{n}2 \rfloor \leq \frac{n}2 < \lfloor \frac{n}2 \rfloor +1\)
\[= cn(log_2(n) - 1) + n = cnlog_2(n) - cn + n \leq cnlog_2(n) \rightarrow c\geq1\]

manca il caso base ed hai dimostrato che $T(n) in O(nlog_2(n))$, semplice :)

PS: sai di che famoso algoritmo è la funzione di ricorrenza?

edit:
corretto errore.

Giova411
"hamming_burst":

manca il caso base ed hai dimostrato che $T(n) in O(nlog_2(n))$, semplice :)
PS: sai di che famoso algoritmo è la funzione di ricorrenza?


E' il MergeSort?
O(1) se n = 1 è il caso base?

Oddio queste ricorrenze sono acidelle..... :smt012

hamming_burst
"Giova411":
[quote="hamming_burst"]
manca il caso base ed hai dimostrato che $T(n) in O(nlog_2(n))$, semplice :)
PS: sai di che famoso algoritmo è la funzione di ricorrenza?


E' il MergeSort?
[/quote]
sembra che intendessi quello. Ma in realtà solo la ricorrenza generale $T(n)=2T(n2)+n$ è più simile a quella reale del Margesort che è $T(n)=T(⌊n2⌋)+T(⌈n2⌉)+Θ(n)$.

o forse intendevo altro, non ricordo...

$O(1)$ se $n = 1$ è il caso base?

dipende. Se intendi un valore generico fissato nella definizione della ricorrenza, per valori piccoli di n, allora sì.
Se intedi il caso base della dimostrazione induttiva sopra riporta, allora...prova a finire la dimostrazione e vedrai il giochetto. :)

Oddio queste ricorrenze sono acidelle..... :smt012

solo in parte, una volta che hai fatto qualche esercizio vedrai ad occhio dove stanno i problemi.

Giova411
Ti ringrazio tantissimo!!

Giova411
"hamming_burst":

Se intedi il caso base della dimostrazione induttiva sopra riporta, allora...prova a finire la dimostrazione e vedrai il giochetto. :)

HamminG altro che giochetto...
Dici di finire per bene matematicamente?
T(1)? e T(0)?

[Perdona la lentezza, pensavo d'aver capito in un primo momento...]

Giova411
Avevo provato a ragionare:
\( T(n) = 2T(\frac{n}{2}) + n \)
\( T(n) = 4T(\frac{n}{4}) + 2n \)
\( T(n) = 8T(\frac{n}{8}) + 3n \)

Non so che fare poi.
Se \( n = 0\) ho \( T(0) = 0 \)
mi pare di andare a caso... :( Ma sto mischiando le cose sicuro...
Forse basta vedere cosa succede per \( c = 0 \) visto che avevi trovato cosa succede per \( c>1 \)

hamming_burst
aspetta, non capisco che stai facendo.

Vuoi dimostrare ed utilizzare cosa?
Io ti avevo proposto di finire la dimostrazione della ricorrenza dell'OP, cioè: $2T(\lfloor n/2 \rfloor) + n$, in questo caso abbiamo (ho) dimostrato che è $O(nlog_2(n))$, manca solo il caso base che è un pochetto più difficile del solito; è lì il "giochetto".

se vuoi calcolare altro, cioè la ricorrenza $2T(n/2) + n$ con il metodo iterativo, basta dirlo e vediamo.

Giova411
Hihihi Mo mi mandi a quel paese e ti darei ragione!!

Sì ok sono due metodi diversi e non sono riuscito ad arrivare a nulla...
Studiando la teoria mi perdo, credimi!

Metodo per sostituzione manca "il giochetto" che non :smt012
Metodo per iterazione lo sto iniziando a capire da oggi... (forse :-D )

Giova411
Aiutoooooo :partyman:

L'induzione su n forse da più casi base, non solo uno...
Io non ce la faccio a dire che questo esercizio è concluso in modo esaustivo...
Non lo capisco il giochetto, posso starci ore ed ore..

Giova411
Metto dove mi ero "buttato"...

Con n=1 T(1) non è inferiore a cio' che vogliamo.

Con n=2 T(2) rispetta la proprietà con un c >= 2

Poi cosa bisogna fare? :smt011

Giova411
Il giochetto forse l'ho capito...
Così per dire di concludere il forum in oggetto.


Cioé che possiamo scegliere il caso base che vogliamo.
n=2, n=3 etc etc

Spero che qualcuno confermi :wink:

hamming_burst
"Giova411":
Il giochetto forse l'ho capito...

Cioé che possiamo scegliere il caso base che vogliamo.
n=2, n=3 etc etc
:

esatto.

continuando con la dimostrazione, abbiamo fatto il passo induttivo per $T(n) = 2T(\lfloor n/2 \rfloor) + n$
Manca il passo base.

\[\displaystyle{T(n) = 1 \nleq c * 1 \log_2(1) = 0}\]

che è quindi falso. Il giochetto, come hai compreso, sta nel dedurre e capire che siamo in notazione asintotica e possiamo spostare e scegliere il valore inziale $n$, e di validità della ricorrenza, a piacere (ovviamente, con cognizione di causa).

Dunque, avanti:

$T(2) = 2T(\lfloor 1 \rfloor) + 2 = 4 \leq c*2\log_2(2) -> c >= 2$
$T(3) = 2T(\lfloor 1 \rfloor) + 3 = 5 \leq c*3\log_2(3) -> c > 1.051$
$T(4) = 2T(\lfloor 2 \rfloor) + 4$

con l'ultima ricorrenza possiamo utilizzare la definizione della ricorrenza per $n>1$, ridefinendo il tutto secondo la dimostrazione.

::::::::::::::::::::::::::::::::::::::::::::::::::::::

Per $2T(n/2) + n$ con metodo iterativo:
"Giova411":
Avevo provato a ragionare:
\( T(n) = 2T(\frac{n}{2}) + n \)
\( T(n) = 4T(\frac{n}{4}) + 2n \)
\( T(n) = 8T(\frac{n}{8}) + 3n \)

Non so che fare poi.
Se \( n = 0 \) ho \( T(0) = 0 \)
mi pare di andare a caso... :( Ma sto mischiando le cose sicuro...
Forse basta vedere cosa succede per \( c = 0 \) visto che avevi trovato cosa succede per \( c>1 \)

stai mischiando le metodologie.

Il metodo con sostituzione prevede di ipotizzare una classe di complessità e dimostrare per induzione sulla ricorrenza.
Il metodo iterativo (il metodo ad albero, et all) prevede di calcolare algebricamente (e simili) una complessità (un ordine di grandezza) ed in secondo piano utilizzare l'induzione per certificarne l'appartenenza. L'utilizzo dei casi base avviene solo se parti a calcolare la ricorrenza da $T(0)$ e non da $T(n)$, diciamo visione bottom up e top down; io preferisco la seconda.

$T(n) = 2T(n/2) + n = 2(2T(n/2^2) + n/2) + n = 2(2(2T(n/2^3) + n/2^2) + n/2) + n =$
$... = 2^mT(n/2^m) + sum_{k=0}^{m-1} 2^kn/2^k = ... =$
$... = 2^mT(1) + n*m = 2^m*c + n*m$ con $T(1) \in O(1)$ che è costante $c$.

mi segui? ho lasciato qualche passaggio per ovvietà. Ne manca ancora uno per arrivare alla classe di complessità, è una sostituzione. Se immagini la ricorrenza come una serie di passaggi e ramificazioni, ed altresì al Marge sort ed alla sua rappresentazione astratta capirai di cosa parlo.

se hai domande basta scriverle.

Giova411
Mastodontico!!!
Tutto chiarissimo!!!

Giova411
"hamming_burst":
...siamo in notazione asintotica e possiamo spostare e scegliere il valore inziale $n$, e di validità della ricorrenza, a piacere.

E' questa la cosa che sto digerendo piano piano...

:smt023


grazie mille!
giovanni

Giova411
"hamming_burst":
se hai domande basta scriverle.

Sì HB ho domande... :lol:
Più vado avanti, purtroppo molto lentamente, e... più vado indietro!!!
In un primo momento, quando esultavo impulsivamente, capivo di dover sostituire semplicemente \[ m= log_2n \]
Ecco che ho chiuso contento etc etc ma anche perché forzavo la mano ad occhi chiusi sapendo di dover arrivare ad $ n * log_2n $ In questo caso sarebbe stato $n + n * log_2n $ e tralascio il primo $n$ insignificante.
Tutto cio' perché avevo intravisto che si potevano semplificare i due $ 2^k $ nella sommatoria.
Poi però mi è presa una certa insicurezza: ho finito qui?
E riguardando indietro mi son pure fatto una domanda idiota
"hamming_burst":

\[...\rightarrow c>1\]
Poteva anche essere $ c>=1$ ?

hamming_burst
"Giova411":
In questo caso sarebbe stato $n + n * log_2n $ e tralascio il primo $n$ insignificante.
Tutto cio' perché avevo intravisto che si potevano semplificare i due $ 2^k $ nella sommatoria.

ok.
chiarificando: devi valutare la ricorrenza in $T(1)$, astrattamente vedere quanti "passi" o livelli ha la ricorrenza per arrivare al caso base cioè a $T(1)$.

sottolineo che si usa la proprietà algebrica: $a^{\log_b(n)} = n^{\log_b(a)}$

$n/2^m = 1$ con $m=\log_2(n)$ perchè: $n/2^{\log_2(n)} = n/n = 1$

quindi $2^m T(1) + sum_{k=0}^{m-1}n = 2^{\log_2(n)} + sum_{k=1}^{\log_2(n)}n = n + n*log_2(n) \in O(n*log_2(n))$


"Giova411":
E riguardando indietro mi son pure fatto una domanda idiota [quote="hamming_burst"]
\[...\rightarrow c>1\]
Poteva anche essere $ c>=1$ ?[/quote]
certo, direi che hai ragione. correggo, grazie.

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.