Uj kupac nevezektan
authorklao
Thu, 11 Mar 2004 19:24:28 +0000
changeset 172c645f4a2a6ae
parent 171 ec3d3596e3c9
child 173 de9849252e78
Uj kupac nevezektan
src/include/bin_heap.hh
src/work/bin_heap_demo.cc
     1.1 --- a/src/include/bin_heap.hh	Thu Mar 11 19:19:52 2004 +0000
     1.2 +++ b/src/include/bin_heap.hh	Thu Mar 11 19:24:28 2004 +0000
     1.3 @@ -6,27 +6,27 @@
     1.4  
     1.5  /******
     1.6   *
     1.7 - * BinHeap<KeyType, ValueType, KeyIntMap, [ValueCompare]>
     1.8 + * BinHeap<ItemType, PrioType, ItemIntMap, [PrioCompare]>
     1.9   *
    1.10 - * Ez az osztaly kulcs-ertek parok tarolasara alkalmas binaris kupacot
    1.11 + * Ez az osztaly item-prioritas parok tarolasara alkalmas binaris kupacot
    1.12   * valosit meg.
    1.13 - * A kupacban legfolul mindig az a par talalhato, amiben az _ertek_ a
    1.14 + * A kupacban legfolul mindig az a par talalhato, amiben a prioritas a
    1.15   * legkisebb. (Gondolj a Dijkstra pont-tavolsag kupacara; igazabol ahhoz
    1.16   * lett keszitve...)
    1.17   *
    1.18 - * Megjegyzes: egy kicsit gyanus nekem, hogy a kupacos temakorben nem
    1.19 - * azt hivjak kulcsnak, amit most en annak nevezek. :) En olyan 
    1.20 - * property_map -os ertelemben hasznalom.
    1.21 + * Megjegyzes: a kupacos temakorokben a prioritast kulcsnak szoktak nevezni,
    1.22 + * de mivel ez zavaro tud lenni a property-map-es kulcs-ertek szohasznalata
    1.23 + * miatt, megprobaltunk valami semleges elnevezeseket kitalalni.
    1.24   *
    1.25   * A hasznalatahoz szukseg van egy irhato/olvashato property_map-re, ami
    1.26 - * a kulcsokhoz egy int-et tud tarolni (ezzel tudom megkeresni az illeto
    1.27 + * az itemekhez egy int-et tud tarolni (ezzel tudom megkeresni az illeto
    1.28   * elemet a kupacban a csokkentes es hasonlo muveletekhez).
    1.29   * A map-re csak referenciat tarol, ugy hogy a kupac elete folyan a map-nek
    1.30   * is elnie kell. (???)
    1.31   *
    1.32   * Ketfele modon hasznalhato:
    1.33   * Lusta mod:
    1.34 - * put(Key, Value) metodussal pakolunk a kupacba,
    1.35 + * set(Item, Prio) metodussal pakolunk a kupacba,
    1.36   * aztan o majd eldonti, hogy ez az elem mar benne van-e es ha igen, akkor
    1.37   * csokkentettunk-e rajta, vagy noveltunk.
    1.38   * Ehhez nagyon fontos, hogy az atadott property map inicializalva legyen
    1.39 @@ -35,15 +35,15 @@
    1.40   * (nem jart meg a kupacban PRE_HEAP=-1, epp a kupacban van IN_HEAP=0,
    1.41   *  mar kikerult a kupacbol POST_HEAP=-2).
    1.42   * Szoval ebben a modban a kupac nagyjabol hasznalhato property_map-kent, csak
    1.43 - * meg meg tudja mondani a "legkisebb" erteku elemet. De csak nagyjabol,
    1.44 + * meg meg tudja mondani a "legkisebb" prioritasu elemet. De csak nagyjabol,
    1.45   * hiszen a kupacbol kikerult elemeknek elvesz az ertekuk...
    1.46   *
    1.47   * Kozvetlen mod:
    1.48 - * push(Key, Value) metodussal belerakunk a kupacba (ha az illeto kulcs mar
    1.49 + * push(Item, Prio) metodussal belerakunk a kupacba (ha az illeto kulcs mar
    1.50   * benn volt, akkor gaz).
    1.51 - * increase/decrease(Key k, Value new_value) metodusokkal lehet
    1.52 - * novelni/csokkenteni az illeto kulcshoz tartozo erteket. (Ha nem volt meg
    1.53 - * benne a kupacban az illeto kulcs, vagy nem abba az iranyba valtoztattad
    1.54 + * increase/decrease(Item i, Prio new_prio) metodusokkal lehet
    1.55 + * novelni/csokkenteni az illeto elemhez tartozo prioritast. (Ha nem volt
    1.56 + * megbenne a kupacban az illeto elem, vagy nem abba az iranyba valtoztattad
    1.57   * az erteket, amerre mondtad -- gaz).
    1.58   *
    1.59   * Termeszetesen a fenti ket modot ertelemszeruen lehet keverni.
    1.60 @@ -65,24 +65,24 @@
    1.61  
    1.62  namespace hugo {
    1.63  
    1.64 -  template <typename Key, typename Val, typename KeyIntMap,
    1.65 -	    typename Compare = std::less<Val> >
    1.66 +  template <typename Item, typename Prio, typename ItemIntMap,
    1.67 +	    typename Compare = std::less<Prio> >
    1.68    class BinHeap {
    1.69  
    1.70    public:
    1.71 -    typedef Key	             KeyType;
    1.72 +    typedef Item                             ItemType;
    1.73      // FIXME: stl-ben nem ezt hivjak value_type -nak, hanem a kovetkezot...
    1.74 -    typedef Val              ValueType;
    1.75 -    typedef std::pair<KeyType,ValueType>     PairType;
    1.76 -    typedef KeyIntMap        KeyIntMapType;
    1.77 -    typedef Compare          ValueCompare;
    1.78 +    typedef Prio                             PrioType;
    1.79 +    typedef std::pair<ItemType,PrioType>     PairType;
    1.80 +    typedef ItemIntMap                       ItemIntMapType;
    1.81 +    typedef Compare                          PrioCompare;
    1.82  
    1.83      /**
    1.84 -     * Each Key element have a state associated to it. It may be "in heap",
    1.85 +     * Each Item element have a state associated to it. It may be "in heap",
    1.86       * "pre heap" or "post heap". The later two are indifferent from the
    1.87       * heap's point of view, but may be useful to the user.
    1.88       *
    1.89 -     * The KeyIntMap _should_ be initialized in such way, that it maps
    1.90 +     * The ItemIntMap _should_ be initialized in such way, that it maps
    1.91       * PRE_HEAP (-1) to any element to be put in the heap...
    1.92       */
    1.93      enum state_enum {
    1.94 @@ -95,11 +95,11 @@
    1.95      std::vector<PairType> data;
    1.96      Compare comp;
    1.97      // FIXME: jo ez igy???
    1.98 -    KeyIntMap &kim;
    1.99 +    ItemIntMap &iim;
   1.100  
   1.101    public:
   1.102 -    BinHeap(KeyIntMap &_kim) : kim(_kim) {}
   1.103 -    BinHeap(KeyIntMap &_kim, const Compare &_comp) : comp(_comp), kim(_kim) {}
   1.104 +    BinHeap(ItemIntMap &_iim) : iim(_iim) {}
   1.105 +    BinHeap(ItemIntMap &_iim, const Compare &_comp) : comp(_comp), iim(_iim) {}
   1.106  
   1.107  
   1.108      int size() const { return data.size(); }
   1.109 @@ -117,13 +117,13 @@
   1.110  
   1.111      void move(const PairType &p, int i) {
   1.112        data[i] = p;
   1.113 -      kim.put(p.first, i);
   1.114 +      iim.set(p.first, i);
   1.115      }
   1.116  
   1.117      void rmidx(int h) {
   1.118        int n = data.size()-1;
   1.119        if( h>=0 && h<=n ) {
   1.120 -	kim.put(data[h].first, POST_HEAP);
   1.121 +	iim.set(data[h].first, POST_HEAP);
   1.122  	if ( h<n ) {
   1.123  	  bubble_down(h, data[n], n);
   1.124  	}
   1.125 @@ -137,13 +137,13 @@
   1.126        data.resize(n+1);
   1.127        bubble_up(n, p);
   1.128      }
   1.129 -    void push(const Key &k, const Val &v) { push(PairType(k,v)); }
   1.130 +    void push(const Item &i, const Prio &p) { push(PairType(i,p)); }
   1.131  
   1.132 -    Key top() const {
   1.133 +    Item top() const {
   1.134        // FIXME: test size>0 ?
   1.135        return data[0].first;
   1.136      }
   1.137 -    Val topValue() const {
   1.138 +    Prio topPrio() const {
   1.139        // FIXME: test size>0 ?
   1.140        return data[0].second;
   1.141      }
   1.142 @@ -152,38 +152,38 @@
   1.143        rmidx(0);
   1.144      }
   1.145  
   1.146 -    void erase(const Key &k) {
   1.147 -      rmidx(kim.get(k));
   1.148 +    void erase(const Item &i) {
   1.149 +      rmidx(iim.get(i));
   1.150      }
   1.151  
   1.152 -    const Val get(const Key &k) const {
   1.153 -      int idx = kim.get(k);
   1.154 +    const Prio get(const Item &i) const {
   1.155 +      int idx = iim.get(i);
   1.156        return data[idx].second;
   1.157      }
   1.158 -    void put(const Key &k, const Val &v) {
   1.159 -      int idx = kim.get(k);
   1.160 +    void set(const Item &i, const Prio &p) {
   1.161 +      int idx = iim.get(i);
   1.162        if( idx < 0 ) {
   1.163 -	push(k,v);
   1.164 +	push(i,p);
   1.165        }
   1.166 -      else if( comp(v, data[idx].second) ) {
   1.167 -	bubble_up(idx, PairType(k,v));
   1.168 +      else if( comp(p, data[idx].second) ) {
   1.169 +	bubble_up(idx, PairType(i,p));
   1.170        }
   1.171        else {
   1.172 -	bubble_down(idx, PairType(k,v), data.size());
   1.173 +	bubble_down(idx, PairType(i,p), data.size());
   1.174        }
   1.175      }
   1.176  
   1.177 -    void decrease(const Key &k, const Val &v) {
   1.178 -      int idx = kim.get(k);
   1.179 -      bubble_up(idx, PairType(k,v));
   1.180 +    void decrease(const Item &i, const Prio &p) {
   1.181 +      int idx = iim.get(i);
   1.182 +      bubble_up(idx, PairType(i,p));
   1.183      }
   1.184 -    void increase(const Key &k, const Val &v) {
   1.185 -      int idx = kim.get(k);
   1.186 -      bubble_down(idx, PairType(k,v), data.size());
   1.187 +    void increase(const Item &i, const Prio &p) {
   1.188 +      int idx = iim.get(i);
   1.189 +      bubble_down(idx, PairType(i,p), data.size());
   1.190      }
   1.191  
   1.192 -    state_enum state(const Key &k) const {
   1.193 -      int s = kim.get(k);
   1.194 +    state_enum state(const Item &i) const {
   1.195 +      int s = iim.get(i);
   1.196        if( s>=0 )
   1.197  	s=0;
   1.198        return state_enum(s);
     2.1 --- a/src/work/bin_heap_demo.cc	Thu Mar 11 19:19:52 2004 +0000
     2.2 +++ b/src/work/bin_heap_demo.cc	Thu Mar 11 19:24:28 2004 +0000
     2.3 @@ -25,7 +25,7 @@
     2.4      }
     2.5      return operator[](s);
     2.6    }
     2.7 -  void put(const string &s, int i) {
     2.8 +  void set(const string &s, int i) {
     2.9        operator[](s) = i;
    2.10    }
    2.11  };
    2.12 @@ -45,8 +45,8 @@
    2.13    cout << "heap.push(\"alma\", 15);\n";
    2.14    heap.push("alma", 15);
    2.15  
    2.16 -  cout << "heap.put(\"korte\", 3.4);\n";
    2.17 -  heap.put("korte", 3.4);
    2.18 +  cout << "heap.set(\"korte\", 3.4);\n";
    2.19 +  heap.set("korte", 3.4);
    2.20  
    2.21    cout << "heap.get(\"alma\") = " 
    2.22         << heap.get("alma")
    2.23 @@ -54,24 +54,24 @@
    2.24  
    2.25    cout << "heap.top() = "
    2.26         << heap.top() << endl;
    2.27 -  cout << "heap.topValue() = "
    2.28 -       << heap.topValue() << endl;
    2.29 +  cout << "heap.topPrio() = "
    2.30 +       << heap.topPrio() << endl;
    2.31  
    2.32    cout << "heap.decrease(\"alma\", 1.2);\n";
    2.33 -  heap.put("alma", 1.2);
    2.34 +  heap.set("alma", 1.2);
    2.35  
    2.36    cout << "heap.top() = "
    2.37         << heap.top() << endl;
    2.38 -  cout << "heap.topValue() = "
    2.39 -       << heap.topValue() << endl;
    2.40 +  cout << "heap.topPrio() = "
    2.41 +       << heap.topPrio() << endl;
    2.42  
    2.43 -  cout << "heap.put(\"alma\", 22);\n";
    2.44 -  heap.put("alma", 22);
    2.45 +  cout << "heap.set(\"alma\", 22);\n";
    2.46 +  heap.set("alma", 22);
    2.47  
    2.48    cout << "heap.top() = "
    2.49         << heap.top() << endl;
    2.50 -  cout << "heap.topValue() = "
    2.51 -       << heap.topValue() << endl;
    2.52 +  cout << "heap.topPrio() = "
    2.53 +       << heap.topPrio() << endl;
    2.54  
    2.55    cout << "heap.size() = "
    2.56         << heap.size() << endl;
    2.57 @@ -80,13 +80,13 @@
    2.58  
    2.59    cout << "heap.top() = "
    2.60         << heap.top() << endl;
    2.61 -  cout << "heap.topValue() = "
    2.62 -       << heap.topValue() << endl;
    2.63 +  cout << "heap.topPrio() = "
    2.64 +       << heap.topPrio() << endl;
    2.65  
    2.66    cout << "heap.state(\"szilva\") = "
    2.67         << heap.state("szilva") << endl;
    2.68 -  cout << "heap.put(\"szilva\", 0.5);\n";
    2.69 -  heap.put("szilva", 0.5);
    2.70 +  cout << "heap.set(\"szilva\", 0.5);\n";
    2.71 +  heap.set("szilva", 0.5);
    2.72    cout << "heap.state(\"szilva\") = "
    2.73         << heap.state("szilva") << endl;
    2.74    cout << "heap.top() = "