【发布时间】:2014-04-15 09:32:43
【问题描述】:
所以,我读到count 操作对于 Clojure 向量、列表和映射来说是 O(1)。
(count [1 2 3]) ;=> 3
但是对于 Clojure 集,它也是 O(1) 吗?我想它可能是,但我不确定如何找出答案。我快速阅读了http://clojure.org/data_structures#Data%20Structures-Sets,但看不到那里的信息。
【问题讨论】:
标签: clojure
所以,我读到count 操作对于 Clojure 向量、列表和映射来说是 O(1)。
(count [1 2 3]) ;=> 3
但是对于 Clojure 集,它也是 O(1) 吗?我想它可能是,但我不确定如何找出答案。我快速阅读了http://clojure.org/data_structures#Data%20Structures-Sets,但看不到那里的信息。
【问题讨论】:
标签: clojure
是O(1)
您可以通过观察 clojure.lang.PersistentSet 在 Java 源代码中维护一个 _count 字段来验证这一点:
https://github.com/clojure/clojure/blob/master/src/jvm/clojure/lang/PersistentList.java
【讨论】:
Counted 接口表明count 的O(1) 性能,并且PersistentSet 实现了它。 (instance? clojure.lang.Counted #{:a :b: :c}) => true
Counted 是一个有用的标记界面来检查。虽然请注意,它并不严格 保证 O(1) 行为 - 您必须检查实际的具体类实现以确保这一点。从理论上讲,有人可以以 O(n^2) 或更差的性能糟糕地实现Counted....