哈夫曼樹是一種簡單的樹結構,建樹過程如下:
給出一組資料,不斷選擇最小的兩個數,並用兩個數的和作為它們的parent節點,再從資料中刪除這兩個數,將兩個數的和加入資料中,直到所有的資料都被加入樹結構,形成一顆樹。
這顆樹的所有非葉子節點都有兩個child,兩個child的值的和則是這個節點的值,根節點是初始資料的總和。
哈夫曼樹有多種用途,這裡講解一下哈夫曼編碼。
哈夫曼編碼是將所給資料生成哈夫曼樹後,從根節點開始,給每個節點的left child新增一位編碼0,right child新增一位編碼1,如圖,編碼完成後,則每個節點有了對應的二進位制編碼,如圖中值為2的節點編碼為010100,值為13的節點編碼為00.
哈夫曼樹有廣泛的應用,例如在建立字型檔時,根據每個字元的使用頻率,將使用頻率高的字元編乙個較短的編碼,而將使用頻率低的字元編乙個較大的編碼,來有效的節省空間。下面我展示一下哈夫曼編碼的**。
#pragma once#include之後我用圖中樹進行一次測試:#include
inthuffman_n;
std::
string
huffman_code_res[max_n];
struct
node
bool
operator
} huffman_node[
2 *max_n];
void
add_huffman_code(node tmp)
void
make_huffman_tree()
node a, b;
while (!pq.empty())
;pq.push(huffman_node[a.id +huffman_n]);
}add_huffman_code(a);
}
void測試結果如下:huffman_codetest()
make_huffman_tree();
for (int i = 0;i < huffman_n;++i)
cout
<< i << "
"<< huffman_node[i].freq << "
"<< huffman_code_res[i] <
}
72 3 5 8 13 15 18
0 2 11110
1 3 11111
2 5 1110
3 8 110
4 13 00
5 15 01
6 18 10
請按任意鍵繼續. . .
可以看到,雖然由於建樹順序的差別,和圖中編碼有所不同,但是位數一致,哈夫曼樹成功的按照使用頻率的區別給不同的id進行了編碼。根據結果來推斷,這棵樹的樣子是下面這樣:
哈夫曼樹與哈夫曼編碼
在一般的資料結構的書中,樹的那章後面,著者一般都會介紹一下哈夫曼 huffman 樹和哈夫曼編碼。哈夫曼編碼是哈夫曼樹的乙個應用。哈夫曼編碼應用廣泛,如 jpeg中就應用了哈夫曼編碼。首先介紹什麼是哈夫曼樹。哈夫曼樹又稱最優二叉樹,是一種帶權路徑長度最短的二叉樹。所謂樹的帶權路徑長度,就是樹中所有的...
哈夫曼樹與哈夫曼編碼
1.哈夫曼 huffman 編碼是哈夫曼樹的乙個應用。2.哈夫曼樹又稱為最優二叉樹,是一種帶權路徑長度最短的二叉樹。所謂樹的帶權路徑長度,就是樹中所有的葉結點的相對值乘上其到根結點的路徑和權值。3.影象jpg就是利用了哈夫曼編碼。4.哈夫曼樹是最優二叉樹,子樹有左右次序之分。5.哈夫曼樹的形態不是唯...
哈夫曼樹與哈夫曼編碼
1 什麼是哈夫曼樹 談到哈夫曼樹,需要了解樹的路徑長度 樹的帶權路徑長度和最優二叉樹的概念。1 樹的路徑長度 樹的路徑長度是從樹根到樹中每一結點的路徑長度之和。在結點數目相同的二叉樹中,完全二叉樹的路徑長度最短 2 樹的帶權路徑長度 weighted path length of tree,簡記為w...