1、演算法流程
(1)構建霍夫曼樹:自底向上
根據統計頻率構建霍夫曼樹:
a、把所有的節點扔進排序佇列queue
中;b、從queue
選擇選擇前面兩個最小的元素a、
b,把最小的樹
a作為左節點,把最小的
b作為右節點,以此構建父節點
c(c的頻率值為
a+b的頻率值
),然後把a、
b從佇列刪除、把
c節點插入佇列;
c、迴圈(a)
、(b)
步驟構建霍夫曼樹,直到
queue
為空。(2)編碼階段:自頂向下
a、除了樹的根節點沒有碼值之外,其他的根據左右子節點進行編碼,做節點編碼為0
,右節點編碼為1;
b、子節點在父節點碼值的基礎上,在後面加上一位對應的碼值。
(3)解碼階段:自頂向下解碼
根據給定的碼值,從樹根開始遞迴遍歷,遇到0
向左走,遇到
1向又走,直到碼值為空或者遇到葉子節點返回。
2、**實現
#ifndef data_struct_tree_h
#define data_struct_tree_h
#include#include #include #include using namespace std;
class node;
~node(){};
node* left_child;
node* right_child;
int frequency;
std::vectorcoding;
string words;
public:
bool operator <(const node& n1) const}}
//自頂向下編碼
static void huffman_encoding(node*head)
if(n->right_child)}}
static string huffman_decoding(node*head,vectorcoding)
else
}static void main();
string words[5]=;
std::setqueue;
for(int i=0;i<5;i++)
std::vectortree;
create_tree(queue,tree);
huffman_encoding(tree[tree.size()-1]);
//列印編碼結果
for(std::vector::iterator it=tree.begin();it!=tree.end();it++)
std::coutstd::coutstd::cout<
資料結構與演算法 霍夫曼樹 霍夫曼編碼和解碼
找出存放一串字元所需的最少的二進位制編碼。首先統計出每種字元出現的頻率,即 概率 權值。例如 頻率表 a 60,b 45,c 13 d 69 e 14 f 5 g 3 第一步 找出字元中頻率最小的兩個,小的在左邊,大的在右邊,組成二叉樹。在頻率表中刪除此次找到的兩個數,並加入此次最小兩個數的頻率和。...
資料結構之樹(五)霍夫曼編碼樹
1 概述 霍夫曼編碼是一種基於最小冗餘編碼的壓縮演算法。最小冗餘編碼是指,如果知道一組資料中符號出現的頻率,就可以用一種特殊的方式來表示符號從而減少資料需要的儲存空間。2 定義 霍夫曼樹 給定n個權值作為n個葉子結點,構造一棵二叉樹,若帶權路徑長度達到最小,稱這樣的二叉樹為最優二叉樹,也稱為哈夫曼樹...
資料結構 霍夫曼樹
帶權路徑長度最小的樹,常用於資料通訊中。構造霍夫曼樹演算法 設給定的一組權值為,據此生成森林f f 中的沒棵二叉樹只有乙個帶權為w1的根節點 i 1,2,n 在f中選取兩棵根節點的權值最小和次小的二叉樹作為左右構造一棵新的二叉樹,新二叉樹根節點的權值為其左 右子樹根節點的權值之和。在f中刪除這兩棵最...