信任要排序的Clojure集合
如果我从一个外部API获得一个对象的排序列表,有没有一种方法可以将其放入一个排序集中,而无需重新排序?比如:信任要排序的Clojure集合,clojure,Clojure,如果我从一个外部API获得一个对象的排序列表,有没有一种方法可以将其放入一个排序集中,而无需重新排序?比如: => (sorted? (assume-sorted [1 2 3])) true Clojure对排序集和映射使用持久的红/黑树数据结构。当插入的项使树过于不平衡时,将重新排列树的根节点以保持自身“近似”平衡 您的测量结果表明,与在随机位置生长的树(某些插入会随机使树更加平衡)相比,重新平衡仅在右侧生长的树(每次新添加都会使右侧的树失去平衡)的开销稍大一些 见: 更新
=> (sorted? (assume-sorted [1 2 3]))
true
Clojure对排序集和映射使用持久的红/黑树数据结构。当插入的项使树过于不平衡时,将重新排列树的根节点以保持自身“近似”平衡 您的测量结果表明,与在随机位置生长的树(某些插入会随机使树更加平衡)相比,重新平衡仅在右侧生长的树(每次新添加都会使右侧的树失去平衡)的开销稍大一些 见:
更新 我刚在我的电脑上试过,结果和你的测试结果很不一样。这再次表明了过早优化的愚蠢(特别是当变化小于2倍时): 这个故事的寓意
如果已经排序,则开销应接近于零。您是否测量了已排序/未排序输入的时间?我建议用最简单的方法来做,然后测量运行时间。
sorted?
只检查coll实例是否实现了clojure.lang.sorted
,这样您就可以用自己的数据结构实现来伪造它了?也许吧?@birdspider好吧,如果它介于开销和从头开始重新实现排序集之间,我将采用开销=)@AlanThompson未排序序列。。。我做错了吗?20%的差距不值得担心。
(def x (range 1000000))
(def y (doall (shuffle x)))
parse.core=> (time (doall (set x) nil))
"Elapsed time: 279.259531 msecs"
"Elapsed time: 291.31022 msecs"
"Elapsed time: 414.752484 msecs"
parse.core=> (time (doall (set y) nil))
"Elapsed time: 286.496324 msecs"
"Elapsed time: 284.95049 msecs"
"Elapsed time: 285.568222 msecs"
"Elapsed time: 301.55659 msecs"
parse.core=> (time (doall (into (sorted-set) x) nil))
"Elapsed time: 816.473169 msecs"
"Elapsed time: 775.025901 msecs"
"Elapsed time: 763.638447 msecs"
parse.core=> (time (doall (into (sorted-set) y) nil))
"Elapsed time: 1307.969889 msecs"
"Elapsed time: 1313.099123 msecs"
"Elapsed time: 1285.665797 msecs"
"Elapsed time: 1307.879676 msecs"