web-dev-qa-db-fra.com

Quelle est la complexité temporelle de Python List Reverse?

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
18
Fairly Nerdy

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

20
Serenity

Si vous regardez dans l'implémentation de la méthode reverseici , 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)

6
Anatolii

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.

0
zig razor