哈夫曼樹與哈夫曼編碼

2022-09-18 04:06:36 字數 1532 閱讀 6792

哈夫曼樹是一種簡單的樹結構,建樹過程如下:

給出一組資料,不斷選擇最小的兩個數,並用兩個數的和作為它們的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.哈夫曼樹的形態不是唯...

哈夫曼樹與哈夫曼編碼

哈夫曼樹是一種簡單的樹結構,建樹過程如下 給出一組資料,不斷選擇最小的兩個數,並用兩個數的和作為它們的parent節點,再從資料中刪除這兩個數,將兩個數的和加入資料中,直到所有的資料都被加入樹結構,形成一顆樹。這顆樹的所有非葉子節點都有兩個child,兩個child的值的和則是這個節點的值,根節點是...