[Generico] complessità di un algoritmo

Messaggioda flavio<Integer> » 08/02/2017, 17:43

Salve ho un dubbio sul calcolo della complessita di questo algoritmo:

Codice:
if(v==NULL) return
if(v.left != NULL)
 AGGIUNGI-IN-TESTA(L,v.info)
 FUNZ-RIC(v.left,L)
if(v.right != NULL)
 AGGIUNGI-IN-CODA(L,v.info)
 FUNZ-RIC(v.right,L)


secondo me ha complessita $ Theta (n) $ perchè AGGIUNGI-IN-TESTA ha complessità $ Theta (1) $ e AGGIUNGI-IN-CODA ha complessità $ Theta (n) $ .
Però non sono molto sicuro che sia in ragionamento giusto. Potreste gentilmente aiutarmi?

Grazie in anticipo.
flavio<Integer>
Junior Member
Junior Member
 
Messaggio: 61 di 168
Iscritto il: 22/04/2016, 10:49

Re: [Generico] complessità di un algoritmo

Messaggioda apatriarca » 08/02/2017, 19:31

Cos'è FUNZ-RIC? Il codice che hai postato?
apatriarca
Moderatore
Moderatore
 
Messaggio: 4530 di 10436
Iscritto il: 08/12/2008, 20:37
Località: Madrid

Re: [Generico] complessità di un algoritmo

Messaggioda flavio<Integer> » 08/02/2017, 19:35

è uno pseudocodice. Questo è un esercizio in cui va calcolata la complessità di un codice dato in questo modo, quindi FUNZ-RIC non ha un vero e proprio significato ma sta ad indicare che si tratta di una funzione ricorsiva.
flavio<Integer>
Junior Member
Junior Member
 
Messaggio: 62 di 168
Iscritto il: 22/04/2016, 10:49

Re: [Generico] complessità di un algoritmo

Messaggioda apatriarca » 08/02/2017, 21:42

Che sia pseudocodice è chiaro. Tuttavia credo che sarebbe stato più corretto scriverlo come una funzione se il codice viene richiamato in modo ricorsivo. Suppongo insomma che il codice sia equivalente a questo codice python:
Codice:
def funz_ric(v, lst):
    if v: return
    if v.left:
        lst.insert(v.info, 0)
        funz_ric(v.left, lst)
    if v.right:
        lst.append(v.info)
        funz_ric(v.right, lst)

Dal tuo tentativo di soluzione posso in realtà dedurre che L è una lista concatenata (quella che ho usato nel codice è implementata diversamente ma era solo per capirsi). Siccome la funzione è ricorsiva la complessità andrà calcolata scrivendo la corrispondente equazione di ricorrenza. E' corretta questa interpretazione? Oppure si deve considerare la funzione ricorsiva come una funzione di complessità conosciuta?
apatriarca
Moderatore
Moderatore
 
Messaggio: 4531 di 10436
Iscritto il: 08/12/2008, 20:37
Località: Madrid

Re: [Generico] complessità di un algoritmo

Messaggioda flavio<Integer> » 08/02/2017, 23:24

grazie per la tua risposta e mi scuso perchè in effetti sono stato poco chiaro nel porgere la domanda.Il testo completo dell' esercizio è questo:

Discuti la complessità computazionale della seguente procedura nel caso peggiore fornendo O‐grande,
Omega e Theta in funzione del numero n di elementi dell’albero.
Codice:
FUNZIONE(T) /* T è un albero binario di interi */
    L.head = NULL /* L è una nuova lista (vuota) di interi */
    FUNZ-RIC(T.root,L)
    return L

FUNZ-RIC(v,L)
    if(v==NULL) return
    if(v.left != NULL)
        AGGIUNGI-IN-TESTA(L,v.info)
        FUNZ-RIC(v.left,L)
    if(v.right != NULL)
        AGGIUNGI-IN-CODA(L,v.info)
        FUNZ-RIC(v.right,L)


Supponi che AGGIUNGI‐IN‐TESTA abbia complessità Theta(1) e AGGIUNGI‐IN‐CODA abbia complessità
Theta(x) dove x è la lunghezza della lista

e l'esercizio andrebbe risolto senza usare equazioni di ricorrenza.

Grazie ancora
flavio<Integer>
Junior Member
Junior Member
 
Messaggio: 63 di 168
Iscritto il: 22/04/2016, 10:49

Re: [Generico] complessità di un algoritmo

Messaggioda apatriarca » 09/02/2017, 20:58

Il caso peggiore si ha quando l'albero è semplicemente una lista connessa tramite i puntatori a sinistra. In questo caso viene eseguito AGGIUNGI-IN-TESTA per ogni nodo dell'albero e la complessità è quindi lineare.

Il caso peggiore è invece quando si sceglie sempre il lato destro. In questo caso abbiamo che la complessità è uguale alla somma delle complessità di AGGIUNGI-IN-CODA dove la lista ha dimensione uguale al numero di nodi visitato fino a questo punto. Si tratta quindi del numero triangolare che ha complessità quadratica.

La complessità media è molto più complicata da calcolare ma in questo caso non è necessario. E' chiaro?
apatriarca
Moderatore
Moderatore
 
Messaggio: 4533 di 10436
Iscritto il: 08/12/2008, 20:37
Località: Madrid

Re: [Generico] complessità di un algoritmo

Messaggioda flavio<Integer> » 14/02/2017, 22:09

Sei stato chiarissimo. Grazie mille!
flavio<Integer>
Junior Member
Junior Member
 
Messaggio: 64 di 168
Iscritto il: 22/04/2016, 10:49


Torna a Informatica

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite