vrecko
virtual reality framework
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
Heaps.h
Go to the documentation of this file.
1 #ifndef HEAPS_H
2 #define HEAPS_H
3 
4 #include <stdio.h>
5 #include <limits.h>
6 
7 // Poznamky:
8 // - Rozsahlejsi porovnani hald je v souboru Heaps_info_CZ.doc
9 // - Plati, ze v rodici je ulozena mensi hodnota nez v detech (nebo si jsou
10 // hodnoty rovny).
11 // (existuji i implementace, ktere pracuji obracene)
12 // - Pri ruseni haldy se nedealokuji prvky.
13 // - Funkce hald Merge a Union vymazou uzly v druhe halde
14 // ( - presunou je do te, ktera zbude).
15 // - Uzivatel nesmi pouzit INT_MIN nebo nizsi pro hodnotu key
16 // v kteremkoliv uzlu (je to specialni hodnota
17 // pouzita ve funkcich Delete jako "zaporne nekonecno")
18 
19 class GenericHeapNode;
20 
21 // _NodeClass musi byt odvozena z GenericHeapNode
22 template <class _NodeClass, class _keyType>
23 class GenericHeap {
24 public:
25 
27  public:
28  _keyType key;
29  };
30 
31  virtual void Insert (_NodeClass *node) = 0;
32  virtual _NodeClass* ExtractMin (void) = 0;
33  virtual void DecreaseKey (_NodeClass *node, _keyType value) = 0;
34  virtual _NodeClass* GetMin (void) = 0;
35  // Tato funkce se od ExtractMin lisi tim, z
36  // prvek z haldy nevymaze
37  virtual _NodeClass* Delete (_NodeClass *node) = 0;
38  // POZOR - Navratova hodnota nemusi byt stejna,
39  // jako vstupni
40 
41  virtual bool IsEmpty() = 0;
42 
43 protected:
44 };
45 
46 
47 
48 class BinomialHeapNode;
49 
50 // _NodeClass musi byt odvozena z BinomialHeapNode
51 template <class _NodeClass, class _keyType>
52 class BinomialHeap : public GenericHeap<_NodeClass, _keyType> {
53 public:
54 
55  class BinomialHeapNode : public GenericHeapNode {
56  public:
60  int degree;
61 
62  virtual void Swap (void *node);
63  // prohodi obsah tohoto uzlu se specifikovanym
64  // (obsah se tady rovna [key]; parent, child, sibling
65  // a degree musi zustat na miste)
66  };
67 
68  BinomialHeap (void);
69  ~BinomialHeap (void);
70 
71  virtual void Insert (_NodeClass *node);
72  virtual _NodeClass* ExtractMin (void);
73  virtual void DecreaseKey (_NodeClass *node, _keyType value);
74  // snizi hodnotu klice na hodnotu [value]
75  virtual _NodeClass* GetMin (void);
76  virtual _NodeClass* Delete (_NodeClass *node);
77 
78  virtual void Union (BinomialHeap<_NodeClass, _keyType> *heap);
79 
80  virtual void FreeAllNodes();
81 
82  virtual bool IsEmpty() { return (head == NULL); }
83 
84 protected:
85  _NodeClass *head;
86 
87  inline void Link (_NodeClass *root1, _NodeClass *root2) {
88  // Pripoji prvni strom "pod" druhy
89  root1->parent = root2;
90  root1->sibling = root2->child;
91  root2->child = root1;
92  root2->degree++;
93  }
95  // Spoji dve haldy tak, aby stromy byly vysledne setrideny
96  // podle velikosti.
97 
98  void FreeNodeSimple(_NodeClass *node);
99  // Uvolni z pameti uzel a jeho potomky
100 };
101 
102 
103 template <class _NodeClass, class _keyType>
105 {
106  _keyType tmp = ((BinomialHeap::BinomialHeapNode*)node)->key;
107  ((BinomialHeap::BinomialHeapNode*)node)->key = key;
108  key = tmp;
109 }
110 
111 
112 // _NodeClass musi byt odvozena z FibonacciHeapNode
113 template <class _NodeClass, class _keyType>
114 class FibonacciHeap : public GenericHeap<_NodeClass, _keyType> {
115 public:
117  public:
122 
123  int degree : ((sizeof(int) * 8) - 1);
124  unsigned int mark : 1;
125  // nebo jenom:
126  // int degree;
127  // bool mark;
128  };
129 
130  FibonacciHeap (void);
131  ~FibonacciHeap (void);
132 
133  virtual void Insert (_NodeClass *node);
134  virtual _NodeClass* ExtractMin (void);
135  virtual void DecreaseKey (_NodeClass *node, _keyType value);
136  virtual _NodeClass* GetMin (void);
137  virtual _NodeClass* Delete (_NodeClass *node);
138 
139  virtual void Union (FibonacciHeap<_NodeClass, _keyType> *heap);
140 
141  virtual void FreeAllNodes();
142 
143  virtual bool IsEmpty() { return (head == NULL); }
144 
145 protected:
146  _NodeClass *head;
147  _NodeClass *min;
148 
149  void Consolidate (void);
150  void Link (_NodeClass *child, _NodeClass *parent);
151  virtual void Cut (_NodeClass *node1, _NodeClass *node2);
152  virtual void CascadingCut (_NodeClass *node);
153 
154  void FreeNodeSimple(_NodeClass *node);
155  // Uvolni z pameti uzel a jeho potomky
156 };
157 
158 
159 // _NodeClass musi byt odvozena z ThinHeapNode
160 template <class _NodeClass, class _keyType>
161 class ThinHeap : public GenericHeap<_NodeClass, _keyType> {
162 public:
163 
164  class ThinHeapNode : public GenericHeapNode {
165  public:
167  // ukazatel na leveho sourozence nebo na otce
168  // (v pripade nejlevejsiho sourozence)
169  // V pripade seznamu korenu je v prvnim korenu
170  // ukazatel na posledni a opacne (cyklicky spojovy seznam)
173 
174  int rank;
175  // Viz popis struktury "thin heap".
176  // POZOR - moje modifikace: Koren zde ma ulozeno
177  // "[skutecny rank] - INT_MIN". Porovnanim proti
178  // nule se da lehce poznat, ze je to koren
179  };
180 
181  ThinHeap (void);
182 
183  virtual void Insert (_NodeClass *node);
184  virtual _NodeClass* ExtractMin (void);
185  virtual void DecreaseKey (_NodeClass *node, _keyType value);
186  virtual _NodeClass* GetMin (void);
187  virtual _NodeClass* Delete (_NodeClass *node);
188 
189  virtual void Union (ThinHeap<_NodeClass, _keyType> *heap);
190 
191  virtual bool IsEmpty() { return (head == NULL); }
192 
193 protected:
194  _NodeClass *head;
195  _NodeClass *min;
196 
197  void Consolidate (void);
198  void Link (_NodeClass *child, _NodeClass *parent);
199 
200  virtual void RepairViolations (_NodeClass *node);
201 };
202 
203 
204 #include "Heaps.cpp"
205 
206 #endif