Clojure Supprimer l'élément de Vecteur à un Emplacement Spécifié
Est-il un moyen pour supprimer un élément à partir d'un vecteur basé sur l'indice de maintenant, je suis en utilisant subvec de diviser le vecteur et le recréer à nouveau. Je suis à la recherche de l'inverse de l'assoc pour les vecteurs?
Vous devez vous connecter pour publier un commentaire.
subvec
est probablement la meilleure façon. Le Clojure docs diresubvec
est "O(1) et très rapide, comme le vecteur résultant des actions de la structure avec l'original et aucun ajustement n'est fait". L'alternative serait de marche le vecteur et la construction d'un nouveau tout en sautant certains éléments, ce qui serait plus lent.Supprimer les éléments de la moyenne d'un vecteur n'est pas quelque chose vecteurs sont nécessairement bon. Si vous avez à le faire souvent, pensez à utiliser un hachage de la carte de sorte que vous pouvez utiliser
dissoc
.Voir:
clojuredocs.org
clojure.github.io
, où le site web officiel de pointe.Yup - subvec est plus rapide
Ici est une solution de iv trouvé à nice:
Le vecteur de la bibliothèque
clojure.de base.rrb-vector
fournit des temps logarithmique de concaténation et de tranchage. Si vous avez besoin de la persistance, et compte tenu de ce que vous demandez, un temps logarithmique solution est aussi rapide que possible, en théorie. En particulier, il est beaucoup plus rapide que n'importe quelle solution à l'aide de clojure natifsubvec
, comme leconcat
étape met toute solution de ce type dans le temps linéaire.subvec
est rapide ; en combinaison avec des transitoires, il donne des résultats encore meilleurs.À l'aide de critère de référence:
L'accélération est encore plus grande à de plus grandes longueurs ; le même banc avec un
len
égal à10000
donne les moyens:1,368250 ms
,953,565863 µs
,314,387437 µs
.APersistentVector$SubVector does not implement IEditableCollection
. Je suppose que c'est pourquoi l'exemple encapsule le subvec appel dans(vec (subvec ...))
bien que dans mes tests avec clojure 1.7,vec
dans ce cas retournera toujours unclojure.lang.APersistentVector$SubVector
, probablement comme une optimisation depuis, mais je n'ai pas creusé dans la clojure source pour cela.bench
via github.com/hugoduncan/criteriumvec
dans votre dernier exemple en date avecinto []
fonctionne avec Clojure 1.8 mais absolument tue la performance :(. La manière la plus rapide que je puisse avoir est(into (subvec v 0 i) (subvec v j))
, ce qui est environ 15% plus vite que votreusing subvec
moyen de la version sur mon ordinateur...Encore une autre possibilité, qui devrait fonctionner avec n'importe quelle séquence et non pas de la bombe si l'index est hors de la plage...