1
如果我從外部API獲取對象的排序列表,是否有辦法將它放入排序集中,而無需重新排序呢?喜歡的東西:相信要分類的Clojure集合
=> (sorted? (assume-sorted [1 2 3]))
true
如果我從外部API獲取對象的排序列表,是否有辦法將它放入排序集中,而無需重新排序呢?喜歡的東西:相信要分類的Clojure集合
=> (sorted? (assume-sorted [1 2 3]))
true
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"
如果它已經排序,開銷應該接近於零。您是否測量了分類/未分類輸入的時間?我建議用最簡單的方法來測量運行時間。 –
'sorted?'只檢查coll實例是否實現'clojure.lang.Sorted',這樣你就可以用你自己的數據結構實現它嗎?也許 ? – birdspider
@birdspider那麼,如果它是從頭開始和重新實現有序集之間,我會採取開銷=) – 0x60