Библиотека карт диапазона Хаскелла - PullRequest
11 голосов
/ 08 октября 2010

Есть ли библиотека Haskell, которая позволяет мне иметь карту от диапазонов до значений? (Предпочтительно несколько эффективнее.)

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

Ответы [ 3 ]

7 голосов
/ 09 октября 2010

Эта задача называется запросом с ограничением по интервалам.Эффективная структура данных для этого называется (одномерная) дерево сегментов .

Пакет SegmentTree обеспечивает реализацию этой структуры данных, но, к сожалению, я не могу понятькак это использовать.(Мне кажется, что интерфейс этого пакета не обеспечивает правильный уровень абстракции.)

7 голосов
/ 14 декабря 2011

Я написал библиотеку для поиска через перекрывающиеся интервалы, потому что существующие не соответствовали моим потребностям. Я думаю, что он может иметь более доступный интерфейс, чем, например, SegmentTree:

http://www.chr -breitkopf.de / сост / IntervalMap / index.html

Это также доступно на Hackage: http://hackage.haskell.org/package/IntervalMap

7 голосов
/ 08 октября 2010

Возможно, rangemin библиотека делает то, что вы хотите?

Старый добрый Data.Map (и его более эффективный Data.IntMap двоюродный брат) имеет функцию

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

, которая разбивает карту на подкарты ключей меньше / больше, чем данный ключ. Это может быть использовано для определенных видов поиска диапазона.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...