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