PSQueue-1.1: Priority Search QueueContentsIndex
Data.PSQueue
Contents
Binding Type
Priority Search Queue Type
Query
Construction
Insertion
Delete/Update
Conversion
Priority Queue
Fold
Description

A priority search queue (henceforth queue) efficiently supports the opperations of both a search tree and a priority queue. A Binding is a product of a key and a priority. Bindings can be inserted, deleted, modified and queried in logarithmic time, and the binding with the least priority can be retrieved in constant time. A queue can be built from a list of bindings, sorted by keys, in linear time.

This implementation is due to Ralf Hinze.

  • Hinze, R., A Simple Implementation Technique for Priority Search Queues, ICFP 2001, pp. 110-121

http://citeseer.ist.psu.edu/hinze01simple.html

Synopsis
data Binding k p = k :-> p
key :: Binding k p -> k
prio :: Binding k p -> p
data PSQ k p
size :: PSQ k p -> Int
null :: PSQ k p -> Bool
lookup :: (Ord k, Ord p) => k -> PSQ k p -> Maybe p
empty :: (Ord k, Ord p) => PSQ k p
singleton :: (Ord k, Ord p) => k -> p -> PSQ k p
insert :: (Ord k, Ord p) => k -> p -> PSQ k p -> PSQ k p
insertWith :: (Ord k, Ord p) => (p -> p -> p) -> k -> p -> PSQ k p -> PSQ k p
delete :: (Ord k, Ord p) => k -> PSQ k p -> PSQ k p
adjust :: (Ord p, Ord k) => (p -> p) -> k -> PSQ k p -> PSQ k p
adjustWithKey :: (Ord k, Ord p) => (k -> p -> p) -> k -> PSQ k p -> PSQ k p
update :: (Ord k, Ord p) => (p -> Maybe p) -> k -> PSQ k p -> PSQ k p
updateWithKey :: (Ord k, Ord p) => (k -> p -> Maybe p) -> k -> PSQ k p -> PSQ k p
alter :: (Ord k, Ord p) => (Maybe p -> Maybe p) -> k -> PSQ k p -> PSQ k p
keys :: (Ord k, Ord p) => PSQ k p -> [k]
toList :: (Ord k, Ord p) => PSQ k p -> [Binding k p]
toAscList :: (Ord k, Ord p) => PSQ k p -> [Binding k p]
toDescList :: (Ord k, Ord p) => PSQ k p -> [Binding k p]
fromList :: (Ord k, Ord p) => [Binding k p] -> PSQ k p
fromAscList :: (Ord k, Ord p) => [Binding k p] -> PSQ k p
fromDistinctAscList :: (Ord k, Ord p) => [Binding k p] -> PSQ k p
findMin :: (Ord k, Ord p) => PSQ k p -> Maybe (Binding k p)
deleteMin :: (Ord k, Ord p) => PSQ k p -> PSQ k p
minView :: (Ord k, Ord p) => PSQ k p -> Maybe (Binding k p, PSQ k p)
atMost :: (Ord k, Ord p) => p -> PSQ k p -> [Binding k p]
atMostRange :: (Ord k, Ord p) => p -> (k, k) -> PSQ k p -> [Binding k p]
foldr :: (Ord k, Ord p) => (Binding k p -> b -> b) -> b -> PSQ k p -> b
foldl :: (Ord k, Ord p) => (b -> Binding k p -> b) -> b -> PSQ k p -> b
Binding Type
data Binding k p
k :-> p binds the key k with the priority p.
Constructors
k :-> p
show/hide Instances
(Eq k, Eq p) => Eq (Binding k p)
(Ord k, Ord p) => Ord (Binding k p)
(Read k, Read p) => Read (Binding k p)
(Show k, Show p) => Show (Binding k p)
key :: Binding k p -> k
The key of a binding
prio :: Binding k p -> p
The priority of a binding
Priority Search Queue Type
data PSQ k p
A mapping from keys k to priorites p.
show/hide Instances
(Show k, Show p, Ord k, Ord p) => Show (PSQ k p)
Query
size :: PSQ k p -> Int
O(1) The number of bindings in a queue.
null :: PSQ k p -> Bool
O(1) True if the queue is empty.
lookup :: (Ord k, Ord p) => k -> PSQ k p -> Maybe p
O(log n) The priority of a given key, or Nothing if the key is not bound.
Construction
empty :: (Ord k, Ord p) => PSQ k p
singleton :: (Ord k, Ord p) => k -> p -> PSQ k p
O(1) Build a queue with one binding.
Insertion
insert :: (Ord k, Ord p) => k -> p -> PSQ k p -> PSQ k p
O(log n) Insert a binding into the queue.
insertWith :: (Ord k, Ord p) => (p -> p -> p) -> k -> p -> PSQ k p -> PSQ k p
O(log n) Insert a binding with a combining function.
Delete/Update
delete :: (Ord k, Ord p) => k -> PSQ k p -> PSQ k p
O(log n) Remove a binding from the queue.
adjust :: (Ord p, Ord k) => (p -> p) -> k -> PSQ k p -> PSQ k p
O(log n) Adjust the priority of a key.
adjustWithKey :: (Ord k, Ord p) => (k -> p -> p) -> k -> PSQ k p -> PSQ k p
O(log n) Adjust the priority of a key.
update :: (Ord k, Ord p) => (p -> Maybe p) -> k -> PSQ k p -> PSQ k p
O(log n) The expression (update f k q) updates the priority p bound k (if it is in the queue). If (f p) is Nothing, the binding is deleted. If it is (Just z), the key k is bound to the new priority z.
updateWithKey :: (Ord k, Ord p) => (k -> p -> Maybe p) -> k -> PSQ k p -> PSQ k p
O(log n). The expression (updateWithKey f k q) updates the priority p bound k (if it is in the queue). If (f k p) is Nothing, the binding is deleted. If it is (Just z), the key k is bound to the new priority z.
alter :: (Ord k, Ord p) => (Maybe p -> Maybe p) -> k -> PSQ k p -> PSQ k p
O(log n). The expression (alter f k q) alters the priority p bound to k, or absence thereof. alter can be used to insert, delete, or update a priority in a queue.
Conversion
keys :: (Ord k, Ord p) => PSQ k p -> [k]
O(n) The keys of a priority queue
toList :: (Ord k, Ord p) => PSQ k p -> [Binding k p]
O(n) Convert a queue to a list.
toAscList :: (Ord k, Ord p) => PSQ k p -> [Binding k p]
O(n) Convert a queue to a list in ascending order of keys.
toDescList :: (Ord k, Ord p) => PSQ k p -> [Binding k p]
O(n) Convert a queue to a list in descending order of keys.
fromList :: (Ord k, Ord p) => [Binding k p] -> PSQ k p
O(n log n) Build a queue from a list of bindings.
fromAscList :: (Ord k, Ord p) => [Binding k p] -> PSQ k p
O(n) Build a queue from a list of bindings in order of ascending keys. The precondition that the keys are ascending is not checked.
fromDistinctAscList :: (Ord k, Ord p) => [Binding k p] -> PSQ k p
O(n) Build a queue from a list of distinct bindings in order of ascending keys. The precondition that keys are distinct and ascending is not checked.
Priority Queue
findMin :: (Ord k, Ord p) => PSQ k p -> Maybe (Binding k p)
O(1) The binding with the lowest priority.
deleteMin :: (Ord k, Ord p) => PSQ k p -> PSQ k p
O(log n) Remove the binding with the lowest priority.
minView :: (Ord k, Ord p) => PSQ k p -> Maybe (Binding k p, PSQ k p)
O(log n) Retrieve the binding with the least priority, and the rest of the queue stripped of that binding.
atMost :: (Ord k, Ord p) => p -> PSQ k p -> [Binding k p]

O(r(log n - log r) atMost p q is a list of all the bindings in q with priority less than p, in order of ascending keys. Effectively,

   atMost p' q = filter (\(k:->p) -> p<=p') . toList
atMostRange :: (Ord k, Ord p) => p -> (k, k) -> PSQ k p -> [Binding k p]

O(r(log n - log r)) atMostRange p (l,u) q is a list of all the bindings in q with a priority less than p and a key in the range (l,u) inclusive. Effectively,

    atMostRange p' (l,u) q = filter (\(k:->p) -> l<=k && k<=u ) . atMost p'
Fold
foldr :: (Ord k, Ord p) => (Binding k p -> b -> b) -> b -> PSQ k p -> b
Right fold over the bindings in the queue, in key order.
foldl :: (Ord k, Ord p) => (b -> Binding k p -> b) -> b -> PSQ k p -> b
Left fold over the bindings in the queue, in key order.
Produced by Haddock version 2.7.2