《資料結構》期末提綱之Huffman樹

2021-09-24 20:49:26 字數 1900 閱讀 6761

分為3步:

1)將每個節點視作一棵樹,全部節點組成乙個森林。

2)選取所有樹中權值最小的兩棵樹,分別作為乙個新節點的左子樹與右子樹,構成一棵新樹,該樹的權值為左右兩棵子樹權值之和。

3)重複步驟二直到僅剩一棵樹,該樹為所求huffman樹。

如圖所示:

比如說要傳輸乙個由abcdef組成字串,每個字母採用0與1編碼,傳統編碼方式需要用到三位。假設要傳輸這樣乙個字串:abbbbccddddddddeeeeefffffff,即六個字母出現次數分別為1、4、2、8、5、7時,按照傳統編碼方式需要傳輸81位。然而,並不是每個字母都要用到三位編碼,而且傳輸位數越多成本越高。所以,需要用最少的位數傳輸這樣的字串,就要為每個字母重新編碼。這種編碼就叫做huffman編碼。

huffman編碼分為三部。首先按權值構造huffman樹,然後將該樹所有節點與左孩子連線路徑標0,與右孩子的標1,根到葉子節點的路徑為葉子節點的huffman編碼。如圖所示:(還是上面的例子)

對字元進行huffman編碼後,傳輸上述字串僅用64位,明顯少於傳統編碼的81位。

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define eps 1e-6

#define inf 0x3f3f3f3f

#define pi acos(-1.0)

#define m 1000000007

using

namespace std;

typedef

long

long ll;

const

int maxn =

1e5+6;

char s[maxn]

;struct node //節點結構體

;bool

cmp(node* x,node* y)

vector

> a;

//充當優先佇列

intmain()

//以下為huffman樹構造

while

(a.size()

>1)

node* huffman = a.

back()

; a.

pop_back()

;//彈出僅剩的乙個樹,即huffman樹

//以下為對huffman樹的廣度優先遍歷

queue

> q2;

//bfs佇列

q2.push

(huffman)

;while

(!q2.

empty()

) cout << endl;}if

(now-

>l_child !=

null

)//存在左孩子時

if(now-

>r_child !=

null)}

return0;

}

二叉樹:傳送門

bfs:傳送門(未寫)

總提綱:《資料結構》期末提綱小結

《資料結構》期末提綱之棧

由於順序棧使限定操作的順序表,所以其為順序表的私有繼承,特此宣告。順序表實現不在本博文贅述。傳送門 template class datatype class seqstack private seqlist 順序棧類,為順序表的私有繼承 template class datatype 會對線性表進...

《資料結構》期末提綱之樹與森林(側重原理)

停更了三天,補番去了 頹廢 森林是n棵互不相交的樹。由於雙親儲存與孩子鍊錶儲存的樹的有關操作與圖的有關操作類似,樹的孩子兄弟儲存有關操作與二叉樹類似,樹的層序遍歷本質為bfs,此處僅提供雙親儲存與孩子鍊錶表示法的型別 template class t struct tree node templat...

資料結構期末考試提綱(重點複習知識彙總)

資料結構期末複習系列 陸續更新 查詢 順序表 樹表 雜湊表 題型實練 內部排序 題型實練 今天因為特殊教育情況,為了保證成績公平,線上考試取消了選擇和填空題,只有計算題和演算法題。以下是我總結的資料結構老師給畫了兩個小時的重點。對於不同學校的學生僅作參考。第七章查詢佔比最大,第八章內部排序和第五章樹...