# HG changeset patch
# User Peter Kovacs <kpeter@inf.elte.hu>
# Date 1206880045 -7200
# Node ID 18a7ee8fa56e63010a98e3b04e6981564c228d5a
# Parent d2ee5e7f00ef5d8ffe6b293461eba7ec0ca0be47
Improvements in the heap concept
- Better concept checking.
- Improved doc.
diff -r d2ee5e7f00ef -r 18a7ee8fa56e lemon/concepts/heap.h
|
a
|
b
|
|
| 18 | 18 | |
| 19 | 19 | ///\ingroup concept |
| 20 | 20 | ///\file |
| 21 | | ///\brief Classes for representing heaps. |
| 22 | | /// |
| | 21 | ///\brief The concept of heaps. |
| 23 | 22 | |
| 24 | 23 | #ifndef LEMON_CONCEPT_HEAP_H |
| 25 | 24 | #define LEMON_CONCEPT_HEAP_H |
| … |
… |
|
| 27 | 26 | #include <lemon/bits/invalid.h> |
| 28 | 27 | |
| 29 | 28 | namespace lemon { |
| | 29 | |
| 30 | 30 | namespace concepts { |
| | 31 | |
| 31 | 32 | /// \addtogroup concept |
| 32 | 33 | /// @{ |
| 33 | 34 | |
| 34 | | |
| 35 | | /// \brief A concept structure describes the main interface of heaps. |
| | 35 | /// \brief The heap concept. |
| 36 | 36 | /// |
| 37 | | /// A concept structure describes the main interface of heaps. |
| 38 | | /// |
| 39 | | template <typename Prio, typename ItemIntMap> |
| | 37 | /// Concept class describing the main interface of heaps. |
| | 38 | template <typename Priority, typename ItemIntMap> |
| 40 | 39 | class Heap { |
| 41 | 40 | public: |
| 42 | 41 | |
| 43 | | ///\brief Type of the items stored in the heap. |
| 44 | | typedef typename ItemIntMap::Key Item; |
| 45 | | |
| | 42 | /// Type of the items stored in the heap. |
| | 43 | typedef typename ItemIntMap::Key Item; |
| 46 | 44 | |
| 47 | | /// \brief Type to represent the items states. |
| | 45 | /// Type of the priorities. |
| | 46 | typedef Priority Prio; |
| | 47 | |
| | 48 | /// \brief Type to represent the states of the items. |
| 48 | 49 | /// |
| 49 | | /// Each Item element have a state associated to it. It may be "in heap", |
| 50 | | /// "pre heap" or "post heap". The later two are indifferent from the |
| 51 | | /// heap's point of view, but may be useful to the user. |
| | 50 | /// Each item has a state associated to it. It can be "in heap", |
| | 51 | /// "pre heap" or "post heap". The later two are indifferent |
| | 52 | /// from the point of view of the heap, but may be useful for |
| | 53 | /// the user. |
| 52 | 54 | /// |
| 53 | | /// The ItemIntMap _should_ be initialized in such way, that it maps |
| 54 | | /// PRE_HEAP (-1) to any element to be put in the heap... |
| | 55 | /// The \c ItemIntMap must be initialized in such a way, that it |
| | 56 | /// assigns \c PRE_HEAP (<tt>-1</tt>) to every item. |
| 55 | 57 | enum State { |
| 56 | 58 | IN_HEAP = 0, |
| 57 | 59 | PRE_HEAP = -1, |
| … |
… |
|
| 61 | 63 | /// \brief The constructor. |
| 62 | 64 | /// |
| 63 | 65 | /// The constructor. |
| 64 | | /// \param _iim should be given to the constructor, since it is used |
| 65 | | /// internally to handle the cross references. The value of the map |
| 66 | | /// should be PRE_HEAP (-1) for each element. |
| 67 | | explicit Heap(ItemIntMap &_iim) {} |
| | 66 | /// \param map A map that assigns \c int values to keys of type |
| | 67 | /// \c Item. It is used internally by the heap implementations to |
| | 68 | /// handle the cross references. The assigned value must be |
| | 69 | /// \c PRE_HEAP (<tt>-1</tt>) for every item. |
| | 70 | explicit Heap(ItemIntMap &map) {} |
| 68 | 71 | |
| 69 | 72 | /// \brief The number of items stored in the heap. |
| 70 | 73 | /// |
| 71 | 74 | /// Returns the number of items stored in the heap. |
| 72 | 75 | int size() const { return 0; } |
| 73 | 76 | |
| 74 | | /// \brief Checks if the heap stores no items. |
| | 77 | /// \brief Checks if the heap is empty. |
| 75 | 78 | /// |
| 76 | | /// Returns \c true if and only if the heap stores no items. |
| | 79 | /// Returns \c true if the heap is empty. |
| 77 | 80 | bool empty() const { return false; } |
| 78 | 81 | |
| 79 | | /// \brief Makes empty this heap. |
| | 82 | /// \brief Makes the heap empty. |
| 80 | 83 | /// |
| 81 | | /// Makes this heap empty. |
| | 84 | /// Makes the heap empty. |
| 82 | 85 | void clear(); |
| 83 | 86 | |
| 84 | | /// \brief Insert an item into the heap with the given heap. |
| | 87 | /// \brief Inserts an item into the heap with the given priority. |
| 85 | 88 | /// |
| 86 | | /// Adds \c i to the heap with priority \c p. |
| | 89 | /// Inserts the given item into the heap with the given priority. |
| 87 | 90 | /// \param i The item to insert. |
| 88 | 91 | /// \param p The priority of the item. |
| 89 | 92 | void push(const Item &i, const Prio &p) {} |
| 90 | 93 | |
| 91 | | /// \brief Returns the item with minimum priority. |
| | 94 | /// \brief Returns the item having minimum priority. |
| 92 | 95 | /// |
| 93 | | /// This method returns the item with minimum priority. |
| 94 | | /// \pre The heap must be nonempty. |
| | 96 | /// Returns the item having minimum priority. |
| | 97 | /// \pre The heap must be non-empty. |
| 95 | 98 | Item top() const {} |
| 96 | 99 | |
| 97 | | /// \brief Returns the minimum priority. |
| | 100 | /// \brief The minimum priority. |
| 98 | 101 | /// |
| 99 | | /// It returns the minimum priority. |
| 100 | | /// \pre The heap must be nonempty. |
| | 102 | /// Returns the minimum priority. |
| | 103 | /// \pre The heap must be non-empty. |
| 101 | 104 | Prio prio() const {} |
| 102 | 105 | |
| 103 | | /// \brief Deletes the item with minimum priority. |
| | 106 | /// \brief Removes the item having minimum priority. |
| 104 | 107 | /// |
| 105 | | /// This method deletes the item with minimum priority. |
| 106 | | /// \pre The heap must be non-empty. |
| | 108 | /// Removes the item having minimum priority. |
| | 109 | /// \pre The heap must be non-empty. |
| 107 | 110 | void pop() {} |
| 108 | 111 | |
| 109 | | /// \brief Deletes \c i from the heap. |
| | 112 | /// \brief Removes an item from the heap. |
| 110 | 113 | /// |
| 111 | | /// This method deletes item \c i from the heap, if \c i was |
| 112 | | /// already stored in the heap. |
| 113 | | /// \param i The item to erase. |
| | 114 | /// Removes the given item from the heap if it is already stored. |
| | 115 | /// \param i The item to delete. |
| 114 | 116 | void erase(const Item &i) {} |
| 115 | 117 | |
| 116 | | /// \brief Returns the priority of \c i. |
| | 118 | /// \brief The priority of an item. |
| 117 | 119 | /// |
| 118 | | /// This function returns the priority of item \c i. |
| | 120 | /// Returns the priority of the given item. |
| 119 | 121 | /// \pre \c i must be in the heap. |
| 120 | 122 | /// \param i The item. |
| 121 | 123 | Prio operator[](const Item &i) const {} |
| 122 | 124 | |
| 123 | | /// \brief \c i gets to the heap with priority \c p independently |
| 124 | | /// if \c i was already there. |
| | 125 | /// \brief Sets the priority of an item or inserts it, if it is |
| | 126 | /// not stored in the heap. |
| 125 | 127 | /// |
| 126 | | /// This method calls \ref push(\c i, \c p) if \c i is not stored |
| 127 | | /// in the heap and sets the priority of \c i to \c p otherwise. |
| 128 | | /// It may throw an \e UnderFlowPriorityException. |
| | 128 | /// This method sets the priority of the given item if it is |
| | 129 | /// already stored in the heap. |
| | 130 | /// Otherwise it inserts the given item with the given priority. |
| | 131 | /// |
| | 132 | /// It may throw an \ref UnderflowPriorityException. |
| 129 | 133 | /// \param i The item. |
| 130 | 134 | /// \param p The priority. |
| 131 | 135 | void set(const Item &i, const Prio &p) {} |
| 132 | 136 | |
| 133 | | /// \brief Decreases the priority of \c i to \c p. |
| | 137 | /// \brief Decreases the priority of an item to the given value. |
| 134 | 138 | /// |
| 135 | | /// This method decreases the priority of item \c i to \c p. |
| | 139 | /// Decreases the priority of an item to the given value. |
| 136 | 140 | /// \pre \c i must be stored in the heap with priority at least \c p. |
| 137 | 141 | /// \param i The item. |
| 138 | 142 | /// \param p The priority. |
| 139 | 143 | void decrease(const Item &i, const Prio &p) {} |
| 140 | 144 | |
| 141 | | /// \brief Increases the priority of \c i to \c p. |
| | 145 | /// \brief Increases the priority of an item to the given value. |
| 142 | 146 | /// |
| 143 | | /// This method sets the priority of item \c i to \c p. |
| 144 | | /// \pre \c i must be stored in the heap with priority at most \c |
| 145 | | /// p relative to \c Compare. |
| | 147 | /// Increases the priority of an item to the given value. |
| | 148 | /// \pre \c i must be stored in the heap with priority at most \c p. |
| 146 | 149 | /// \param i The item. |
| 147 | 150 | /// \param p The priority. |
| 148 | 151 | void increase(const Item &i, const Prio &p) {} |
| 149 | 152 | |
| 150 | | /// \brief Returns if \c item is in, has already been in, or has |
| | 153 | /// \brief Returns if an item is in, has already been in, or has |
| 151 | 154 | /// never been in the heap. |
| 152 | 155 | /// |
| 153 | | /// This method returns PRE_HEAP if \c item has never been in the |
| 154 | | /// heap, IN_HEAP if it is in the heap at the moment, and POST_HEAP |
| 155 | | /// otherwise. In the latter case it is possible that \c item will |
| 156 | | /// get back to the heap again. |
| | 156 | /// This method returns \c PRE_HEAP if the given item has never |
| | 157 | /// been in the heap, \c IN_HEAP if it is in the heap at the moment, |
| | 158 | /// and \c POST_HEAP otherwise. |
| | 159 | /// In the latter case it is possible that the item will get back |
| | 160 | /// to the heap again. |
| 157 | 161 | /// \param i The item. |
| 158 | 162 | State state(const Item &i) const {} |
| 159 | 163 | |
| 160 | | /// \brief Sets the state of the \c item in the heap. |
| | 164 | /// \brief Sets the state of an item in the heap. |
| 161 | 165 | /// |
| 162 | | /// Sets the state of the \c item in the heap. It can be used to |
| 163 | | /// manually clear the heap when it is important to achive the |
| | 166 | /// Sets the state of the given item in the heap. It can be used |
| | 167 | /// to manually clear the heap when it is important to achive the |
| 164 | 168 | /// better time complexity. |
| 165 | 169 | /// \param i The item. |
| 166 | | /// \param st The state. It should not be \c IN_HEAP. |
| | 170 | /// \param st The state. It should not be \c IN_HEAP. |
| 167 | 171 | void state(const Item& i, State st) {} |
| 168 | 172 | |
| 169 | 173 | |
| 170 | 174 | template <typename _Heap> |
| 171 | 175 | struct Constraints { |
| 172 | 176 | public: |
| 173 | | |
| 174 | 177 | void constraints() { |
| | 178 | typedef typename _Heap::Item OwnItem; |
| | 179 | typedef typename _Heap::Prio OwnPrio; |
| | 180 | typedef typename _Heap::State OwnState; |
| | 181 | |
| 175 | 182 | Item item; |
| 176 | 183 | Prio prio; |
| 177 | | |
| | 184 | State state; |
| 178 | 185 | item=Item(); |
| 179 | 186 | prio=Prio(); |
| 180 | | |
| 181 | 187 | ignore_unused_variable_warning(item); |
| 182 | 188 | ignore_unused_variable_warning(prio); |
| | 189 | ignore_unused_variable_warning(state); |
| 183 | 190 | |
| 184 | | typedef typename _Heap::State State; |
| 185 | | State state; |
| | 191 | OwnItem own_item; |
| | 192 | OwnPrio own_prio; |
| | 193 | OwnState own_state; |
| | 194 | own_item=Item(); |
| | 195 | own_prio=Prio(); |
| | 196 | ignore_unused_variable_warning(own_item); |
| | 197 | ignore_unused_variable_warning(own_prio); |
| | 198 | ignore_unused_variable_warning(own_state); |
| 186 | 199 | |
| 187 | | ignore_unused_variable_warning(state); |
| 188 | | |
| 189 | | _Heap heap1 = _Heap(map); |
| 190 | | |
| | 200 | _Heap heap1(map); |
| | 201 | _Heap heap2 = heap1; |
| 191 | 202 | ignore_unused_variable_warning(heap1); |
| 192 | | |
| 193 | | heap.push(item, prio); |
| | 203 | ignore_unused_variable_warning(heap2); |
| | 204 | |
| | 205 | int s = heap.size(); |
| | 206 | bool e = heap.empty(); |
| 194 | 207 | |
| 195 | 208 | prio = heap.prio(); |
| 196 | 209 | item = heap.top(); |
| | 210 | prio = heap[item]; |
| | 211 | own_prio = heap.prio(); |
| | 212 | own_item = heap.top(); |
| | 213 | own_prio = heap[own_item]; |
| 197 | 214 | |
| | 215 | heap.push(item, prio); |
| | 216 | heap.push(own_item, own_prio); |
| 198 | 217 | heap.pop(); |
| 199 | 218 | |
| 200 | 219 | heap.set(item, prio); |
| 201 | 220 | heap.decrease(item, prio); |
| 202 | 221 | heap.increase(item, prio); |
| 203 | | prio = heap[item]; |
| | 222 | heap.set(own_item, own_prio); |
| | 223 | heap.decrease(own_item, own_prio); |
| | 224 | heap.increase(own_item, own_prio); |
| 204 | 225 | |
| 205 | 226 | heap.erase(item); |
| | 227 | heap.erase(own_item); |
| | 228 | heap.clear(); |
| 206 | 229 | |
| 207 | 230 | state = heap.state(item); |
| | 231 | heap.state(item, state); |
| | 232 | state = heap.state(own_item); |
| | 233 | heap.state(own_item, own_state); |
| 208 | 234 | |
| 209 | 235 | state = _Heap::PRE_HEAP; |
| 210 | 236 | state = _Heap::IN_HEAP; |
| 211 | 237 | state = _Heap::POST_HEAP; |
| | 238 | own_state = _Heap::PRE_HEAP; |
| | 239 | own_state = _Heap::IN_HEAP; |
| | 240 | own_state = _Heap::POST_HEAP; |
| | 241 | } |
| 212 | 242 | |
| 213 | | heap.clear(); |
| 214 | | } |
| 215 | | |
| 216 | 243 | _Heap& heap; |
| 217 | 244 | ItemIntMap& map; |
| 218 | | |
| 219 | | Constraints() : heap(0), map(0) {} |
| 220 | 245 | }; |
| 221 | 246 | }; |