Ajouter ou supprimer des éléments de manière efficace dans un vecteur ou une liste dans R?
Je suis la mise en œuvre d'un algorithme qui implique beaucoup de ajouter et supprimer des éléments à partir d'ensembles. Dans R, c'est lent, car autant que je sache, en ajoutant ou en supprimant des choses à partir d'un vecteur est lent, puisque le vecteur doit être ré-attribués. Est-il un moyen de faire ça de manière plus efficace?
Edit: Ma solution actuelle est d'utiliser un booléen vecteur de même longueur que la liste des choses qui peuvent être dans le jeu, et en l'utilisant comme un tableau de l'appartenance.
source d'informationauteur Ryan Thompson
Vous devez vous connecter pour publier un commentaire.
Chapitre 2 de La R Inferno a des commentaires intéressants sur ce, y compris perdiodic croissante des objets afin de réduire la fragmentation de la mémoire et de l'allocation des frais généraux.
Si vous savez ce que la taille définitive de l'ensemble est, ensuite, la méthode que vous suggérez est probablement le meilleur - c'est à dire
subset
de l'ensemble de l'univers à l'aide d'un approprate adhésion vecteur. Difficile de savoir ce qui est meilleur sans voir exactement ce que vous essayez de faire.Si vous le pouvez, de l'initialisation d'un vecteur de sorte qu'il est de longueur égale à sa longueur maximale au cours de l'algorithme peut aider.
par exemple
plutôt que
comparer
à
Il est difficile de dire ce que vous voulez. Peut-être que vous voulez vraiment pile de commandes comme push et pop. La suite n'est-ce pas. Mais c'est une solution rapide.
Allouer un vecteur assez grand pour contenir tous vos objets du type dont vous avez besoin. Définir chaque valeur de NA. L'ajout d'éléments est simple. Suppression d'éléments est à NA encore. En utilisant le vecteur est juste
na.omit(myVec)
Oui, il y a des moyens plus efficaces.
Il s'agit de la façon dont vous utilisez les données; votre cas d'utilisation. Êtes-vous de prendre les données dans le même ordre que vous mettez dans, ou dans l'ordre inverse, ou dans un ordre aléatoire, ou dans un ordre trié?
Pour FIFOpour un tableau de taille fixe utiliser un tampon circulaireou pour une dynamique de la taille, l'utilisation d'un deque (prononcé pont). (C'est probablement ce que vous voulez.)
Pour FILOutiliser un pile.
Pour saisir les données au hasard, envisagez d'utiliser un 1 colonne de la matrice vous jamais la taille. Le redimensionnement est lente.
Si vous avez besoin d'un ensemble ordonné (par exemple
c(3,2,5) -> c(2,3,5)
), regarder dans un arbre ou un tas.