C# Liste supprimer de la fin, vraiment O(n)?
J'ai lu quelques articles indiquant que la Liste.RemoveAt() est en O(n) fois.
Si je fais quelque chose comme:
var myList = new List<int>();
/* Add many ints to the list here. */
//Remove item at end of list:
myList.RemoveAt(myList.Count - 1); //Does this line run in O(n) time?
Retrait à partir de la fin de la liste devrait être O(1), il suffit de décrémenter la liste nombre de.
Dois-je écrire ma propre classe à avoir ce comportement, ou ne l'enlèvement de l'immobilisation à la fin d'un C# liste déjà effectuer en O(1) fois?
- Je suis conscient que je pourrais en visibilité, et de voir, ou de l'utilisation .NET réflecteur. Le point de la création de cette question, est de créer une base de résultat pour ce que je pense est une question importante. Je n'ai pas réussi à trouver une réponse à cela dans ma propre recherche.
Vous devez vous connecter pour publier un commentaire.
En général
List<T>::RemoveAt
est O(N) en raison de la nécessité de déplacer des éléments à partir de l'index d'un emplacement dans la matrice. Mais pour le cas spécifique de la suppression de la fin de la liste, pas de changement est nécessaire et c'est donc en O(1)N
ici estlist.Count - indexRemoved
?arr[0]
est également en o(1) ? qu'en estarr[arr.length-1]
?La suppression du dernier élément sera effectivement
O(1)
opération depuis seulement dans ce casList
ne passe pas à côté d'éléments dans le tableau. Voici un code de Réflecteur:Array.Copy
est juste de la copie de données, pas de l'allocation.Cela devrait vous donner une idée
Lorsque l'on parle asymptotiquement, O(N) est le pire des cas le temps de la complexité de la méthode elle-même, où N est le nombre de. Il ne peut pas effectuer de pire que cela.
En pratique, il serait de l'ordre de O(N-I) (sans tenir compte de la constante de temps système), où I est l'indice. Ce ressort, puisque tous les éléments au-delà de l'index j'ai besoin d'être déplacé à la position précédente respectivement dans une Liste.
De voir cela intuitivement, si N est de 100 et de l'indice est de 99 (dernier élément), alors il n'y a pas d'éléments qui doivent être "décalé" juste le dernier élément est supprimé (ou tout simplement le nombre est diminué, sans modification de la taille de la structure de données).
De même, lorsque N est de 100, l'indice est 0 (premier élément), 99 changements doivent être faits.
Exécutez le code suivant et de voir par vous-même:
Il me semble que si c'était réellement pertinente à votre demande, vous pourriez avoir mesuré en moins de temps qu'il a fallu poser la question. Et maintenant, vous avez au moins deux réponses contradictoires, de sorte que vous aurez à tester de toute façon.
Le point que j'essaie de faire, c'est que, à moins que la MSDN docs disent que removeAt est O(1) pour les éléments à la fin de la liste, on ne pouvait pas vraiment compter sur elle à travailler de cette façon, et cela pourrait changer à tout .Mise à jour NET. De ce fait, le comportement peut être différent selon les types, pour tout ce que vous savez.
Si la Liste est "naturel" de la structure de données à utiliser, puis l'utiliser. Si la suppression d'éléments de la Liste finit par être un point chaud n votre de profilage, alors peut-être il est temps de mettre en place votre propre classe.