Alap leiras a BinHeap -rol
authorklao
Tue, 27 Jan 2004 21:23:33 +0000
changeset 3928b0d751d29f
parent 38 edea2e1dc6ef
child 40 ffaa9448964c
Alap leiras a BinHeap -rol

BinHeap::state() befejezese
src/include/bin_heap.hh
src/work/bin_heap_demo.cc
     1.1 --- a/src/include/bin_heap.hh	Tue Jan 27 19:17:46 2004 +0000
     1.2 +++ b/src/include/bin_heap.hh	Tue Jan 27 21:23:33 2004 +0000
     1.3 @@ -1,3 +1,61 @@
     1.4 +/* FIXME: Copyright ... 
     1.5 + *
     1.6 + * This implementation is heavily based on STL's heap functions and
     1.7 + * the similar class by Alpar Juttner in IKTA...
     1.8 + */
     1.9 +
    1.10 +/******
    1.11 + *
    1.12 + * BinHeap<KeyType, ValueType, KeyIntMap, [ValueCompare]>
    1.13 + *
    1.14 + * Ez az osztaly kulcs-ertek parok tarolasara alkalmas binaris kupacot
    1.15 + * valosit meg.
    1.16 + * A kupacban legfolul mindig az a par talalhato, amiben az _ertek_ a
    1.17 + * legkisebb. (Gondolj a Dijkstra pont-tavolsag kupacara; igazabol ahhoz
    1.18 + * lett keszitve...)
    1.19 + *
    1.20 + * Megjegyzes: egy kicsit gyanus nekem, hogy a kupacos temakorben nem
    1.21 + * azt hivjak kulcsnak, amit most en annak nevezek. :) En olyan 
    1.22 + * property_map -os ertelemben hasznalom.
    1.23 + *
    1.24 + * A hasznalatahoz szukseg van egy irhato/olvashato property_map-re, ami
    1.25 + * a kulcsokhoz egy int-et tud tarolni (ezzel tudom megkeresni az illeto
    1.26 + * elemet a kupacban a csokkentes es hasonlo muveletekhez).
    1.27 + * A map-re csak referenciat tarol, ugy hogy a kupac elete folyan a map-nek
    1.28 + * is elnie kell. (???)
    1.29 + *
    1.30 + * Ketfele modon hasznalhato:
    1.31 + * Lusta mod:
    1.32 + * put(Key, Value) metodussal pakolunk a kupacba,
    1.33 + * aztan o majd eldonti, hogy ez az elem mar benne van-e es ha igen, akkor
    1.34 + * csokkentettunk-e rajta, vagy noveltunk.
    1.35 + * Ehhez nagyon fontos, hogy az atadott property map inicializalva legyen
    1.36 + * minden szobajovo kulcs ertekre, -1 -es ertekkel!
    1.37 + * Es ilyen esetben a kulcsokrol lekerdezheto az allapotuk a state metodussal:
    1.38 + * (nem jart meg a kupacban PRE_HEAP=-1, epp a kupacban van IN_HEAP=0,
    1.39 + *  mar kikerult a kupacbol POST_HEAP=-2).
    1.40 + * Szoval ebben a modban a kupac nagyjabol hasznalhato property_map-kent, csak
    1.41 + * meg meg tudja mondani a "legkisebb" erteku elemet. De csak nagyjabol,
    1.42 + * hiszen a kupacbol kikerult elemeknek elvesz az ertekuk...
    1.43 + *
    1.44 + * Kozvetlen mod:
    1.45 + * push(Key, Value) metodussal belerakunk a kupacba (ha az illeto kulcs mar
    1.46 + * benn volt, akkor gaz).
    1.47 + * increase/decrease(Key k, Value new_value) metodusokkal lehet
    1.48 + * novelni/csokkenteni az illeto kulcshoz tartozo erteket. (Ha nem volt meg
    1.49 + * benne a kupacban az illeto kulcs, vagy nem abba az iranyba valtoztattad
    1.50 + * az erteket, amerre mondtad -- gaz).
    1.51 + *
    1.52 + * Termeszetesen a fenti ket modot ertelemszeruen lehet keverni.
    1.53 + * Ja es mindig nagyon gaz, ha belepiszkalsz a map-be, amit a kupac
    1.54 + * hasznal. :-))
    1.55 + *
    1.56 + *
    1.57 + * Bocs, most faradt vagyok, majd egyszer leforditom. (Misi)
    1.58 + *
    1.59 + */
    1.60 +
    1.61 +
    1.62  #ifndef BIN_HEAP_HH
    1.63  #define BIN_HEAP_HH
    1.64  
    1.65 @@ -27,8 +85,7 @@
    1.66       * The KeyIntMap _should_ be initialized in such way, that it maps
    1.67       * PRE_HEAP (-1) to any element to be put in the heap...
    1.68       */
    1.69 -
    1.70 -    enum state {
    1.71 +    enum state_enum {
    1.72        IN_HEAP = 0,
    1.73        PRE_HEAP = -1,
    1.74        POST_HEAP = -2
    1.75 @@ -82,10 +139,11 @@
    1.76  
    1.77      void pop() {
    1.78        int n = data.size()-1;
    1.79 -      if ( n>0 ) {
    1.80 -	bubble_down(0, data[n], n);
    1.81 -      }
    1.82 -      if ( n>=0 ) {
    1.83 +      if( n>=0 ) {
    1.84 +	kim.put(data[0].first, POST_HEAP);
    1.85 +	if ( n>0 ) {
    1.86 +	  bubble_down(0, data[n], n);
    1.87 +	}
    1.88  	data.pop_back();
    1.89        }
    1.90      }
    1.91 @@ -116,6 +174,13 @@
    1.92        bubble_down(idx, PairType(k,v), data.size());
    1.93      }
    1.94  
    1.95 +    state_enum state(const Key &k) const {
    1.96 +      int s = kim.get(k);
    1.97 +      if( s>=0 )
    1.98 +	s=0;
    1.99 +      return state_enum(s);
   1.100 +    }
   1.101 +
   1.102    }; // class BinHeap
   1.103  
   1.104    
     2.1 --- a/src/work/bin_heap_demo.cc	Tue Jan 27 19:17:46 2004 +0000
     2.2 +++ b/src/work/bin_heap_demo.cc	Tue Jan 27 21:23:33 2004 +0000
     2.3 @@ -8,6 +8,11 @@
     2.4  
     2.5  class string_int_map;
     2.6  
     2.7 +// Egy binaris kupac, ami stringekhez rendelt double ertekeket tarol,
     2.8 +// azaz mindig az a string van a tetejen, amihez a legkisebb szam tartozik.
     2.9 +// A kupac egy string_int_map tipusu property_map segitsegevel tarolja
    2.10 +// a stringek aktualis helyet sajatmagan belul.
    2.11 +// Egy olyan stringhez, ami meg nincsen a kupac -1 -et kell rendelnunk.
    2.12  typedef BinHeap<string, double, string_int_map> StrDoubleHeap;
    2.13  
    2.14  class string_int_map : public map<string,int> {
    2.15 @@ -78,6 +83,19 @@
    2.16    cout << "heap.topValue() = "
    2.17         << heap.topValue() << endl;
    2.18  
    2.19 +  cout << "heap.state(\"szilva\") = "
    2.20 +       << heap.state("szilva") << endl;
    2.21 +  cout << "heap.put(\"szilva\", 0.5);\n";
    2.22 +  heap.put("szilva", 0.5);
    2.23 +  cout << "heap.state(\"szilva\") = "
    2.24 +       << heap.state("szilva") << endl;
    2.25 +  cout << "heap.top() = "
    2.26 +       << heap.top() << endl;
    2.27 +  cout << "heap.pop();\n";
    2.28 +  heap.pop();
    2.29 +  cout << "heap.state(\"szilva\") = "
    2.30 +       << heap.state("szilva") << endl;
    2.31 +
    2.32    cout << "heap.size() = "
    2.33         << heap.size() << endl;
    2.34    cout << "heap.pop();\n";
    2.35 @@ -88,4 +106,3 @@
    2.36    cout << "heap.empty() = "
    2.37         << (heap.empty()?"true":"false") << endl;  
    2.38  }
    2.39 -