|
|
|
|
|
| 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 | | Instances | |
|
|
| 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.
| Instances | |
|
|
| 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 |