funzioni built-in
Il metodo count
in Python
A = [3, 5, 6, 5, 5, 1]
A.count(5)
Cosa c’è dentro il metodo count
?
def count(self, A):
c = 0
for i in self:
if i == x:
c += 1
return c
Osserviamo che il numero di cicli del loop for
è pari al numero di elementi nella lista analizzata; quindi count
ha una complessità temporale di , cioè impiega un tempo costante.
L’operatore in
in Python
Trattando l’operatore in
come se fosse una funzione
def in(A, x):
for i in A:
if i == x:
return True
return False
- Nel peggiore dei casi (l’elemento da trovare è all’ultima posizione), il programma sarà in ;
- Nel migliore dei casi (l’elemento da trovare è alla prima posizione), il programma sarà in ;
- Dato che si potrebbero verificare entrambi i casi o l’intero spettro di quelli intermedi, non esiste una funzione asintoticamente uguale al programma , quindi non esiste. (Sarebbe interessante vedere il caso medio per stimare probabilisticamente, ma si può capire sperimentalmente che il caso medio coincide circa con il caso pessimo ).
List.copy()
B = A.copy()
costa perché gli elementi vanno copiati uno per uno.
List = list(Str)
B = list(A)
costa perché gli elementi della nuova lista vengono creati prelevando i caratteri uno per uno. La funzione inversaA = ''.join(B)
costa per lo stesso motivo.
stringhe
N.B.: Ogni operazione sulle stringhe dipende dalle loro lunghezze , dato che il processore opera sulle stringhe in modo sequenziale, carattere per carattere.
N.B.: Piuttosto che fare operazioni (tutte di complessità lineare) sulle stringhe, conviene convertirle in liste, perché hanno complessità per le operazioni sul singolo elemento.
slicing
Il costo dell’istruzione
A[a:b]
dipende dal numero di elementi nella slice. Ogni elemento deve essere copiato dalla lista originale alla nuova lista, quindi il costo computazionale è proporzionale alla dimensione dell’output. La complessità temporale è di .
concatenazione
La complessità temporale della concatenazione di più stringhe dipende dalla dimensione delle stringhe: .