-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathHuffmanHeap.cpp
138 lines (107 loc) · 3.32 KB
/
HuffmanHeap.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
#include "HuffmanHeap.h"
// Construtor
// createMinHeap
HuffmanHeap::HuffmanHeap(long capacidade) {
this->capacidade = capacidade;
this->tamanho = 0;
this->raiz = nullptr;
this->arrayNos = new HuffmanNo*[capacidade];
}
// Destrutor
HuffmanHeap::~HuffmanHeap() {
for(int i = 0; i < this->tamanho; i++) {
if(this->arrayNos[i] != nullptr) {
delete arrayNos[i];
}
}
delete [] arrayNos;
}
// Início Getters e Setters
long HuffmanHeap::getTamanho() {
return this->tamanho;
}
void HuffmanHeap::setTamanho(long tamanho) {
this->tamanho = tamanho;
}
long HuffmanHeap::getCapacidade() {
return this->capacidade;
}
void HuffmanHeap::setCapacidade(long capacidade) {
this->capacidade = capacidade;
}
HuffmanNo *HuffmanHeap::getRaiz() {
return this->raiz;
}
void HuffmanHeap::setRaiz(HuffmanNo *raiz) {
this->raiz = raiz;
}
HuffmanNo **HuffmanHeap::getArrayNos() {
return this->arrayNos;
}
void HuffmanHeap::setArrayNos(HuffmanNo **arrayNos) {
this->arrayNos = arrayNos;
}
void HuffmanHeap::setNoArrayNos(HuffmanNo *no, int indice) {
this->arrayNos[indice] = no;
}
// Fim Getters e Setters
//
// Funcao responsavel por inserir um novo no na minHep
void HuffmanHeap::insertMinHeap(HuffmanNo* minHeapNode, int *comparacoes) {
// incrementa total de elementos na heap
++this->tamanho;
int i = this->tamanho - 1;
(*comparacoes) += 2;
while (i && minHeapNode->getFrequencia() < this->arrayNos[(i - 1) / 2]->getFrequencia()) {
(*comparacoes) += 2;
this->arrayNos[i] = this->arrayNos[(i - 1) / 2];
i = (i - 1) / 2;
}
this->arrayNos[i] = minHeapNode;
}
// Recupera o no de valor minimo na heap
HuffmanNo* HuffmanHeap::extractMin(int *comparacoes) {
HuffmanNo* temp = this->arrayNos[0];
this->arrayNos[0] = this->arrayNos[this->tamanho - 1];
--this->tamanho;
minHeapify(0, comparacoes);
return temp;
}
bool HuffmanHeap::isSizeOne() {
return (this->tamanho == 1);
}
// Função responsavel por inverter dois nos
void HuffmanHeap::swapMinHeapNode(HuffmanNo** a, HuffmanNo** b) {
// no auxiliar
HuffmanNo *t = *a;
*a = *b;
*b = t;
}
// Função responsavel por auxiliar a construcao da Heap
void HuffmanHeap::minHeapify(int idx, int *comparacoes) {
int smallest = idx;
int left = 2 * idx + 1;
int right = 2 * idx + 2;
// verificando se o elemento deve trocar de posicao com o elemento da esquerda
(*comparacoes) += 2;
if (left < this->tamanho && this->arrayNos[left]->getFrequencia() < this->arrayNos[smallest]->getFrequencia())
smallest = left;
// verificando se o elemento deve trocar de posicao com o elemento da direira
(*comparacoes) += 2;
if (right < this->tamanho && this->arrayNos[right]->getFrequencia() < this->arrayNos[smallest]->getFrequencia())
smallest = right;
(*comparacoes) += 1;
if (smallest != idx) {
// inverte os dois nos
swapMinHeapNode(&this->arrayNos[smallest], &this->arrayNos[idx]);
// chama recursivo para o novo valor de smallest
minHeapify(smallest, comparacoes);
}
}
// Função responsavel por construir a minHeap
void HuffmanHeap::buildMinHeap(int *comparacoes) {
int n = this->tamanho - 1;
int i;
for (i = (n - 1) / 2; i >= 0; --i)
minHeapify(i, comparacoes);
}