如果我从外部API获得对象的排序列表,是否有办法将其放入有序集中而不需要重新排序的开销?类似的东西:
=> (sorted? (assume-sorted [1 2 3]))
true
答案 0 :(得分:1)
Clojure使用持久的红/黑树数据结构进行排序集&地图。当插入的项目使树太不平衡时,根和&树的节点被重新排列以保持自身"大约"平衡的。
您的测量显示,与在随机位置生长的树相比,重新平衡仅在右侧生长的树(每个新添加使树进一步向右不平衡)的开销略微增加(某些插入将随机使树更平衡)。
请参阅:
我刚尝试使用计算机,结果与测试结果大不相同。这再一次显示了试图过早优化的愚蠢行为(特别是如果变化小于2倍):
(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"