Ciao a tutti, ho difficoltà a capire come si arriva a determinare la complessità temporale di questo algoritmo (è scritto in Python, ma andrebbe bene qualsiasi linguaggio):
Questa procedura prende in input una sequenza e restituisce come risultato una sequenza di sequenze contenente l'insieme di tutte le possibili permutazioni della sequenza di partenza.codice:def permutazioni(list): n = len(list) if n == 1 or n == 0: return [list] else: risult = [] for i in range(n): primo = list[i] listaDegliAltri = list[:i] + list[i + 1:] perms = permutazioni(listaDegliAltri) for perm in perms: risult.append([primo] + perm) return risult
Esempio: permutazioni([a, b, c]) = [ [a, b, c], [a, c, b], [b, a, c], [b, c, a], [c, a, b], [c, b, a] ]
Ora, per determinare la complessità, devo scrivere e risolvere l'equazione di ricorrenza.
Quando la lista è lunga 0 o 1, non si effettuano operazioni.
Altrimenti, si esegue un ciclo di n iterazioni in cui ad ogni iterazione la funzione viene richiamata su una lista con un elemento in meno (n-1) e poi si esegue un for interno lungo n-1.
Il professore quindi ha scritto:
T(0) = T(1) = 1 (Perchè 1? E' il costo del return o di altro?)
T(n) = n(T(n-1) + (n-1)) per n > 1
Poi dice che sceglie la delimitazione inferiore e quindi scrive: (da qui in poi non ho capito più nulla)
T(n) > n*T(n-1)
da cui:
T(n) > n*T(n-1) > n*(n-1)*T(n-2) > n*(n-1)*(n-2)*T(n-3) > ... > n!
Cioè:
T(n) = Ω(n!)
Non ho capito perchè ha eliminato l'(n-1) e perchè ha messo il maggiore invece dell'uguale. Insomma non ho capito nulla.
Qualcuno saprebbe spiegarmelo?
Grazie