2010-10-08 8 views
10

Gibt es eine Haskell-Bibliothek, die mir erlaubt, eine Karte von Bereichen zu Werten zu haben? (Bevorzugte etwas effizienter.)Haskell Range Map-Bibliothek

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

Antwort

7

Diese Aufgabe wird als Stichprobenabfrage in einer Reihe von Intervallen bezeichnet. Eine effiziente Datenstruktur dafür nennt man (eindimensional) segment tree.

Die SegmentTree package bietet eine Implementierung dieser Datenstruktur, aber leider kann ich nicht herausfinden, wie man es benutzt. (Ich denke, dass die Schnittstelle dieses Pakets nicht die richtige Abstraktionsebene bietet.)

+0

Ich liebe es immer, zum ersten Mal von Datenstrukturen zu hören. Sehr cool. –

6

Vielleicht ist die rangemin library tut, was Sie wollen?

gute alte Data.Map (und seine effizienter Data.IntMap Cousin) eine Funktion

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

, die eine Karte in Submaps der Schlüssel aufteilt kleiner/größer als ein gegebener Schlüssel. Dies kann für bestimmte Arten der Bereichssuche verwendet werden.

+0

Ja, Data.Map sicherlich nützlich ist hier. Ich habe dies recht erfolgreich für das Routing von Netzwerknachrichten mit der "nächsten Adresse" verwendet. die 'minView' und' maxView' zusammen mit ihren '* WithKeys' Cousins ​​sind ebenfalls nützlich. –