在代码中,我正在寻找remove-nth
和some-coll
,对于任意大的集合,它们将是O(1)或O(log n)。
(=
(remove-nth (some-coll "a" "b" "c" "d") 2)
(some-coll "a" "b" "d"))
我最好寻找仅使用标准库的解决方案,但我对使用外部库的解决方案感兴趣。
答案 0 :(得分:4)
不在标准库中,但是finger trees(引入它们的原始论文是here)完成工作(并且通常是非常棒的功能数据结构)。您可以通过O(log n)拆分和O(log n)连接来删除O(log n)。
(defn remove-nth [xs n]
(let [[left _ right] (ft-split-at xs n)]
(ft-concat left right)))
(def cdl (apply counted-double-list '[a b c d e f]))
(remove-nth cdl 3)
;; => (a b c e f)
另一种选择是RRB-tree based vectors(原始论文here) 它还提供O(log n)拆分(通过切片)和连接。另外,你可以在Clojure预先存在的载体上面几乎透明地做到这一点。