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

标签 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"))

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

最佳答案

不在标准库中,而是 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 预先存在的向量之上几乎透明地执行此操作。

关于data-structures - Clojure 中是否有任何数据结构允许删除 O(1) 或 O(log n) 中的任意元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38070253/

相关文章:

c++ - 我是否安全地删除了链表?

clojure - RxClojure - rx/return 和 rx/observable* 之间有什么区别?

clojure - 在 Clojure 中使用字符串插值宏 (<<)

python - clojure 使用 scipy 和 numpy

java - 要执行的最大任务数

java - 如何创建 B+ 树数据结构

clojure - 为什么这个 Clojure 素数生成器会引发 StackOverflowError?

clojure - Clojure 中解决状态 monad 在 Haskell 中解决问题的惯用方法是什么?

c# - 用于确定特定范围内有多少元素的数据结构?

java - 在java中将大量文件排序成分层树结构