?? huffman_template_algorithm.html
字號:
//##### PART : DECLARATIONS #############################
//#######################################################
template <typename SYMBOL, typename WEIGHT>
class Cell;
template <typename SYMBOL, typename WEIGHT>
class Node;
template <typename SYMBOL, typename WEIGHT>
class InternalNode ;
template <typename SYMBOL, typename WEIGHT>
class TerminalNode ;
template <typename SYMBOL, typename WEIGHT, unsigned int ARY>
class BasicHuffmanTree;
template <typename SYMBOL, typename WEIGHT, unsigned int ARY = 2>
class LoadedHuffmanTree;
template <typename WEIGHT, unsigned int ARY = 2>
class DriedHuffmanTree;
template <typename SYMBOL, typename WEIGHT>
class lessNodesCompare;
template <typename SYMBOL, typename WEIGHT>
class lessNodesCorrectingCompare01;
template <typename SYMBOL, typename WEIGHT>
class lessNodesCorrectingCompare02;
template <typename SYMBOL, typename WEIGHT>
class lessCellsCompare;
template <typename T1>
class lessVectorsAlterCompare;
<a NAME="label_Cell_class"></a>
//#######################################################
//##### PART : template class <b><a href="#label_Cell_method">Cell</a></b> ######################
//############ <font color="FF00FF"><b>Definition</b></font> ###############################
//#######################################################
//----------- template class Cell -----------
template <typename SYMBOL, typename WEIGHT>
class Cell
{
template <typename S1, typename W1, unsigned int A1> friend class BasicHuffmanTree;
friend class TerminalNode<SYMBOL, WEIGHT>;
friend class lessCellsCompare<SYMBOL, WEIGHT>;
friend istream& operator>> <SYMBOL, WEIGHT> (istream &str_o, Cell<SYMBOL, WEIGHT>& instance_i);
private :
SYMBOL data_symbol_;
WEIGHT data_weight_;
unsigned int symbol_original_index_;
vector<CODE> symbol_path_;
protected :
public :
Cell () {}
Cell (
const SYMBOL& data_symbol_i,
const WEIGHT& data_weight_i,
unsigned int symbol_original_index_i = UINT_MAX
);
virtual ~Cell () {}
};
<a NAME="label_Node_class"></a>
//#######################################################
//##### PART : template class <b><a href="#label_Node_method">Node</a></b> ######################
//############ <font color="FF00FF"><b>Definition</b></font> ###############################
//#######################################################
//----------- template class Node -----------
template <typename SYMBOL, typename WEIGHT>
class Node
{
template <typename S1, typename W1, unsigned int A1> friend class BasicHuffmanTree;
friend class InternalNode<SYMBOL, WEIGHT>;
friend class lessNodesCompare<SYMBOL, WEIGHT>;
friend class lessNodesCorrectingCompare01<SYMBOL, WEIGHT>;
friend class lessNodesCorrectingCompare02<SYMBOL, WEIGHT>;
friend ostream& operator<< <SYMBOL, WEIGHT> (ostream &str_o, const Node<SYMBOL, WEIGHT>& instance_i);
typedef map<SYMBOL, WEIGHT, less<SYMBOL> > Node_MAP_SYMBOLS;
private :
protected :
Node_MAP_SYMBOLS mapSymbols_;
WEIGHT weight_;
bool is_TerminalNode_;
int absorbtion_stage_;
int creation_stage_;
public :
Node () {weight_ = WEIGHT (); absorbtion_stage_ = -2; creation_stage_ = -1;}
virtual ~Node () {}
};
<a NAME="label_InternalNode_class"></a>
//#######################################################
//##### PART : template class <b><a href="#label_InternalNode_method">InternalNode</a></b> ##############
//############ <font color="FF00FF"><b>Definition</b></font> ###############################
//#######################################################
//----------- template class InternalNode -----------
template <typename SYMBOL, typename WEIGHT>
class InternalNode : public Node<SYMBOL, WEIGHT>
{
template <typename S1, typename W1, unsigned int A1> friend class BasicHuffmanTree;
private :
vector<Node<SYMBOL, WEIGHT>*> arc_;
protected :
void addNode (Node<SYMBOL, WEIGHT> const * const ptr2_i);
public :
InternalNode () {is_TerminalNode_ = false;}
~InternalNode () {}
};
<a NAME="label_TerminalNode_class"></a>
//#######################################################
//##### PART : template class <b><a href="#label_TerminalNode_method">TerminalNode</a></b> ##############
//############ <font color="FF00FF"><b>Definition</b></font> ###############################
//#######################################################
//----------- template class TerminalNode -----------
template <typename SYMBOL, typename WEIGHT>
class TerminalNode : public Node<SYMBOL, WEIGHT>
{
template <typename S1, typename W1, unsigned int A1> friend class BasicHuffmanTree;
private :
protected :
public :
TerminalNode () {is_TerminalNode_ = true;}
TerminalNode (const Cell<SYMBOL, WEIGHT>& cell_i);
~TerminalNode () {}
};
//#######################################################
//##### PART : template class less... ###################
//#######################################################
//#######################################################
//----------- template class lessNodesCompare -----------
template <typename SYMBOL, typename WEIGHT>
class lessNodesCompare
{
public:
bool operator()(
const Node<SYMBOL, WEIGHT>* const left_i,
const Node<SYMBOL, WEIGHT>* const right_i
)
{
return (left_i->weight_ < right_i->weight_);
}
};
//#######################################################
//------- template class lessNodesCorrectingCompare01 -----
template <typename SYMBOL, typename WEIGHT>
class lessNodesCorrectingCompare01
{
public:
bool operator()(
const Node<SYMBOL, WEIGHT>* const left_i,
const Node<SYMBOL, WEIGHT>* const right_i
)
{
return ((left_i->weight_ == right_i->weight_) ? (!(left_i->is_TerminalNode_)) : (left_i->weight_ < right_i->weight_));
}
};
//#######################################################
//------- template class lessNodesCorrectingCompare02 -----
template <typename SYMBOL, typename WEIGHT>
class lessNodesCorrectingCompare02
{
public:
bool operator()(
const Node<SYMBOL, WEIGHT>* const left_i,
const Node<SYMBOL, WEIGHT>* const right_i
)
{
return ((left_i->is_TerminalNode_ == right_i->is_TerminalNode_) ? (left_i->weight_ < right_i->weight_) : (!(left_i->is_TerminalNode_)));
}
};
//#######################################################
//----------- template class lessCellsCompare -----------
template <typename SYMBOL, typename WEIGHT>
class lessCellsCompare
{
public:
bool operator()(
const Cell<SYMBOL, WEIGHT>& left_i,
const Cell<SYMBOL, WEIGHT>& right_i
)
{
return (left_i.data_weight_ < right_i.data_weight_);
}
};
//#######################################################
//----------- template class lessVectorsAlterCompare -----------
template <typename T1>
class lessVectorsAlterCompare
{
public:
bool operator()(
const vector<T1>& left_i,
const vector<T1>& right_i
)
{
if (left_i.size () < right_i.size ())
{
return true;
}
if (left_i.size () > right_i.size ())
{
return false;
}
return (left_i < right_i);
}
};
<a NAME="label_BasicHuffmanTree_class"></a>
//#######################################################
//##### PART : template class <b><a href="#label_BasicHuffmanTree_method">BasicHuffmanTree</a></b> ##########
//############ <font color="FF00FF"><b>Definition</b></font> ###############################
//#######################################################
//#######################################################
//----------- template class BasicHuffmanTree -----------
template <typename SYMBOL, typename WEIGHT, unsigned int ARY>
class BasicHuffmanTree
{
typedef map<SYMBOL, Cell<SYMBOL, WEIGHT>, less<SYMBOL> > Tree_MAP_SYMBOLS;
typedef map<vector<CODE>, SYMBOL, less<vector<CODE> > > Tree_MAP_HUFFMAN_DECODING;
private :
Tree_MAP_SYMBOLS mapAlphabet_;
Tree_MAP_HUFFMAN_DECODING mapHuffmanCodes_;
InternalNode<SYMBOL, WEIGHT> rootNode_;
vector<vector<CODE> > vectorHuffmanCodes_;
void createAllTerminalNodes (
const vector<Cell<SYMBOL, WEIGHT> >& data_vector_i,
vector<Node<SYMBOL, WEIGHT>*>& vectorHuffmanProcess_i
);
void createInternalNode (
vector<Node<SYMBOL, WEIGHT>*>& vectorHuffmanProcess_i,
int cur_stage_i
);
void createHuffmanTree (
vector<Node<SYMBOL, WEIGHT>*>& vectorHuffmanProcess_i
);
void doBeautyTreatment (
vector<Node<SYMBOL, WEIGHT>*>& vectorHuffmanProcess_i
);
void storeHuffmanCodes ();
bool encodeOneSymbol (
const SYMBOL& symbol_i,
vector<CODE>& path_o)
const;
bool decodeOneSymbol (
const vector<CODE>& encoded_msg_i,
unsigned int& cur_start_position_io,
unsigned int& cur_symbol_number_io,
vector<CODE>& cur_symbol_code_o,
SYMBOL& cur_symbol_value_o
) const;
bool decodeOneSymbol (
const vector<CODE>& encoded_symbol_code_i,
SYMBOL& decoded_symbol_value_o
) const;
bool testAllCodes (bool show_i = false) const;
void showHuffmanProcessStatus (
vector<Node<SYMBOL, WEIGHT>*>& vectorHuffmanProcess_i,
int cur_stage_i = 0,
const string& msg_i = string ()
) const;
static void print_show_title_S (
const string& spaces_offset_i,
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -