相信要对Clojure集合进行排序

时间:2017-06-02 15:59:15

标签: clojure

如果我从外部API获得对象的排序列表,是否有办法将其放入有序集中而不需要重新排序的开销?类似的东西:

=> (sorted? (assume-sorted [1 2 3]))
true

1 个答案:

答案 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"

故事的道德

  1. 首先做对了
  2. 如果速度足够快,请转到下一个问题
  3. 如果需要更快,请测量最大的瓶颈在哪里
  4. 决定以0.03美元/小时的速度使用更多的h / w或者花费人力时间进行代码更改(这会增加复杂性并降低可维护性等)会更便宜。