[Algoritmi] calcolo tempo esecuzione funzione mediante ricorrenza (metodo iterativo)

jigen45
Buonasera ragazzi, volevo calcolare il tempo di esecuzione della seguente funzione mediante metodo iterativo

fun (intero n) {
    i=0;
    for a=1 to n do
        for b=1 to a do
            i++; 
    if n<2 then return i;
    else return 2*fun(n/4);
}


Allora ho impostato la seguente ricorrenza:
$ T(n)={ ( Theta(an)),( Theta(an) + 2T(n/4)):} $
Il primo rappresenta il caso base ($ n < 2 $), quindi lo ignoro e assumiamo $ Theta(1) $; maggioro $Theta(an)$ con $Theta(n^2)$ dunque la ricorrenza da risolvere è $Theta(n^2)+2T(n/4)$
$ n^2+2T(n/4) = $
a questo punto non so se la ricorrenza diventa
$ =n^2 + 2(n^2/4 +2T(n/16)) $
oppure
$ =n^2 + 2((n/4) +2T(n/16)) $
Inoltre, come faccio a sapere per quanto tempo devo svilupparla? O c'è un modo per evitare lunghi calcoli? Per il resto, ho fatto bene o c'è qualcosa di sbagliato? Grazie in anticipo :-D

Risposte
hamming_burst
"jigen45":
Buonasera ragazzi, volevo calcolare il tempo di esecuzione della seguente funzione mediante metodo iterativo

    for a=1 to n do
        for b=1 to a do
            i++; 
 }


Allora ho impostato la seguente ricorrenza:
$ T(n)={ ( Theta(an)),( Theta(an) + 2T(n/4)):} $

analizza bene.
Perchè ritieni che il doppio ciclo for sia a costo lineare?

a=1
b=1 to 1

a=2
b=1 to 2

a=3
b=1 to 3
...
a= n
b=1 to n

cioè il secondo ciclo itera da $1$ ad $n$ volte, cioè $1 + 2 + 3 + ... + n = \sum_{b=1}^n b = {n(n+1)}/2$
il primo ciclo è iterato $n$ volte quindi $n*\sum_{b=1}^n b = n*{n(n+1)}/2 = n^3/2+n^2/2$

a te riformalizzare il tutto.

EDIT:
è sbagliato il calcolo, non è da moltiplicare per $n$.

jigen45
ma infatti ho scritto $ Theta(an) $ non è lineare, però dici tu dovevo scrivere $ Theta(n^2) $ . Mi pare in seguito ho fatto questa considerazione..

Giova411
"jigen45":
ma infatti ho scritto $ Theta(an) $ non è lineare

Se scrivi così è errato poiché viene considerato lineare.

vict85
Perché \(\displaystyle T(n) = \Theta(n^2) + 2T(n/4) \)? A me non sembra che chiami \(\displaystyle T(n/4) \) due volte, ma semplicemente moltiplica tale valore per \(\displaystyle 2 \). Insomma stai solo aggiungendo una operazione, che puoi ignorare.

Quindi hai \(\displaystyle T(n) = \Theta(n^2) + T(n/4) \).

jigen45
"Giova411":
[quote="jigen45"]ma infatti ho scritto $ Theta(an) $ non è lineare

Se scrivi così è errato poiché viene considerato lineare.[/quote]
sì è vero, me ne sono reso conto subito dopo che ti avevo risposto.

jigen45
"vict85":
Perché \(\displaystyle T(n) = \Theta(n^2) + 2T(n/4) \)? A me non sembra che chiami \(\displaystyle T(n/4) \) due volte, ma semplicemente moltiplica tale valore per \(\displaystyle 2 \). Insomma stai solo aggiungendo una operazione, che puoi ignorare.

Quindi hai \(\displaystyle T(n) = \Theta(n^2) + T(n/4) \).

Insomma quel $ 2 $ non lo considero in quanto costante?

ot: ma quanto ne sai, sei una "spada" anche in teoria dei numeri ed algebra lineare! (le altre sezioni non le ho viste, forse dimentico qualcosa) :D

jigen45
mi rimane però il problema iniziale: non so quale delle due ricorrenze è giusta e non so fino a quando devo continuare a sviluppare la ricorrenza..

vict85
[ot]
"jigen45":
ot: ma quanto ne sai, sei una "spada" anche in teoria dei numeri ed algebra lineare! (le altre sezioni non le ho viste, forse dimentico qualcosa) :D
Grazie ma di teoria dei numeri ne so ben poco. Ho fatto corsi in ogni ambito della matematica quindi so qualcosa di tutto. Riguardo all'informatica programmo in modo dilettantistico da più di 10 anni.[/ot]

Se contiamo le sole somme e moltiplicazioni (escludendo quelle di supporto per il ciclo) abbiamo \(\displaystyle \sum_{\alpha=1}^n \alpha = \frac{n(n+1)}{2} \) per il ciclo e \(\displaystyle 1 \) moltiplicazione quando \(\displaystyle n\neq \{0, 1\} \). Nota che per via del modo in cui gli interi si dividono dovresti scrivere \(\displaystyle T(n) = \Theta(n^2) + T\bigl(\lfloor n/4 \rfloor\bigr) \) pertanto il comportamento di \(\displaystyle T \) dipenderà dalla scrittura di \(\displaystyle n \) come somma di potenze di \(\displaystyle 4 \). In questo senso la formula generale non è semplicissima. Per semplificare ad una prima analisi puoi soffermarti a \(\displaystyle n = 4^m \).

In questo caso hai che \(\displaystyle T(4^m) = \frac{4^{2m}}{2} + \frac{4^{m}}{2} + 1 + T(4^{m-1}) \). Perciò ha che \(\displaystyle T(4^m) = \frac12\sum_{\alpha=0}^m \bigl(4^2\bigr)^{\alpha} + \frac12\sum_{\alpha=0}^m 4^{\alpha} + m - 2 \) che sono la somma di due progressioni geometriche. Sperando di non aver sbagliato i calcoli. Ricordati poi di riportare il tutto con \(\displaystyle n = 4^m \).

jigen45
"vict85":
[ot][quote="jigen45"]ot: ma quanto ne sai, sei una "spada" anche in teoria dei numeri ed algebra lineare! (le altre sezioni non le ho viste, forse dimentico qualcosa) :D
Grazie ma di teoria dei numeri ne so ben poco. Ho fatto corsi in ogni ambito della matematica quindi so qualcosa di tutto. Riguardo all'informatica programmo in modo dilettantistico da più di 10 anni.[/ot][/quote]

complimenti :D

"vict85":

Se contiamo le sole somme e moltiplicazioni (escludendo quelle di supporto per il ciclo) abbiamo \(\displaystyle \sum_{\alpha=1}^n \alpha = \frac{n(n+1)}{2} \) per il ciclo e \(\displaystyle 1 \) moltiplicazione quando \(\displaystyle n\neq \{0, 1\} \). Nota che per via del modo in cui gli interi si dividono dovresti scrivere \(\displaystyle T(n) = \Theta(n^2) + T\bigl(\lfloor n/4 \rfloor\bigr) \) pertanto il comportamento di \(\displaystyle T \) dipenderà dalla scrittura di \(\displaystyle n \) come somma di potenze di \(\displaystyle 4 \). In questo senso la formula generale non è semplicissima. Per semplificare ad una prima analisi puoi soffermarti a \(\displaystyle n = 4^m \).

In questo caso hai che \(\displaystyle T(4^m) = \frac{4^{2m}}{2} + \frac{4^{m}}{2} + 1 + T(4^{m-1}) \). Perciò ha che \(\displaystyle T(4^m) = \frac12\sum_{\alpha=0}^m \bigl(4^2\bigr)^{\alpha} + \frac12\sum_{\alpha=0}^m 4^{\alpha} + m - 2 \) che sono la somma di due progressioni geometriche. Sperando di non aver sbagliato i calcoli. Ricordati poi di riportare il tutto con \(\displaystyle n = 4^m \).


ok grazie mille :wink:

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