[Lemon-commits] [lemon_svn] deba: r2244 - in hugo/trunk/lemon: . concept
Lemon SVN
svn at lemon.cs.elte.hu
Mon Nov 6 20:51:12 CET 2006
Author: deba
Date: Fri Oct 14 12:40:00 2005
New Revision: 2244
Modified:
hugo/trunk/lemon/bin_heap.h
hugo/trunk/lemon/concept/heap.h
hugo/trunk/lemon/fib_heap.h
hugo/trunk/lemon/radix_heap.h
Log:
Added clear function to heaps and concept
Modified: hugo/trunk/lemon/bin_heap.h
==============================================================================
--- hugo/trunk/lemon/bin_heap.h (original)
+++ hugo/trunk/lemon/bin_heap.h Fri Oct 14 12:40:00 2005
@@ -109,6 +109,16 @@
/// Returns \c true if and only if the heap stores no items.
bool empty() const { return data.empty(); }
+ /// \brief Make empty this heap.
+ ///
+ /// Make empty this heap.
+ void clear() {
+ for (int i = 0; i < (int)data.size(); ++i) {
+ iim.set(data[i].first, POST_HEAP);
+ }
+ data.clear();
+ }
+
private:
static int parent(int i) { return (i-1)/2; }
static int second_child(int i) { return 2*i+2; }
Modified: hugo/trunk/lemon/concept/heap.h
==============================================================================
--- hugo/trunk/lemon/concept/heap.h (original)
+++ hugo/trunk/lemon/concept/heap.h Fri Oct 14 12:40:00 2005
@@ -61,15 +61,21 @@
/// should be PRE_HEAP (-1) for each element.
explicit Heap(ItemIntMap &_iim) {}
- /// The number of items stored in the heap.
+ /// \brief The number of items stored in the heap.
///
- /// \brief Returns the number of items stored in the heap.
+ /// Returns the number of items stored in the heap.
int size() const { return 0; }
+
/// \brief Checks if the heap stores no items.
///
/// Returns \c true if and only if the heap stores no items.
bool empty() const { return false; }
+ /// \brief Makes empty this heap.
+ ///
+ /// Makes this heap empty.
+ void clear();
+
/// \brief Insert an item into the heap with the given heap.
///
/// Adds \c i to the heap with priority \c p.
@@ -189,6 +195,8 @@
state = _Heap::PRE_HEAP;
state = _Heap::IN_HEAP;
state = _Heap::POST_HEAP;
+
+ heap.clear();
}
_Heap& heap;
Modified: hugo/trunk/lemon/fib_heap.h
==============================================================================
--- hugo/trunk/lemon/fib_heap.h (original)
+++ hugo/trunk/lemon/fib_heap.h Fri Oct 14 12:40:00 2005
@@ -88,143 +88,125 @@
POST_HEAP = -2
};
- ///The constructor
-
- /**
- \c _iimap should be given to the constructor, since it is
- used internally to handle the cross references.
- */
+ /// \brief The constructor
+ ///
+ /// \c _iimap should be given to the constructor, since it is
+ /// used internally to handle the cross references.
explicit FibHeap(ItemIntMap &_iimap)
: minimum(0), iimap(_iimap), num_items() {}
- ///The constructor
-
- /**
- \c _iimap should be given to the constructor, since it is used
- internally to handle the cross references. \c _comp is an
- object for ordering of the priorities.
- */
+ /// \brief The constructor
+ ///
+ /// \c _iimap should be given to the constructor, since it is used
+ /// internally to handle the cross references. \c _comp is an
+ /// object for ordering of the priorities.
FibHeap(ItemIntMap &_iimap, const Compare &_comp) : minimum(0),
iimap(_iimap), comp(_comp), num_items() {}
- ///The number of items stored in the heap.
-
- /**
- Returns the number of items stored in the heap.
- */
+ /// \brief The number of items stored in the heap.
+ ///
+ /// Returns the number of items stored in the heap.
int size() const { return num_items; }
- ///Checks if the heap stores no items.
-
- /**
- Returns \c true if and only if the heap stores no items.
- */
+ /// \brief Checks if the heap stores no items.
+ ///
+ /// Returns \c true if and only if the heap stores no items.
bool empty() const { return num_items==0; }
- ///\c item gets to the heap with priority \c value independently if \c item was already there.
+ /// \brief Make empty this heap.
+ ///
+ /// Make empty this heap.
+ void clear() {
+ for (int i = 0; i < (int)container.size(); ++i) {
+ iimap[container[i].name] = -2;
+ }
+ container.clear(); minimum = 0; num_items = 0;
+ }
- /**
- This method calls \ref push(\c item, \c value) if \c item is not
- stored in the heap and it calls \ref decrease(\c item, \c value) or
- \ref increase(\c item, \c value) otherwise.
- */
+ /// \brief \c item gets to the heap with priority \c value independently
+ /// if \c item was already there.
+ ///
+ /// This method calls \ref push(\c item, \c value) if \c item is not
+ /// stored in the heap and it calls \ref decrease(\c item, \c value) or
+ /// \ref increase(\c item, \c value) otherwise.
void set (Item const item, PrioType const value);
- ///Adds \c item to the heap with priority \c value.
-
- /**
- Adds \c item to the heap with priority \c value.
- \pre \c item must not be stored in the heap.
- */
+ /// \brief Adds \c item to the heap with priority \c value.
+ ///
+ /// Adds \c item to the heap with priority \c value.
+ /// \pre \c item must not be stored in the heap.
void push (Item const item, PrioType const value);
- ///Returns the item with minimum priority relative to \c Compare.
-
- /**
- This method returns the item with minimum priority relative to \c
- Compare.
- \pre The heap must be nonempty.
- */
+ /// \brief Returns the item with minimum priority relative to \c Compare.
+ ///
+ /// This method returns the item with minimum priority relative to \c
+ /// Compare.
+ /// \pre The heap must be nonempty.
Item top() const { return container[minimum].name; }
- ///Returns the minimum priority relative to \c Compare.
-
- /**
- It returns the minimum priority relative to \c Compare.
- \pre The heap must be nonempty.
- */
+ /// \brief Returns the minimum priority relative to \c Compare.
+ ///
+ /// It returns the minimum priority relative to \c Compare.
+ /// \pre The heap must be nonempty.
PrioType prio() const { return container[minimum].prio; }
- ///Returns the priority of \c item.
-
- /**
- This function returns the priority of \c item.
- \pre \c item must be in the heap.
- */
+ /// \brief Returns the priority of \c item.
+ ///
+ /// This function returns the priority of \c item.
+ /// \pre \c item must be in the heap.
PrioType& operator[](const Item& item) {
return container[iimap[item]].prio;
}
- ///Returns the priority of \c item.
-
- /**
- It returns the priority of \c item.
- \pre \c item must be in the heap.
- */
+ /// \brief Returns the priority of \c item.
+ ///
+ /// It returns the priority of \c item.
+ /// \pre \c item must be in the heap.
const PrioType& operator[](const Item& item) const {
return container[iimap[item]].prio;
}
- ///Deletes the item with minimum priority relative to \c Compare.
-
- /**
- This method deletes the item with minimum priority relative to \c
- Compare from the heap.
- \pre The heap must be non-empty.
- */
+ /// \brief Deletes the item with minimum priority relative to \c Compare.
+ ///
+ /// This method deletes the item with minimum priority relative to \c
+ /// Compare from the heap.
+ /// \pre The heap must be non-empty.
void pop();
- ///Deletes \c item from the heap.
-
- /**
- This method deletes \c item from the heap, if \c item was already
- stored in the heap. It is quite inefficient in Fibonacci heaps.
- */
+ /// \brief Deletes \c item from the heap.
+ ///
+ /// This method deletes \c item from the heap, if \c item was already
+ /// stored in the heap. It is quite inefficient in Fibonacci heaps.
void erase (const Item& item);
- ///Decreases the priority of \c item to \c value.
-
- /**
- This method decreases the priority of \c item to \c value.
- \pre \c item must be stored in the heap with priority at least \c
- value relative to \c Compare.
- */
+ /// \brief Decreases the priority of \c item to \c value.
+ ///
+ /// This method decreases the priority of \c item to \c value.
+ /// \pre \c item must be stored in the heap with priority at least \c
+ /// value relative to \c Compare.
void decrease (Item item, PrioType const value);
- ///Increases the priority of \c item to \c value.
-
- /**
- This method sets the priority of \c item to \c value. Though
- there is no precondition on the priority of \c item, this
- method should be used only if it is indeed necessary to increase
- (relative to \c Compare) the priority of \c item, because this
- method is inefficient.
- */
+ /// \brief Increases the priority of \c item to \c value.
+ ///
+ /// This method sets the priority of \c item to \c value. Though
+ /// there is no precondition on the priority of \c item, this
+ /// method should be used only if it is indeed necessary to increase
+ /// (relative to \c Compare) the priority of \c item, because this
+ /// method is inefficient.
void increase (Item item, PrioType const value) {
erase(item);
push(item, value);
}
- ///Returns if \c item is in, has already been in, or has never been in the heap.
-
- /**
- This method returns PRE_HEAP if \c item has never been in the
- heap, IN_HEAP if it is in the heap at the moment, and POST_HEAP
- otherwise. In the latter case it is possible that \c item will
- get back to the heap again.
- */
+ /// \brief Returns if \c item is in, has already been in, or has never
+ /// been in the heap.
+ ///
+ /// This method returns PRE_HEAP if \c item has never been in the
+ /// heap, IN_HEAP if it is in the heap at the moment, and POST_HEAP
+ /// otherwise. In the latter case it is possible that \c item will
+ /// get back to the heap again.
state_enum state(const Item &item) const {
int i=iimap[item];
if( i>=0 ) {
Modified: hugo/trunk/lemon/radix_heap.h
==============================================================================
--- hugo/trunk/lemon/radix_heap.h (original)
+++ hugo/trunk/lemon/radix_heap.h Fri Oct 14 12:40:00 2005
@@ -26,9 +26,6 @@
namespace lemon {
- /// \addtogroup auxdat
- /// @{
-
/// \brief Exception thrown by RadixHeap.
///
/// This Exception is thrown when a smaller priority
@@ -43,6 +40,8 @@
}
};
+ /// \ingroup auxdata
+ ///
/// \brief A Radix Heap implementation.
///
/// This class implements the \e radix \e heap data structure. A \e heap
@@ -108,27 +107,18 @@
/// \brief The constructor.
///
/// The constructor.
- /// \param _iim should be given to the constructor, since it is used
- /// internally to handle the cross references. The value of the map
- /// should be PRE_HEAP (-1) for each element.
- explicit RadixHeap(ItemIntMap &_iim) : iim(_iim) {
- boxes.push_back(RadixBox(0, 1));
- boxes.push_back(RadixBox(1, 1));
- }
-
- /// \brief The constructor.
- ///
- /// The constructor.
///
/// \param _iim It should be given to the constructor, since it is used
/// internally to handle the cross references. The value of the map
/// should be PRE_HEAP (-1) for each element.
///
+ /// \param minimal The initial minimal value of the heap.
/// \param capacity It determines the initial capacity of the heap.
- RadixHeap(ItemIntMap &_iim, int capacity) : iim(_iim) {
- boxes.push_back(RadixBox(0, 1));
- boxes.push_back(RadixBox(1, 1));
- while (upper(boxes.back(), capacity)) {
+ RadixHeap(ItemIntMap &_iim, int minimal = 0, int capacity = 0)
+ : iim(_iim) {
+ boxes.push_back(RadixBox(minimal, 1));
+ boxes.push_back(RadixBox(minimal + 1, 1));
+ while (lower(boxes.size() - 1, capacity + minimal - 1)) {
extend();
}
}
@@ -142,6 +132,21 @@
/// Returns \c true if and only if the heap stores no items.
bool empty() const { return data.empty(); }
+ /// \brief Make empty this heap.
+ ///
+ /// Make empty this heap.
+ void clear(int minimal = 0, int capacity = 0) {
+ for (int i = 0; i < (int)data.size(); ++i) {
+ iim[data[i].item] = -2;
+ }
+ data.clear(); boxes.clear();
+ boxes.push_back(RadixBox(minimal, 1));
+ boxes.push_back(RadixBox(minimal + 1, 1));
+ while (lower(boxes.size() - 1, capacity + minimal - 1)) {
+ extend();
+ }
+ }
+
private:
bool upper(int box, Prio prio) {
@@ -271,7 +276,7 @@
public:
- /// \brief Insert an item into the heap with the given heap.
+ /// \brief Insert an item into the heap with the given priority.
///
/// Adds \c i to the heap with priority \c p.
/// \param i The item to insert.
@@ -292,7 +297,7 @@
/// This method returns the item with minimum priority.
/// \pre The heap must be nonempty.
Item top() const {
- const_cast<RadixHeap<Item, ItemIntMap>*>(this)->moveDown();
+ const_cast<RadixHeap<Item, ItemIntMap>&>(*this).moveDown();
return data[boxes[0].first].item;
}
@@ -301,7 +306,7 @@
/// It returns the minimum priority.
/// \pre The heap must be nonempty.
Prio prio() const {
- const_cast<RadixHeap<Item, ItemIntMap>*>(this)->moveDown();
+ const_cast<RadixHeap<Item, ItemIntMap>&>(*this).moveDown();
return data[boxes[0].first].prio;
}
More information about the Lemon-commits
mailing list