查找Clojure排序集中的最大元素

查找Clojure排序集中的最大元素,clojure,Clojure,我正在寻找一种惯用的O(1)方法,在Clojure中提取整数的排序集的最大元素。是否必须将集合强制转换为序列?使用Clojure的内置排序集合,这是O(log n): 对于集合,上述操作也有效,您还可以使用nth在O(logn)时间内按秩访问元素: 这些数据结构都不提供对极端元素的O(1)访问,但是如果您希望频繁地重复访问最大元素,您当然可以将[set max element]捆绑包(可能表示为更干净的操作记录)与自定义API一起使用 如果您只关心对最大元素的快速访问,而不关心有序遍历,那么您实

我正在寻找一种惯用的O(1)方法,在Clojure中提取整数的
排序集
的最大元素。是否必须将集合强制转换为序列?

使用Clojure的内置排序集合,这是O(log n):

对于集合,上述操作也有效,您还可以使用
nth
在O(logn)时间内按秩访问元素:

这些数据结构都不提供对极端元素的O(1)访问,但是如果您希望频繁地重复访问最大元素,您当然可以将
[set max element]
捆绑包(可能表示为更干净的操作记录)与自定义API一起使用


如果您只关心对最大元素的快速访问,而不关心有序遍历,那么您实际上可以将捆绑方法用于“未排序”集–内置哈希集或集合。当然,这对于重复的最大元素
disj
,仅用于维护基本未排序集的上界信息是没有用的(除非您在包中保留了一堆最大元素,在这一点上,使用排序集并免费获取所有相关操作绝对有意义).

对于Clojure的内置排序集,这是O(log n):

对于集合,上述操作也有效,您还可以使用
nth
在O(logn)时间内按秩访问元素:

这些数据结构都不提供对极端元素的O(1)访问,但是如果您希望频繁地重复访问最大元素,您当然可以将
[set max element]
捆绑包(可能表示为更干净的操作记录)与自定义API一起使用


如果您只关心对最大元素的快速访问,而不关心有序遍历,那么您实际上可以将捆绑方法用于“未排序”集–内置哈希集或集合。当然,这对于重复的最大元素
disj
,仅用于维护基本未排序集的上界信息是没有用的(除非您在包中保留了一堆最大元素,在这一点上,使用排序集并免费获取所有相关操作绝对有意义).

如果你考虑到集合的构造,
(进入{}我的集合)
(最大我的集合)
(进入(排序顺序)我的集合)
(上次我的排序集合)

如果你考虑到集合的构造,
(进入{我的集合)
(最大我的集合)
更快,比
(进入(排序序列)我的coll)
(上次我的排序集)

绝对不是seq,在seq中访问
last
是O(n)绝对不是seq,在seq中访问
last
是O(n)不用担心。注意。出于某种原因,我最初在第一段中提到了data.int-map,但是data.int-map集合实际上没有排序,并且不能保证
(comp first rseq)
将访问最大元素–我现在已经修复了答案的这一部分。这些集合非常快,在“bundle”方法下可能适合您,但是–请参阅最后一段中新添加的、正确的data.int-map。无需担心。注意。出于某种原因,我最初在第一段中提到了data.int-map,但是data.int-map集合实际上没有排序,并且不能保证
(comp first rseq)
将访问最大元素–我现在已经修复了答案的这一部分。这些集合非常快,在“bundle”方法下可能适合您,但是–请参阅最后一段中新添加的data.int-map的正确说明。
(first (rseq the-set))
(nth the-set (dec (count the-set)))