哈夫曼編碼 哈夫曼樹

2021-07-04 21:25:43 字數 1554 閱讀 5463

1.定義

哈夫曼編碼主要用於資料壓縮。

哈夫曼編碼是一種可變長編碼。該編碼將出現頻率高的字元,使用短編碼;將出現頻率低的字元,使用長編碼。

變長編碼的主要問題是,必須實現非字首編碼,即在乙個字符集中,任何乙個字元的編碼都不是另乙個字元編碼的字首。如:0、10就是非字首編碼,而0、01不是非字首編碼。

2.哈夫曼樹的構造

按照字元出現的頻率,總是選擇當前具有較小頻率的兩個節點,組合為乙個新的節點,迴圈此過程知道只剩下乙個節點為止。

對於5個字元a、b、c、d、e,頻率分別用1、5、7、9、6表示,則構造樹的過程如下:

上面過程對應的哈夫曼樹為:

假設規定左邊為0,右邊為1,則變長編碼為:

a 1:010

b 5:011

c 7:10

d 9:11

e 6: 00

3.哈夫曼構造**

1 #include 2 #include 

3using

namespace

std;

4struct

node

14};

1516

int input(node*,int); //

輸入節點資訊

17int buildedtree(node*,int); //

建哈夫曼樹

18int getmin(node*,int); //

尋找未使用的,具有最小頻率值的節點

19int outcoding(node*,int); //

輸出哈夫曼編碼

2021

intmain ()

2232

33int input(node* nodes,int

n)38

return0;

39}4041

int buildedtree(node* nodes,int

n)51

return0;

52}5354

int getmin(node* nodes,int

n)63

}64 (nodes+pos)->isused=true;65

return

pos;66}

6768

int outcoding(node* nodes,int

n)80 strrev(a); //

翻轉字串

81 cout"

83return0;

84 }

執行示例:

哈夫曼樹 哈夫曼編碼

定義從a結點到b結點所經過的分支序列為從a結點到b結點的路徑 定義從a結點到b結點所進過的分支個數為從a結點到b結點的路徑長度 從二叉樹的根結點到二叉樹中所有結點的路徑長度紙盒為該二叉樹的路徑長度 huffman樹 帶權值路徑長度最小的擴充二叉樹應是權值大的外界點舉例根結點最近的擴充二叉樹,該樹即為...

哈夫曼編碼 哈夫曼樹

哈夫曼樹是乙個利用權值進行優化編碼的乙個比較奇怪的樹,他的實現比較簡單,用途也比較單一。哈夫曼樹的實現,實現要求 通過哈夫曼樹可以保證在編碼過程中不會出現例如 1000和100這樣的編碼規則,否則就會編碼失敗,因為1000和100在某些情況下的編碼會一模一樣。通過哈夫曼樹可以保證權值大的值進行編碼時...

哈夫曼樹 哈夫曼編碼

思路 用優先佇列模擬最小化堆的操作,然後用建二叉樹的方法將結點連線好。include include includeusing namespace std typedef struct tree tree struct ss 優先佇列,模擬最小化堆,它其中變數的型別為struct tree 型 tr...