2013-06-23 117 views
4

我正在編寫一個程序,它將生成一堆數據。我想找到關於這些數據的各種百分數。計算百分點

這樣做的顯而易見的方法是將數據存儲在某種排序的容器中。是否有任何Haskell庫提供了一個自動排序的容器,並提供對任意索引的快速隨機訪問?

另一種方法是使用無序容器並在最後執行排序。我不知道這是否會更快。無論哪種方式,我們仍然需要一個提供快速隨機訪問的容器。 (一個數組,也許......)

對此有何建議? (另一種選擇是建立一個直方圖,而不是將整個數據集保存在內存中,但是由於目標是非常精確地計算百分位數,所以我不願意沿着這條路線走下去,我也不知道我的數據範圍,直到我生成它...)

+2

流媒體算法,如http://stackoverflow.com/questions/1248815/percentiles-of-live-data-capture中描述的算法是否滿足您的需求? –

+0

@JeffFoster這似乎與我想要做的事情有關。我不確定這種方法是否可行,但值得研究。 – MathematicalOrchid

回答

5

是否有任何Haskell庫提供一個容器,它會自動排序並提供對任意索引的快速隨機訪問?

是的,這是你的好老Data.Map。請參閱elemAt以及«索引»類別下的其他功能。

Data.Set不提供這些,但你可以用Data.Map YourType()來模擬它。

+0

呵呵。我不知道地圖可以做到這一點...謝謝你的提示。 – MathematicalOrchid

+1

@MathematicalOrchid:增加搜索樹以支持「select」操作很簡單。只需在每個節點中存儲子樹大小:)因此,難怪這是在'Map'中實現的 –