diff -r 0977046c60d2 -r 65a0521e744e lemon/fourary_heap.h --- a/lemon/fourary_heap.h Sat Sep 26 07:21:54 2009 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,342 +0,0 @@ -/* -*- mode: C++; indent-tabs-mode: nil; -*- - * - * This file is a part of LEMON, a generic C++ optimization library. - * - * Copyright (C) 2003-2009 - * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport - * (Egervary Research Group on Combinatorial Optimization, EGRES). - * - * Permission to use, modify and distribute this software is granted - * provided that this copyright notice appears in all copies. For - * precise terms see the accompanying LICENSE file. - * - * This software is provided "AS IS" with no warranty of any kind, - * express or implied, and with no claim as to its suitability for any - * purpose. - * - */ - -#ifndef LEMON_FOURARY_HEAP_H -#define LEMON_FOURARY_HEAP_H - -///\ingroup heaps -///\file -///\brief Fourary heap implementation. - -#include -#include -#include - -namespace lemon { - - /// \ingroup heaps - /// - ///\brief Fourary heap data structure. - /// - /// This class implements the \e fourary \e heap data structure. - /// It fully conforms to the \ref concepts::Heap "heap concept". - /// - /// The fourary heap is a specialization of the \ref KaryHeap "K-ary heap" - /// for K=4. It is similar to the \ref BinHeap "binary heap", - /// but its nodes have at most four children, instead of two. - /// - /// \tparam PR Type of the priorities of the items. - /// \tparam IM A read-writable item map with \c int values, used - /// internally to handle the cross references. - /// \tparam CMP A functor class for comparing the priorities. - /// The default is \c std::less. - /// - ///\sa BinHeap - ///\sa KaryHeap -#ifdef DOXYGEN - template -#else - template > -#endif - class FouraryHeap { - public: - /// Type of the item-int map. - typedef IM ItemIntMap; - /// Type of the priorities. - typedef PR Prio; - /// Type of the items stored in the heap. - typedef typename ItemIntMap::Key Item; - /// Type of the item-priority pairs. - typedef std::pair Pair; - /// Functor type for comparing the priorities. - typedef CMP Compare; - - /// \brief Type to represent the states of the items. - /// - /// Each item has a state associated to it. It can be "in heap", - /// "pre-heap" or "post-heap". The latter two are indifferent from the - /// heap's point of view, but may be useful to the user. - /// - /// The item-int map must be initialized in such way that it assigns - /// \c PRE_HEAP (-1) to any element to be put in the heap. - enum State { - IN_HEAP = 0, ///< = 0. - PRE_HEAP = -1, ///< = -1. - POST_HEAP = -2 ///< = -2. - }; - - private: - std::vector _data; - Compare _comp; - ItemIntMap &_iim; - - public: - /// \brief Constructor. - /// - /// Constructor. - /// \param map A map that assigns \c int values to the items. - /// It is used internally to handle the cross references. - /// The assigned value must be \c PRE_HEAP (-1) for each item. - explicit FouraryHeap(ItemIntMap &map) : _iim(map) {} - - /// \brief Constructor. - /// - /// Constructor. - /// \param map A map that assigns \c int values to the items. - /// It is used internally to handle the cross references. - /// The assigned value must be \c PRE_HEAP (-1) for each item. - /// \param comp The function object used for comparing the priorities. - FouraryHeap(ItemIntMap &map, const Compare &comp) - : _iim(map), _comp(comp) {} - - /// \brief The number of items stored in the heap. - /// - /// This function returns the number of items stored in the heap. - int size() const { return _data.size(); } - - /// \brief Check if the heap is empty. - /// - /// This function returns \c true if the heap is empty. - bool empty() const { return _data.empty(); } - - /// \brief Make the heap empty. - /// - /// This functon makes the heap empty. - /// It does not change the cross reference map. If you want to reuse - /// a heap that is not surely empty, you should first clear it and - /// then you should set the cross reference map to \c PRE_HEAP - /// for each item. - void clear() { _data.clear(); } - - private: - static int parent(int i) { return (i-1)/4; } - static int firstChild(int i) { return 4*i+1; } - - bool less(const Pair &p1, const Pair &p2) const { - return _comp(p1.second, p2.second); - } - - void bubbleUp(int hole, Pair p) { - int par = parent(hole); - while( hole>0 && less(p,_data[par]) ) { - move(_data[par],hole); - hole = par; - par = parent(hole); - } - move(p, hole); - } - - void bubbleDown(int hole, Pair p, int length) { - if( length>1 ) { - int child = firstChild(hole); - while( child+30) bubbleDown(0, _data[n], n); - _data.pop_back(); - } - - /// \brief Remove the given item from the heap. - /// - /// This function removes the given item from the heap if it is - /// already stored. - /// \param i The item to delete. - /// \pre \e i must be in the heap. - void erase(const Item &i) { - int h = _iim[i]; - int n = _data.size()-1; - _iim.set(_data[h].first, POST_HEAP); - if( h=0) s=0; - return State(s); - } - - /// \brief Set the state of an item in the heap. - /// - /// This function sets the state of the given item in the heap. - /// It can be used to manually clear the heap when it is important - /// to achive better time complexity. - /// \param i The item. - /// \param st The state. It should not be \c IN_HEAP. - void state(const Item& i, State st) { - switch (st) { - case POST_HEAP: - case PRE_HEAP: - if (state(i) == IN_HEAP) erase(i); - _iim[i] = st; - break; - case IN_HEAP: - break; - } - } - - /// \brief Replace an item in the heap. - /// - /// This function replaces item \c i with item \c j. - /// Item \c i must be in the heap, while \c j must be out of the heap. - /// After calling this method, item \c i will be out of the - /// heap and \c j will be in the heap with the same prioriority - /// as item \c i had before. - void replace(const Item& i, const Item& j) { - int idx = _iim[i]; - _iim.set(i, _iim[j]); - _iim.set(j, idx); - _data[idx].first = j; - } - - }; // class FouraryHeap - -} // namespace lemon - -#endif // LEMON_FOURARY_HEAP_H