インデックスを基にしたベクトルから項目を削除する方法はありますか?私はsubvecを使ってベクトルを分割し、再度作成します。私はベクトルのためのassocの逆を探していますか?Clojure指定された場所のベクトルから項目を削除します
答えて
subvec
がおそらく最も良い方法です。 Clojureの文書では、subvec
は "O(1)で、非常に高速です。結果のベクトルは元の構造と同じ構造を持ち、トリミングは行われません。"となっています。代わりに、ベクトルを歩いて新しい要素を作成しながら、特定の要素をスキップしてゆくと、速度が遅くなります。
ベクトルの真ん中から要素を取り除くことは、ベクトルが必ずしもうまくいくものではありません。これを頻繁に行う必要がある場合は、dissoc
を使用できるようにハッシュマップの使用を検討してください。
参照:clojure.github.io
でclojuredocs.org
- subvec、公式サイトのポイントへ。
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"
うん - subvecはここ最速
ですが素敵であることが判明ソリューションの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)
(defn vec-remove
"remove elem in coll"
[coll pos]
(vec (concat (subvec coll 0 pos) (subvec coll (inc pos)))))
べきは、任意の順序で動作していないためにさらに別の可能性を指数が範囲外だった場合は爆弾...
(defn drop-index [col idx]
(filter identity (map-indexed #(if (not= %1 idx) %2) col)))
subvec
は高速です。トランジェントと組み合わせると、より良い結果が得られます。ベンチマークに判断基準を使用し
:
user=> (def len 5)
user=> (def v (vec (range 0 5))
user=> (def i (quot len 2))
user=> (def j (inc i))
; using take/drop
user=> (bench
(vec (concat (take i v) (drop j v))))
; Execution time mean : 817,618757 ns
; Execution time std-deviation : 9,371922 ns
; using subvec
user=> (bench
(vec (concat (subvec v 0 i) (subvec v j len))))
; Execution time mean : 604,501041 ns
; Execution time std-deviation : 8,163552 ns
; using subvec and transients
user=> (bench
(persistent!
(reduce conj! (transient (vec (subvec v 0 i))) (subvec v j len))))
; Execution time mean : 307,819500 ns
; Execution time std-deviation : 4,359432 ns
高速化がより大きい長さであっても大きいです。 len
が10000
に等しい同じベンチは、手段:1,368250 ms
,953,565863 µs
,314,387437 µs
を与える。
subvec w/transientsバージョンにはどのようなclojureバージョンを使用しましたか? 'APersistentVector $ SubVectorはIEditableCollection'を実装していないので、4年前には、一時的なものと互換性がないために[オープンバグ](http://dev.clojure.org/jira/browse/CLJ-787)がありました。この例では、clojure 1.7のテストでvec'が 'clojure.lang.APersistentVector $ SubVector'を返しても、' vec(subvec ...) 'にサブベクトル呼び出しをラップしていると仮定しています。以来、おそらく最適化として、私はそれのクロージャーソースに掘っていない。 –
1.6。0だと思います。この答えが書かれる数ヶ月前にリリースされました。 – omiel
'bench' https://github.com/hugoduncan/criterium –
ベクターライブラリclojure.core.rrb-vector
は、対数時間連結およびスライシングを提供する。あなたが永続性を必要とし、あなたが求めているものを考慮すれば、対数的な時間解は理論上可能な限り速くなります。特に、クロージャのネイティブsubvec
を使用する任意のソリューションよりもはるかに高速です。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]
- 1. boost :: intrusive :: listから指定された項目を削除します。
- 2. 指定されたパスで項目を削除し、すべての親を再帰的に削除します
- 3. ベクトルから項目を削除するときのValgrindエラー
- 4. clojure - refベクトルから要素を削除します
- 5. ListBoxから項目を指定してテキストファイル内の行を削除する
- 6. Java ConcurrentHashMapから特定の項目を削除します
- 7. スプライスされた項目をドロップダウンメニューから削除する
- 8. フィルタリングされたArrayCollectionから項目を削除する
- 9. コレクションコレクションの削除項目をその場所に応じて表示します。
- 10. ネストされたdictから項目を再帰的に削除
- 11. ItemはArrayListから削除されましたが、notifyDataSetChanged()は下位項目のみを削除します
- 12. PowerShell:アレイから重複した項目を削除します。
- 13. 指定された数の項目が含まれている場合、最初のリスト項目を削除する
- 14. 指定された場所にオブジェクトをマージしますか?
- 15. リストがゼロの場合、リストから項目を削除する
- 16. は配列項目を削除できません。間違った項目は常に削除されます
- 17. 指定された場所のGoogleマップルート?
- 18. React、Reduxクリックして項目を削除すると、すべての項目が削除されます
- 19. arraylistから項目を削除する
- 20. ドロップダウンリストから項目を削除する
- 21. リストから項目を削除する
- 22. ドロップダウンリストから項目を削除する
- 23. 指定された場所からuiwebviewをロードしています
- 24. データフレームから指定されたレベルの因子の行を削除します
- 25. 特定のインデックスの項目を辞書から削除しますか?
- 26. MongoDBで配列から特定の項目を削除する
- 27. キャッシュから特定の項目を削除する(ASP.NET)
- 28. リンクリスト内の指定された位置からノードを削除
- 29. Vaadin:メニュー項目からキャプションを削除
- 30. リストボックスから選択項目を削除
単一のアイテムを削除するには、これはsubvecを使用するよりも時間がかかりますが、複数のインデックスを削除するにはこれはかなり便利です。 –