Clojure中的set、distinct和dedupe有什么区别?

9
所以,如果我们想要一个独特项的集合,可以使用“set”。
如果我们已经有了一个想要去重的项目集合,可以将它们传递给set函数,或者我们也可以使用distinct或dedupe函数。
使用每个函数的情况是什么(利弊)?
谢谢。
1个回答

15
区别如下:
  • set 会立即创建一个新的集合。
  • distinct 会创建一个懒惰序列,其中重复的输入集合元素已被移除。相对于 set,它具有一个优势,如果你处理大型集合,并且惰性地查询输入集合(例如使用 take),惰性计算可能会节省时间。
  • dedupe 从输入集合中移除连续重复的元素,因此它与 setdistinct 具有不同的语义。例如,当应用于 (1 1 1 2 3 3 1 1 2 2 2 3 3) 时,它将返回 (1 2 3 1 2 3)

set 和懒惰序列具有不同的可用 API(例如,disjget 对比 nth),并且具有不同的性能特征(例如,set 的 O(log32 n) 查找和懒惰序列的 O(n))。根据你想要使用它们的结果的方式来选择。

此外,在没有参数调用时,distinctdedupe 返回一个 transducer。


1
也许值得补充的是,setdistinct可能会以不同的顺序呈现集合。在我的系统上,(= ((comp seq set) (range 91)) (distinct (range 91))) => false - Thumbnail
通常情况下,哈希集合中的元素只需要是唯一的,而不需要按照任何特定的顺序排列,这与有序集合不同,有序集合始终保持排序,但仅限于“可比较”的元素。 - Hamid Sadeghian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接