web-dev-qa-db-fra.com

Big-O de la tranche de liste

Disons que j'ai quelques Python, my_list qui contient N éléments. Les éléments individuels peuvent être indexés en utilisant my_list[i_1], où i_1 est l'indice de l'élément souhaité. Cependant, Python peuvent également être indexées my_list[i_1:i_2] où une "tranche" de la liste de i_1 à i_2 est désiré. Quelle est la notation Big-O (pire cas) pour découper une liste de taille N?

Personnellement, si je codais le "slicer", je répéterais de i_1 à i_2, générer une nouvelle liste et la renvoyer, impliquant O (N), est-ce ainsi Python fait-il?

Merci,

31
mjgpy3

Obtenir une tranche est O (i_2 - i_1). En effet, la représentation interne d'une liste par Python est un tableau, vous pouvez donc commencer à i_1 et itérer sur i_2.

Pour plus d'informations, consultez le Python entrée wiki de complexité temporelle

Vous pouvez également consulter l'implémentation dans le source CPython si vous le souhaitez.

21
Sam Mussmann

selon http://wiki.python.org/moin/TimeComplexity

c'est O(k) où k est la taille de la tranche

13
Joran Beasley

Pour une liste de taille N et une tranche de taille M, l'itération n'est en fait que O (M), pas O (N). Puisque M est souvent << N, cela fait une grande différence.

En fait, si vous pensez à votre explication, vous pouvez voir pourquoi. Vous ne faites qu'itérer de i_1 à i_2, pas de 0 à i_1, puis de I_1 à i_2.

5
abarnert