Aleph-w  1.5a.2
Biblioteca general de algoritmos y estructuras de datos
 Todo Clases Archivos Funciones Variables 'typedefs' Enumeraciones Amigas Grupos Páginas
tpl_dynArrayHeap.H
1 # ifndef TPL_DYNARRAYHEAP_H
2 # define TPL_DYNARRAYHEAP_H
3 
4 # include <tpl_dynArray.H>
5 
6 namespace Aleph {
7 
8 
9  template <typename T, class Compare> inline
10 void sift_up(DynArray<T> & a, size_t l, size_t r)
11 {
12  for (size_t p, i = r; i > l; i = p)
13  {
14  p = u_index(i);
15  T & ap = a.access(p);
16  T & ai = a.access(i);
17  if (Compare () (ap, ai)) // ¿cumple propiedad orden?
18  return; // si, todo el arreglo es un heap
19 
20  std::swap(ap, ai); // intercambie y restaure nivel p
21  }
22 }
23 
24  template <typename T, class Compare> inline
25 void sift_down(DynArray<T> & a, size_t l, size_t r)
26 {
27  size_t i = l, c;
28  while (true)
29  {
30  c = l_index(i); // índice del hijo izquierdo (c = i/2)
31  if (c > r) // ¿hay hijo izquierdo?
32  return; // no ==> termine
33 
34  T * ac = & a.access(c);
35  if (c + 1 <= r) // ¿hay hijo derecho?
36  {
37  T * ac1 = & a.access(c + 1);
38  if (Compare () (*ac1, *ac)) // sí ==> escoja menor
39  {
40  c++;
41  ac = ac1;
42  }
43  }
44 
45  T & ai = a.access(i);
46  if (Compare () (ai, *ac)) // ¿cumple propiedad orden?
47  return; // sí ==> termine
48 
49  std::swap(*ac, ai);
50  i = c;
51  }
52 }
53 
54 
68  template <typename T, class Compare = Aleph::less<T>>
70 {
71  DynArray<T> array;
72  size_t num_items;
73 
74  static size_t r_index(const size_t & i)
75  {
76  return (i << 1) + 1; // multiplica i por 2 y suma 1
77  }
78 
79 public:
80 
82  DynArrayHeap(Compare &) : num_items(0)
83  {
84  // empty
85  }
86 
87  DynArrayHeap(Compare && cmp = Compare()) : num_items(0)
88  {
89  // empty
90  }
91 
93  T & top() throw(std::exception, std::underflow_error)
94  {
95  if (num_items == 0)
96  throw std::underflow_error("Heap is empty");
97 
98  return array.access(1);
99  }
100 
110  T & insert(const T & key) throw(std::exception, std::overflow_error)
111  {
112  array.touch(++num_items) = key; // colocar nuevo elemento
113  sift_up<T,Compare>(array, 1, num_items); // restaurar propiedad orden
114  return array.access(num_items);
115  }
116 
126  T getMin() throw(std::exception, std::underflow_error)
127  {
128  if (num_items == 0)
129  throw std::underflow_error("Heap is empty");
130 
131  T & a1 = array.access(1);
132  T ret_val = a1;
133  a1 = array[num_items--];
134  sift_down<T,Compare>(array, 1, num_items); // propiedad orden
135 
136  array.cut(num_items + 1);
137 
138  return ret_val;
139  }
140 
142  T get() throw(std::exception, std::underflow_error)
143  {
144  return getMin();
145  }
146 
148  T getMax() throw(std::exception, std::underflow_error)
149  {
150  return getMin();
151  }
152 
154  const size_t & size() const { return num_items; }
155 
157  bool is_empty() const { return num_items == 0; }
158 };
159 
160 
161 
162 } // end namespace Aleph
163 
164 # endif // TPL_DYNARRAYHEAP_H
Definition: tpl_dynArrayHeap.H:69
T getMin()
Definition: tpl_dynArrayHeap.H:126
bool is_empty() const
Retorna true si el heap está vacío.
Definition: tpl_dynArrayHeap.H:157
T & insert(const T &key)
Definition: tpl_dynArrayHeap.H:110
T & top()
Retorna el menor elemento del heap.
Definition: tpl_dynArrayHeap.H:93
T getMax()
Definition: tpl_dynArrayHeap.H:148
Definition: tpl_dynArray.H:70
DynArrayHeap(Compare &)
Constructor con dimensión por omisión.
Definition: tpl_dynArrayHeap.H:82
T & access(const size_t i)
Definition: tpl_dynArray.H:793
const size_t & size() const
Retorna la cantidad de elementos.
Definition: tpl_dynArrayHeap.H:154

Leandro Rabindranath León