2010-10-08 19 views
10

Haritadan menzile değerler almamı sağlayan bir Haskell kütüphanesi var mı? (Tercih biraz verimli.)Haskell Range Harita kütüphanesi

let myRangeMap = RangeMap [(range 1 3, "foo"),(range 2 7, "bar"),(range 9 12, "baz")] 
in rangeValues 2 
==> ["foo","bar"] 

cevap

7

Bu görev, bir dizi aralıkta bir kesme sorgusu olarak adlandırılır. Bunun için verimli bir veri yapısı (tek boyutlu) segment tree olarak adlandırılır.

SegmentTree package, bu veri yapısının bir uygulamasını sağlar, ancak maalesef bunu nasıl kullanacağımı anlayamıyorum. (Bu paketin arayüzünün doğru soyutlamayı sağlamadığını hissediyorum.)

+0

Veri yapılarını ilk kez duymayı seviyorum. Çok havalı. –

6

Belki rangemin library sen ne istiyor ki?

İyi eski Data.Map (ve daha verimli Data.IntMap kuzeni) bir fonksiyonu belirli bir anahtar daha büyük tuşların submaps içine bir harita daha az/böler

splitLookup :: Ord k => k -> Map k a -> (Map k a, Maybe a, Map k a) 

sahiptir. Bu, belirli aralıktaki aramalarda kullanılabilir.

+0

Evet, Data.Map kesinlikle burada yararlıdır. Bunu, ağ mesajlarının "en yakın adres" türünde yönlendirmesi için oldukça başarılı bir şekilde kullandım. "MinView" ve "maxView" ile birlikte "WithKeys" kuzenleri de yararlıdır. –