[Lemon-commits] [lemon_svn] klao: r53 - in hugo/trunk/src: include work
Lemon SVN
svn at lemon.cs.elte.hu
Mon Nov 6 20:37:02 CET 2006
Author: klao
Date: Tue Jan 27 22:23:33 2004
New Revision: 53
Modified:
hugo/trunk/src/include/bin_heap.hh
hugo/trunk/src/work/bin_heap_demo.cc
Log:
Alap leiras a BinHeap -rol
BinHeap::state() befejezese
Modified: hugo/trunk/src/include/bin_heap.hh
==============================================================================
--- hugo/trunk/src/include/bin_heap.hh (original)
+++ hugo/trunk/src/include/bin_heap.hh Tue Jan 27 22:23:33 2004
@@ -1,3 +1,61 @@
+/* FIXME: Copyright ...
+ *
+ * This implementation is heavily based on STL's heap functions and
+ * the similar class by Alpar Juttner in IKTA...
+ */
+
+/******
+ *
+ * BinHeap<KeyType, ValueType, KeyIntMap, [ValueCompare]>
+ *
+ * Ez az osztaly kulcs-ertek parok tarolasara alkalmas binaris kupacot
+ * valosit meg.
+ * A kupacban legfolul mindig az a par talalhato, amiben az _ertek_ a
+ * legkisebb. (Gondolj a Dijkstra pont-tavolsag kupacara; igazabol ahhoz
+ * lett keszitve...)
+ *
+ * Megjegyzes: egy kicsit gyanus nekem, hogy a kupacos temakorben nem
+ * azt hivjak kulcsnak, amit most en annak nevezek. :) En olyan
+ * property_map -os ertelemben hasznalom.
+ *
+ * A hasznalatahoz szukseg van egy irhato/olvashato property_map-re, ami
+ * a kulcsokhoz egy int-et tud tarolni (ezzel tudom megkeresni az illeto
+ * elemet a kupacban a csokkentes es hasonlo muveletekhez).
+ * A map-re csak referenciat tarol, ugy hogy a kupac elete folyan a map-nek
+ * is elnie kell. (???)
+ *
+ * Ketfele modon hasznalhato:
+ * Lusta mod:
+ * put(Key, Value) metodussal pakolunk a kupacba,
+ * aztan o majd eldonti, hogy ez az elem mar benne van-e es ha igen, akkor
+ * csokkentettunk-e rajta, vagy noveltunk.
+ * Ehhez nagyon fontos, hogy az atadott property map inicializalva legyen
+ * minden szobajovo kulcs ertekre, -1 -es ertekkel!
+ * Es ilyen esetben a kulcsokrol lekerdezheto az allapotuk a state metodussal:
+ * (nem jart meg a kupacban PRE_HEAP=-1, epp a kupacban van IN_HEAP=0,
+ * mar kikerult a kupacbol POST_HEAP=-2).
+ * Szoval ebben a modban a kupac nagyjabol hasznalhato property_map-kent, csak
+ * meg meg tudja mondani a "legkisebb" erteku elemet. De csak nagyjabol,
+ * hiszen a kupacbol kikerult elemeknek elvesz az ertekuk...
+ *
+ * Kozvetlen mod:
+ * push(Key, Value) metodussal belerakunk a kupacba (ha az illeto kulcs mar
+ * benn volt, akkor gaz).
+ * increase/decrease(Key k, Value new_value) metodusokkal lehet
+ * novelni/csokkenteni az illeto kulcshoz tartozo erteket. (Ha nem volt meg
+ * benne a kupacban az illeto kulcs, vagy nem abba az iranyba valtoztattad
+ * az erteket, amerre mondtad -- gaz).
+ *
+ * Termeszetesen a fenti ket modot ertelemszeruen lehet keverni.
+ * Ja es mindig nagyon gaz, ha belepiszkalsz a map-be, amit a kupac
+ * hasznal. :-))
+ *
+ *
+ * Bocs, most faradt vagyok, majd egyszer leforditom. (Misi)
+ *
+ */
+
+
#ifndef BIN_HEAP_HH
#define BIN_HEAP_HH
@@ -27,8 +85,7 @@
* The KeyIntMap _should_ be initialized in such way, that it maps
* PRE_HEAP (-1) to any element to be put in the heap...
*/
-
- enum state {
+ enum state_enum {
IN_HEAP = 0,
PRE_HEAP = -1,
POST_HEAP = -2
@@ -82,10 +139,11 @@
void pop() {
int n = data.size()-1;
- if ( n>0 ) {
- bubble_down(0, data[n], n);
- }
- if ( n>=0 ) {
+ if( n>=0 ) {
+ kim.put(data[0].first, POST_HEAP);
+ if ( n>0 ) {
+ bubble_down(0, data[n], n);
+ }
data.pop_back();
}
}
@@ -116,6 +174,13 @@
bubble_down(idx, PairType(k,v), data.size());
}
+ state_enum state(const Key &k) const {
+ int s = kim.get(k);
+ if( s>=0 )
+ s=0;
+ return state_enum(s);
+ }
+
}; // class BinHeap
Modified: hugo/trunk/src/work/bin_heap_demo.cc
==============================================================================
--- hugo/trunk/src/work/bin_heap_demo.cc (original)
+++ hugo/trunk/src/work/bin_heap_demo.cc Tue Jan 27 22:23:33 2004
@@ -8,6 +8,11 @@
class string_int_map;
+// Egy binaris kupac, ami stringekhez rendelt double ertekeket tarol,
+// azaz mindig az a string van a tetejen, amihez a legkisebb szam tartozik.
+// A kupac egy string_int_map tipusu property_map segitsegevel tarolja
+// a stringek aktualis helyet sajatmagan belul.
+// Egy olyan stringhez, ami meg nincsen a kupac -1 -et kell rendelnunk.
typedef BinHeap<string, double, string_int_map> StrDoubleHeap;
class string_int_map : public map<string,int> {
@@ -78,6 +83,19 @@
cout << "heap.topValue() = "
<< heap.topValue() << endl;
+ cout << "heap.state(\"szilva\") = "
+ << heap.state("szilva") << endl;
+ cout << "heap.put(\"szilva\", 0.5);\n";
+ heap.put("szilva", 0.5);
+ cout << "heap.state(\"szilva\") = "
+ << heap.state("szilva") << endl;
+ cout << "heap.top() = "
+ << heap.top() << endl;
+ cout << "heap.pop();\n";
+ heap.pop();
+ cout << "heap.state(\"szilva\") = "
+ << heap.state("szilva") << endl;
+
cout << "heap.size() = "
<< heap.size() << endl;
cout << "heap.pop();\n";
@@ -88,4 +106,3 @@
cout << "heap.empty() = "
<< (heap.empty()?"true":"false") << endl;
}
-
More information about the Lemon-commits
mailing list