J'ai vu cette page https://wiki.python.org/moin/TimeComplexity mais je ne vois pas la fonction reverse()
là-dedans pour les listes. Quelle est la complexité temps-temps des reverse()
de list
?
Mes expériences avec le temps indiquent qu'il s'agit de O(n)
pour les grandes tailles. Quelqu'un peut-il le confirmer?
timeit Temps pour inverser une liste de taille
10 .1027
100 .2347
1000 .6704
10000 6.204
20000 12.9
Oui, vous avez raison, c'est O(n) où n - longueur de la liste. Regardez ici pour plus d'informations: https://www.ics.uci.edu/ ~ pattis/ICS-33/lectures/complexitépython.txt
Si vous regardez dans l'implémentation de la méthode reverse
ici , alors cela ressemble à ceci:
static PyObject *
listreverse(PyListObject *self)
{
if (Py_SIZE(self) > 1)
reverse_slice(self->ob_item, self->ob_item + Py_SIZE(self));
Py_RETURN_NONE;
}
Ainsi, l'opération est en fait déléguée à reverse_slice
. Ensuite, examinons-le:
static void
reverse_slice(PyObject **lo, PyObject **hi)
{
assert(lo && hi);
--hi;
while (lo < hi) {
PyObject *t = *lo;
*lo = *hi;
*hi = t;
++lo;
--hi;
}
}
Voici donc 2 indices initialement définis en début et en fin de liste. Ensuite, à chaque itération de la boucle while
, les éléments des indices respectifs sont échangés:
PyObject *t = *lo;
*lo = *hi;
*hi = t;
Et puis l'index de gauche est incrémenté et celui de droite décrémenté:
++lo;
--hi;
La boucle continue tant que l'index droit dépasse celui de gauche. Donc, s'il y a n
éléments dans la liste, alors il y aura n/2
Itérations et donc la complexité temporelle est O(n)
Si vous voyez, l'algorithme est facile à voir que la complexité temporelle de l'inverse est O(n)
( complexité temporelle linéaire ) où n est le numéro de l'élément dans la liste.