Data structures Clojure中是否有允许删除O(1)或O(logn)中任意元素的数据结构?
在代码中,我正在寻找Data structures Clojure中是否有允许删除O(1)或O(logn)中任意元素的数据结构?,data-structures,clojure,Data Structures,Clojure,在代码中,我正在寻找removenth和一些coll,对于任意大的集合,它们将是O(1)或O(logn) (= (remove-nth (some-coll "a" "b" "c" "d") 2) (some-coll "a" "b" "d")) 我最好是寻找一个只使用标准库的解决方案,但我对使用外部库的解决方案感兴趣。不是在标准库中,而是(介绍它们的原始论文是)完成工作(通常是很棒的功能数据结构)。您可以通过O(logn)拆分和O(logn)连接来删除O(logn) (defn re
removenth
和一些coll
,对于任意大的集合,它们将是O(1)或O(logn)
(=
(remove-nth (some-coll "a" "b" "c" "d") 2)
(some-coll "a" "b" "d"))
我最好是寻找一个只使用标准库的解决方案,但我对使用外部库的解决方案感兴趣。不是在标准库中,而是(介绍它们的原始论文是)完成工作(通常是很棒的功能数据结构)。您可以通过O(logn)拆分和O(logn)连接来删除O(logn)
(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)
另一种选择是(使用原稿)
它还提供O(对数n)分割(通过切片)和连接。此外,在Clojure的现有向量上几乎可以透明地执行此操作。我认为您指的是任意大的集合,而不是任意大的输入。移除或构造
n
项必须是Omega(n)
,因为您必须逐个地完成它们。@您完全正确;这是表达我意思的更清楚的方式。为了完整起见,我要补充的是,映射支持删除元素的O(logn),并且您可以始终使用整数进行索引。您的remove nth
表明您正在寻找一个序列,我认为这意味着您需要其他类似序列的行为(常数时间附加/线性构造),手指树和RRB树支持这些行为。