信任要排序的Clojure集合

信任要排序的Clojure集合,clojure,Clojure,如果我从一个外部API获得一个对象的排序列表,有没有一种方法可以将其放入一个排序集中,而无需重新排序?比如: => (sorted? (assume-sorted [1 2 3])) true Clojure对排序集和映射使用持久的红/黑树数据结构。当插入的项使树过于不平衡时,将重新排列树的根节点以保持自身“近似”平衡 您的测量结果表明,与在随机位置生长的树(某些插入会随机使树更加平衡)相比,重新平衡仅在右侧生长的树(每次新添加都会使右侧的树失去平衡)的开销稍大一些 见: 更新

如果我从一个外部API获得一个对象的排序列表,有没有一种方法可以将其放入一个排序集中,而无需重新排序?比如:

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

Clojure对排序集和映射使用持久的红/黑树数据结构。当插入的项使树过于不平衡时,将重新排列树的根节点以保持自身“近似”平衡

您的测量结果表明,与在随机位置生长的树(某些插入会随机使树更加平衡)相比,重新平衡仅在右侧生长的树(每次新添加都会使右侧的树失去平衡)的开销稍大一些

见:


更新 我刚在我的电脑上试过,结果和你的测试结果很不一样。这再次表明了过早优化的愚蠢(特别是当变化小于2倍时):

这个故事的寓意
  • 首先要做对
  • 如果速度足够快,请转到下一个问题
  • 如果需要更快,请测量最大的瓶颈在哪里
  • 决定仅仅以每小时0.03美元的价格使用更多的h/w是否更便宜,或者将人工时间花在代码更改上(这将增加复杂性并降低可维护性等)

  • 如果已经排序,则开销应接近于零。您是否测量了已排序/未排序输入的时间?我建议用最简单的方法来做,然后测量运行时间。
    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"