哈夫曼樹編碼

2021-08-10 05:36:45 字數 2464 閱讀 1122



對輸入的英文大寫字母進行統計概率 然後構建哈夫曼樹,輸出是按照概率降序排序輸出huffman編碼 輸入

大寫字母個數 n 第乙個字母 第二個字母 第三個字母 ... 第n個字母 輸出

字母1 出現次數 huffman編碼 

字母2 出現次數 huffman編碼 

字母3 出現次數 huffman編碼  … 

字母n 出現次數 huffman編碼

sample in

10 i i u u u i u n u u

sample out

u 6 1

i 3 01

n 1 00

解決此題首先要明白huffmantree的構造原理

首先來看乙個簡單的例子:

把某個班同學百分制的成績轉換成5分制,規則如下,

90~100     5

80~90       4

70~80       3

60~70       2

<60           1

看起來很容易實現

即 if (score<60)

grade=1;

else if(score<70)

grade=2;

else if(score<80)

grade=3;

else if(score<90)

grade=4;

else

grade=5;

但是如果這個班的同學大多數都取得了90分以上的好成績,那麼前面4步的判斷是很沒必要且費時的。

很明顯,這種演算法在面對大量資料的時候是比較不合理的。

那麼如何優化演算法呢?

假定我們目前已經知道了這個班成績的分布律

成績<60

60~70

70~80

80~90

90~100

比例0.05

0.15

0.33

0.27

0.20

如果用剛才的辦法,則演算法的效率是多少呢,用比例乘上判斷的次數0.05*1+0.15*2+0.33*3+0.27*4+0.20*4=3.22

我們稍微修改一下演算法,先判斷比例最大的,

即   if(score<80)

else if(score<90)

grade=4;

else

grade=5;

改良後的演算法效率為0.05*3+0.15*3+0.33*2+0.27*2+0.2*2=2.2

很明顯,改良後的演算法效率增加了很多。

由樹的定義可以把剛才的程式抽象成下圖所示的"樹":

那麼如何構造乙個效率更好或者最好的搜尋樹呢,這就是哈夫曼樹要解決的問題。

構造huffmantree思想:把權值(頻率)從小到大排序,把權值最小的兩顆二叉樹合併

比如現有權值為1,2,3,4,5的節點(已經排好序)。

1.選擇最小的兩個,即1和2,合併,權值之和為3,

2.從剛才合併好的3和剩下的3,4,5裡選擇兩個最小的,即3和3,合併,權值之和為6

3.從6,4,5裡選擇兩個最小的,即4和5,合併,權值之和為9

4.將6和9合併,權值之和為15

下圖為形成的哈夫曼樹:

對於上面的問題,我們的思路之一應該是這樣

1.統計相同字元出現的次數並記錄之

2.根據統計好的結果構造哈夫曼樹

3.獲得哈夫曼編碼

4.按題目要求格式列印

那麼寫出**就是輕而易舉的事情了:

#include

#include

#include

using namespace std;

template

struct stafrequency

}; template

struct trinode ;

template

class huffmantree ;

void print(int i); };

const int max_weight=9999;

template

huffmantree::huffmantree(t weight,int n)

//構造哈夫曼樹

template

void huffmantree::createhuffmantree(t weight,int n)

} for(n=i;n }

if(flag) //儲存相同字元及個數

}//就寫個最簡單的氣泡排序吧

for(int k=0;khtree(s,num);

for(int i=0;i

return 0; }

哈夫曼編碼 哈夫曼樹

1.定義 哈夫曼編碼主要用於資料壓縮。哈夫曼編碼是一種可變長編碼。該編碼將出現頻率高的字元,使用短編碼 將出現頻率低的字元,使用長編碼。變長編碼的主要問題是,必須實現非字首編碼,即在乙個字符集中,任何乙個字元的編碼都不是另乙個字元編碼的字首。如 0 10就是非字首編碼,而0 01不是非字首編碼。2....

哈夫曼樹 哈夫曼編碼

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

哈夫曼編碼 哈夫曼樹

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