-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathhuffman_utility.cpp
109 lines (99 loc) · 2.92 KB
/
huffman_utility.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
#include"huffman.h"
using namespace std;
void HuffmanTree::buildFrequencyTable() {
int streamSize = dataStream.length();
for (int i = 0; i < streamSize; i++) {
char character = dataStream[i];
if (frequencyTable.find(character) == frequencyTable.end())
frequencyTable.insert(pair<char, int>(character, 1));
else
frequencyTable[character]++;
}
}
void HuffmanTree::copyTo_minHeap() {
for (auto i = frequencyTable.begin(); i != frequencyTable.end(); i++) {
keyNode newKeyNode;
newKeyNode.data = i->first;
newKeyNode.frequency = i->second;
newKeyNode.rightNode = NULL;
newKeyNode.leftNode = NULL;
hTree.heapStructure.push_back(newKeyNode);
}
}
void HuffmanTree::minHeapify(int i) {
int parent = i;
int left = (i * 2) + 1;
int right= (i * 2) + 2;
if (hTree.size() > left && hTree.heapStructure[left].frequency < hTree.heapStructure[parent].frequency)
parent = left;
if (hTree.size() > right && hTree.heapStructure[right].frequency < hTree.heapStructure[parent].frequency)
parent = right;
if (parent != i) {
swap(hTree.heapStructure[i], hTree.heapStructure[parent]);
minHeapify(parent);
}
}
void HuffmanTree::buildMinHeap() {
for (int i = 0; i < hTree.size() / 2 + 1; i++) {
minHeapify(i);
}
}
void HuffmanTree::writeToFile(bool mode) {
if (mode) {
bitsetR bitStorage(outputStream);
// Convert Map to Vector (Boost Library bug fix)
vector<p> tempVector;
for (auto i = codeTable.begin(); i != codeTable.end(); i++) {
p newPair;
newPair.a = i->first; newPair.bits = i->second;
tempVector.push_back(newPair);
}
// Serialize the data
{
ofstream file(outputPath, ios::out);
boost::archive::binary_oarchive outFile(file);
outFile << tempVector;
outFile << bitStorage;
}
}
else {
ofstream file(outputPath, ios::out);
file << outputStream;
file.close();
}
}
void HuffmanTree::constructTreeFromVector(vector<p> in) {
// Insert a new empty node in our tree
keyNode varKeyNode;
hTree.heapStructure.push_back(varKeyNode);
for (auto i = in.begin(); i != in.end(); i++) {
// Extract character and bitstream
char varChr = i->a;
string varString;
to_string(i->bits.x, varString);
keyNode* refPointer = &hTree.heapStructure[0];
// Traverse and insert
for (size_t x = 0; x != varString.length(); x++) {
if (varString[x] == '0') { // Go left
if (refPointer->leftNode == NULL)
refPointer->leftNode = new keyNode;
refPointer = refPointer->leftNode;
}
else if(varString[x] == '1') { // Go Right
if (refPointer->rightNode == NULL)
refPointer->rightNode = new keyNode;
refPointer = refPointer->rightNode;
}
}
// Insert the value
refPointer->data = varChr;
refPointer = NULL;
}
}
void HuffmanTree::deleteTree(keyNode* node) {
if (node == NULL) return;
deleteTree(node->leftNode);
deleteTree(node->rightNode);
delete node;
node = NULL;
}