Clojure中是否有任何数据结构允许删除O(1)或O(log n)中的任意元素?

时间:2016-06-28 07:52:16

标签: data-structures clojure

在代码中,我正在寻找remove-nthsome-coll,对于任意大的集合,它们将是O(1)或O(log n)。

(=
  (remove-nth (some-coll "a" "b" "c" "d") 2)
  (some-coll "a" "b" "d"))

我最好寻找仅使用标准库的解决方案,但我对使用外部库的解决方案感兴趣。

1 个答案:

答案 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预先存在的载体上面几乎透明地做到这一点。