32 # include <tpl_binNodeUtils.H> 33 # include <tpl_treap.H> 34 # include <tpl_binHeap.H> 35 # include <tpl_dynMapTree.H> 36 # include <bitArray.H> 47 struct Huffman_Node :
public BinHeap<size_t>::Node
56 :
BinHeap<size_t>::Node(0), bin_node(nullptr), freq_node(nullptr)
62 :
BinHeap<size_t>::Node(0), bin_node(node), freq_node(nullptr)
73 static inline const size_t & get_freq(Huffman_Node * huffman_node) noexcept
75 return huffman_node->get_key();
79 static inline void increase_freq(Huffman_Node * huffman_node) noexcept
81 huffman_node->get_key()++;
85 static inline void set_freq(Huffman_Node * huffman_node,
const size_t & freq)
88 huffman_node->get_key() = freq;
94 return LLINK(p) ==
nullptr and
RLINK(p) ==
nullptr;
118 const string & str = p->get_key();
122 array.
push(0); build_prefix_encoding(
LLINK(p), array); array.
pop();
123 array.
push(1); build_prefix_encoding(
RLINK(p), array); array.
pop();
126 void build_encoding_map()
128 assert(symbol_map.
size() > 0);
131 throw domain_error(
"Huffman encoding tree has not been generated");
135 build_prefix_encoding(root, array);
138 bool test_end(
const string & str)
const 140 if (end_symbol ==
"NO-END")
142 return end_symbol == str;
145 void update_freq(
const string & str)
148 throw domain_error(
"Huffman encoding tree has already been generated");
151 throw domain_error(
"End symbol has already been inserted");
153 Huffman_Node * huffman_node =
nullptr;
154 auto huffman_node_ptr = symbol_map.
search(str);
155 if (huffman_node_ptr ==
nullptr)
158 huffman_node =
static_cast<Huffman_Node*
> 159 (heap.
insert(
new Huffman_Node(bin_node_auto.get())));
160 symbol_map.
insert(str, huffman_node);
161 bin_node_auto.release();
164 huffman_node = huffman_node_ptr->second;
166 increase_freq(huffman_node);
167 heap.
update(huffman_node);
170 static void append_code(
BitArray & bit_stream,
const BitArray & symbol_code)
172 const size_t symbol_code_size = symbol_code.
size();
173 for (
int i = 0; i < symbol_code_size; i++)
174 bit_stream.
push(symbol_code[i]);
181 : root(nullptr), freq_root(nullptr), end_symbol(
"NO-END"), text_len(0)
192 return is_leaf(p) ? p->get_key() :
"";
201 input >> p->get_key();
224 throw std::domain_error(
"Huffman tree has not been generated");
226 Aleph::save_tree<BinNode<string>> (root, output);
272 throw std::domain_error(
"Huffman tree has not been generated");
274 Aleph::save_tree_in_array_of_chars<BinNode<string>, Get_Key>
275 (root, array_name, output);
282 throw std::domain_error(
"Huffman tree has not been generated");
305 while (heap.
size() > 1)
307 Huffman_Node * l_huffman_node = (Huffman_Node*) heap.
getMin();
308 Huffman_Node * r_huffman_node = (Huffman_Node*) heap.
getMin();
310 Huffman_Node * huffman_node =
new Huffman_Node (bin_node);
311 LLINK(bin_node) = l_huffman_node->bin_node;
312 RLINK(bin_node) = r_huffman_node->bin_node;
313 const size_t new_freq = get_freq(l_huffman_node) +
314 get_freq(r_huffman_node);
315 Aleph::set_freq(huffman_node, new_freq);
319 Freq_Node *& l_freq_node = l_huffman_node->freq_node;
320 if (l_freq_node ==
nullptr)
323 l_freq_node->get_key().first =
324 l_huffman_node->bin_node->get_key();
325 l_freq_node->get_key().second = l_huffman_node->get_key();
328 Freq_Node *& r_freq_node = r_huffman_node->freq_node;
329 if (r_freq_node ==
nullptr)
332 r_freq_node->get_key().first =
333 r_huffman_node->bin_node->get_key();
334 r_freq_node->get_key().second = r_huffman_node->get_key();
337 const string str = to_string(new_freq);
338 Freq_Node *& freq_node = huffman_node->freq_node;
340 freq_node->get_key().first = str;
341 freq_node->get_key().second = huffman_node->get_key();
342 LLINK(freq_node) = l_freq_node;
343 RLINK(freq_node) = r_freq_node;
346 delete l_huffman_node;
347 delete r_huffman_node;
348 heap.
insert(huffman_node);
351 Huffman_Node * huffman_root = (Huffman_Node *) heap.
getMin();
352 root = huffman_root->bin_node;
355 freq_root = huffman_root->freq_node;
358 build_encoding_map();
381 root = Aleph::load_tree<BinNode<string>>(input);
387 if (freq_root ==
nullptr)
388 throw std::domain_error(
"Huffman tree has not been generated");
402 void set_freq(
const string & str,
const size_t & freq)
405 throw domain_error(
"Huffman encoding tree has already been generated");
407 throw domain_error(
"End symbol has already been inserted");
410 auto huffman_node_ptr = symbol_map.
search(str);
411 if (huffman_node_ptr !=
nullptr)
413 std::string msg =
"Frequency for symbol " + str +
" has already set";
414 throw std::domain_error(msg);
418 Huffman_Node * huffman_node =
new Huffman_Node(bin_node_auto.get());
419 Aleph::set_freq(huffman_node, freq);
420 heap.
insert(huffman_node);
421 symbol_map.
insert(str, huffman_node);
422 bin_node_auto.release();
427 static const size_t Max_Token_Size = 256;
443 void read_input(
char * input,
const bool & with_freqs =
false)
446 throw domain_error(
"Huffman encoding tree has already been generated");
448 char * curr_stream = input;
449 char curr_token[Max_Token_Size];
450 curr_token[1] =
'\0';
452 while (*curr_stream !=
'\0')
454 curr_token[0] = *curr_stream++;
455 update_freq(curr_token);
459 set_end_of_stream(
"");
460 generate_huffman_tree(with_freqs);
475 void read_input(ifstream & input,
const bool & with_freqs =
false)
478 throw domain_error(
"Huffman encoding tree has already been generated");
481 curr_token[0] = curr_token[1] =
'\0';
483 while (not input.eof())
485 input.read(curr_token, 1);
486 update_freq(curr_token);
490 set_end_of_stream(
"");
491 generate_huffman_tree(with_freqs);
498 throw domain_error(
"End symbol has already been inserted");
501 throw domain_error(
"Huffman encoding tree has already been generated");
503 unique_ptr<BinNode<string> > bin_node_auto (
new BinNode<string> (str) );
505 Huffman_Node * huffman_node =
static_cast<Huffman_Node*
> 506 (heap.
insert(
new Huffman_Node(bin_node_auto.get())));
507 symbol_map.
insert(str, huffman_node);
508 bin_node_auto.release();
528 throw std::domain_error(
"Huffman tree has not been generated");
530 char * curr_stream = input;
531 char curr_token[Max_Token_Size];
532 curr_token[1] =
'\0';
533 while (*curr_stream !=
'\0')
535 curr_token[0] = *curr_stream++;
536 append_code(bit_stream, code_map.
find(curr_token));
538 append_code(bit_stream, code_map.
find(
""));
540 return bit_stream.
size();
559 throw std::domain_error(
"Huffman tree has not been generated");
561 curr_token[0] = curr_token[1] =
'\0';
562 while (not input.eof())
564 input.read(curr_token, 1);
565 append_code(bit_stream, code_map.
find(curr_token));
567 append_code(bit_stream, code_map.
find(
""));
568 return bit_stream.
size();
592 : root(p), end_symbol(end)
601 throw std::domain_error(
"Huffman tree has not been generated");
619 const size_t & bit_stream_len = bit_stream.
size();
621 for (
int i = 0; i < bit_stream_len; ++i)
630 throw std::domain_error(
"Invalid bits sequence");
634 const string & symbol = p->get_key();
635 if (symbol == end_symbol)
int read_bit(const size_t i) const
Definition: bitArray.H:280
Pair * insert(const Key &key, const Data &data)
Definition: tpl_dynMapTree.H:112
Huffman_Encoder_Engine()
Constructor de codificador.
Definition: Huffman.H:180
BinNode< string > *& get_root()
Retorna la raÃz del árbol decodificador de Huffman.
Definition: Huffman.H:279
Definition: bitArray.H:135
Freq_Node *& get_freq_root()
Retorna la raÃz de un árbol de frecuencias.
Definition: Huffman.H:385
Node * insert(Node *p) noexcept
Definition: tpl_binHeap.H:587
size_t size() const noexcept
Retorna la dimensión del arreglo de bits.
Definition: bitArray.H:241
void read_input(char *input, const bool &with_freqs=false)
Definition: Huffman.H:443
Huffman_Decoder_Engine(BinNode< string > *p, const string &end)
Definition: Huffman.H:591
void save_tree(ostream &output)
Definition: Huffman.H:221
BinNode< string > * generate_huffman_tree(const bool &with_freqs=false)
Definition: Huffman.H:303
size_t encode(ifstream &input, BitArray &bit_stream)
Definition: Huffman.H:556
void push(const unsigned int value)
Inserta al final del arreglo el valor value.
Definition: bitArray.H:347
void update(Node *p) noexcept
Definition: tpl_binHeap.H:686
void set_end_of_stream(const string &str)
Define el sÃmbolo fin de entrada.
Definition: Huffman.H:495
Node *& LLINK(Node *p) noexcept
Definition: tpl_binNode.H:298
void read_input(ifstream &input, const bool &with_freqs=false)
Definition: Huffman.H:475
Pair * search(const Key &key) const noexcept
Definition: tpl_dynMapTree.H:214
Node * getMin()
Definition: tpl_binHeap.H:663
Definition: Huffman.H:577
void destroyRec(Node *&root) noexcept
Definition: tpl_binNodeUtils.H:500
void pop()
Elimina el último bit del arreglo.
Definition: bitArray.H:353
Node for binary search tree.
const size_t & size() const
Retorna la cardinalidad del conjunto.
Definition: tpl_dynSetTree.H:502
Definition: Huffman.H:102
Definition: tpl_binHeap.H:940
void load_tree(ifstream &input)
Definition: Huffman.H:376
void set_freq(const string &str, const size_t &freq)
Definition: Huffman.H:402
const size_t & size() const noexcept
Retorna la cardinalidad del heap.
Definition: tpl_binHeap.H:763
size_t encode(char *input, BitArray &bit_stream)
Definition: Huffman.H:525
void save_tree_in_array_of_chars(const string &array_name, ostream &output)
Definition: Huffman.H:269
void decode(BitArray &bit_stream, ostream &output)
Definition: Huffman.H:617
void empty()
Elimina todos los elementos del conjunto.
Definition: tpl_dynSetTree.H:133
Node *& RLINK(Node *p) noexcept
Definition: tpl_binNode.H:307
BinNode< string > *& get_root()
Retorna la raÃz del árbol decodificador de Huffman.
Definition: Huffman.H:598
Data & find(const Key &key)
Definition: tpl_dynMapTree.H:242