# HG changeset patch
# User Peter Kovacs <kpeter@inf.elte.hu>
# Date 1247210122 -7200
# Node ID 7124b2581f7244a6eac484b49856815b30b5a625
# Parent bb3392fe91f2414834e3997316905646a19d6cad
Make K a template parameter in KaryHeap (#301)
diff --git a/lemon/kary_heap.h b/lemon/kary_heap.h
|
a
|
b
|
|
| 45 | 45 | /// \tparam PR Type of the priorities of the items. |
| 46 | 46 | /// \tparam IM A read-writable item map with \c int values, used |
| 47 | 47 | /// internally to handle the cross references. |
| | 48 | /// \tparam K The degree of the heap, each node have at most \e K |
| | 49 | /// children. The default is 16. Powers of two are suggested to use |
| | 50 | /// so that the multiplications and divisions needed to traverse the |
| | 51 | /// nodes of the heap could be performed faster. |
| 48 | 52 | /// \tparam CMP A functor class for comparing the priorities. |
| 49 | 53 | /// The default is \c std::less<PR>. |
| 50 | 54 | /// |
| 51 | 55 | ///\sa BinHeap |
| 52 | 56 | ///\sa FouraryHeap |
| 53 | 57 | #ifdef DOXYGEN |
| 54 | | template <typename PR, typename IM, typename CMP> |
| | 58 | template <typename PR, typename IM, int K, typename CMP> |
| 55 | 59 | #else |
| 56 | | template <typename PR, typename IM, typename CMP = std::less<PR> > |
| | 60 | template <typename PR, typename IM, int K = 16, |
| | 61 | typename CMP = std::less<PR> > |
| 57 | 62 | #endif |
| 58 | 63 | class KaryHeap { |
| 59 | 64 | public: |
| … |
… |
|
| 86 | 91 | std::vector<Pair> _data; |
| 87 | 92 | Compare _comp; |
| 88 | 93 | ItemIntMap &_iim; |
| 89 | | int _K; |
| 90 | 94 | |
| 91 | 95 | public: |
| 92 | 96 | /// \brief Constructor. |
| … |
… |
|
| 95 | 99 | /// \param map A map that assigns \c int values to the items. |
| 96 | 100 | /// It is used internally to handle the cross references. |
| 97 | 101 | /// The assigned value must be \c PRE_HEAP (<tt>-1</tt>) for each item. |
| 98 | | explicit KaryHeap(ItemIntMap &map, int K=32) : _iim(map), _K(K) {} |
| | 102 | explicit KaryHeap(ItemIntMap &map) : _iim(map) {} |
| 99 | 103 | |
| 100 | 104 | /// \brief Constructor. |
| 101 | 105 | /// |
| … |
… |
|
| 104 | 108 | /// It is used internally to handle the cross references. |
| 105 | 109 | /// The assigned value must be \c PRE_HEAP (<tt>-1</tt>) for each item. |
| 106 | 110 | /// \param comp The function object used for comparing the priorities. |
| 107 | | KaryHeap(ItemIntMap &map, const Compare &comp, int K=32) |
| 108 | | : _iim(map), _comp(comp), _K(K) {} |
| | 111 | KaryHeap(ItemIntMap &map, const Compare &comp) |
| | 112 | : _iim(map), _comp(comp) {} |
| 109 | 113 | |
| 110 | 114 | /// \brief The number of items stored in the heap. |
| 111 | 115 | /// |
| … |
… |
|
| 127 | 131 | void clear() { _data.clear(); } |
| 128 | 132 | |
| 129 | 133 | private: |
| 130 | | int parent(int i) { return (i-1)/_K; } |
| 131 | | int firstChild(int i) { return _K*i+1; } |
| | 134 | int parent(int i) { return (i-1)/K; } |
| | 135 | int firstChild(int i) { return K*i+1; } |
| 132 | 136 | |
| 133 | 137 | bool less(const Pair &p1, const Pair &p2) const { |
| 134 | 138 | return _comp(p1.second, p2.second); |
| … |
… |
|
| 136 | 140 | |
| 137 | 141 | int findMin(const int child, const int length) { |
| 138 | 142 | int min=child, i=1; |
| 139 | | while( i<_K && child+i<length ) { |
| | 143 | while( i<K && child+i<length ) { |
| 140 | 144 | if( less(_data[child+i], _data[min]) ) |
| 141 | 145 | min=child+i; |
| 142 | 146 | ++i; |