現在のインデックスに基づいてベクトルからアイテムを削除する方法は、サブベクシスを使用してベクトルを分割して再度再作成します。私はベクトルのアサコの逆を探していますか?
user=> (def a [1 2 3 4 5])
user=> (time (dotimes [n 100000] (vec (concat (take 2 a) (drop 3 a)))))
"Elapsed time: 1185.539413 msecs"
user=> (time (dotimes [n 100000] (vec (concat (subvec a 0 2) (subvec a 3 5)))))
"Elapsed time: 760.072048 msecs"
_
Yup - サブベッキは最速です
これが素晴らしいことがわかった解決策IVです。
(defn index-exclude [r ex]
"Take all indices execpted ex"
(filter #(not (ex %)) (range r)))
(defn dissoc-idx [v & ds]
(map v (index-exclude (count v) (into #{} ds))))
(dissoc-idx [1 2 3] 1 2)
'(1)
_
ベクトルライブラリ clojure.core.rrb-vector
対数の連結とスライスを提供します。あなたが持続的必要があると仮定し、あなたが求めているものを考えると、対数時間解は理論的には速く早くなります。特に、subvec
ステップはそのような解を線形時間にするので、Clojureのネイティブconcat
を使用したどんな解決策よりもはるかに高速です。
(require '[clojure.core.rrb-vector :as fv])
(let [s (vec [0 1 2 3 4])]
(fv/catvec (fv/subvec s 0 2) (fv/subvec s 3 5)))
; => [0 1 3 4]
_