AlgoPlus v0.1.0
Loading...
Searching...
No Matches
min_heap.h
1#ifndef MIN_HEAP_H
2#define MIN_HEAP_H
3#ifdef __cplusplus
4#include <climits>
5#include <cstdint>
6#include <functional>
7#include <iostream>
8#include <vector>
9#endif
10
11// This is needed to avoid conflict with windows __min macro
12#undef __min
13
18template <typename T> class min_heap {
19 private:
20 T* arr;
21 size_t max_size{};
22 size_t heap_size{0};
23
24 public:
30 inline explicit min_heap(size_t max_size) noexcept : arr(new T[max_size]) {
31
32 this->max_size = max_size;
33 }
34
35 inline ~min_heap() noexcept { delete[] arr; }
36
42 inline T parent(T i) { return (i - 1) / 2; }
43
49 inline T _left(T i) { return (2 * i + 1); }
50
56 inline T _right(T i) { return (2 * i + 2); }
57
62 inline T _min() {
63 if (heap_size <= 0) {
64 return INT_MAX;
65 }
66 if (heap_size == 1) {
67 heap_size--;
68 return arr[0];
69 }
70 T root = arr[0];
71 arr[0] = arr[heap_size - 1];
72 heap_size--;
73 heapify(0);
74 return root;
75 }
76
81 inline T min() { return arr[0]; }
82
83 inline void decrease_key(T i, T key) {
84 arr[i] = key;
85 while (i != 0 && arr[parent(i)] > arr[i]) {
86 std::swap(arr[i], arr[parent(i)]);
87 i = parent(i);
88 }
89 }
90
96 inline void insert(T key) {
97 try {
98 if (heap_size == max_size) {
99 throw std::invalid_argument("Heap reached maximum size");
100 } else {
101 heap_size++;
102 size_t i = heap_size - 1;
103 arr[i] = key;
104 while (i != 0 && arr[parent(i)] > arr[i]) {
105 std::swap(arr[i], arr[parent(i)]);
106 i = parent(i);
107 }
108 }
109 } catch (std::invalid_argument& e) {
110 std::cerr << e.what() << '\n';
111 return;
112 }
113 }
114
120 inline void remove(T key) {
121 decrease_key(key, INT_MIN);
122 _min();
123 }
124
130 inline void heapify(T i) {
131 T left = _left(i);
132 T right = _right(i);
133 T minim = i;
134 if (left < heap_size && arr[left] < arr[i]) {
135 minim = left;
136 }
137 if (right < heap_size && arr[right] < arr[i]) {
138 minim = right;
139 }
140 if (minim != i) {
141 std::swap(arr[i], arr[minim]);
142 heapify(minim);
143 }
144 }
145};
146
147#endif
min heap class
Definition min_heap.h:18
T _min()
__min function Returns the minimum with heapify
Definition min_heap.h:62
T min()
min function. Returns the minimum of the heap(the first element)
Definition min_heap.h:81
min_heap(size_t max_size) noexcept
Construct a new min heap object.
Definition min_heap.h:30
T _left(T i)
__left function
Definition min_heap.h:49
void heapify(T i)
heapify function
Definition min_heap.h:130
void insert(T key)
insert function
Definition min_heap.h:96
T _right(T i)
__right function
Definition min_heap.h:56
void remove(T key)
remove function
Definition min_heap.h:120
T parent(T i)
parent function
Definition min_heap.h:42