[Haskell-cafe] Looking for an heap-like data structure allowing efficient update
Arnaud Bailly
arnaud.oqube at gmail.com
Mon Mar 5 08:29:13 CET 2012
Thanks a lot. Yes it helps!
Arnaud
On Sun, Mar 4, 2012 at 9:38 PM, Joey Adams <joeyadams3.14159 at gmail.com> wrote:
> On Sun, Mar 4, 2012 at 1:27 PM, Arnaud Bailly <arnaud.oqube at gmail.com> wrote:
>> Hello Cafe,
>> I am looking for a data structure that would have the following
>> informal properties:
>> - allow efficient retrieval of minimum element for some ordering
>> relation on a computed property of the elements
>> - allow efficient update of any element wrt to this property
>
> I think what you're looking for is called a "priority search queue".
> It supports the operations of both a priority queue and a search tree.
> Two implementations on Hackage are:
>
> * http://hackage.haskell.org/package/fingertree-psqueue
>
> * http://hackage.haskell.org/package/PSQueue
>
> Both libraries appear to have the same API. I'm not sure which of
> these is "better". The priority search queue used by GHC's event
> manager is based on PSQueue. On the other hand, fingertree-psqueue is
> newer.
>
> In any case, a PSQ is just like a Map in that it binds keys to values.
> The difference is that values are called "priorities", as you can
> efficiently look up or extract the minimum value. Note that keys must
> be unique (just like with Map), but priorities do not need to be.
>
> It appears that if you want to attach a "value" in addition to the
> priority, you'll need to define a data type. E.g.:
>
> import Data.PSQueue (PSQ)
> import Data.Unique (Unique)
>
> type Time = ... some efficient representation of time values ...
>
> data Event
> = Event
> { eventTimeout :: Time
> , eventAction :: IO ()
> }
>
> instance Eq Event where
> a == b = eventTimeout a == eventTimeout b
>
> instance Ord Event where
> compare a b = compare (eventTimeout a) (eventTimeout b)
>
> type EventQueue = PSQ Unique Event
>
> In this case, the PSQ will be able to remove the Event whose
> expiration is soonest. It will also be able to remove an Event by its
> Unique key, useful for canceling Events.
>
> Hope this helps,
> -Joey
More information about the Haskell-Cafe
mailing list