赫夫曼編碼可以很有效的壓縮資料。
我們先來看幾個名詞
1.定長編碼:像ascii編碼,每個字元8位。
2.變長編碼:單個編碼的長度不一致,可以根據整體出現頻率來調節
3.字首編碼:任意乙個字元的編碼都不是另乙個字元的編碼的字首。
我們可以利用二叉樹來設計二進位制的字首編碼。
假設有一棵如上圖的二叉樹,其4個葉子節點分別表示a、b、c、d這4個字元,左分支表示字元'0',右分支表示字元'1',則可以從根結點到葉子結點的路徑上分支字元組成的字串作為該葉子結點字元的編碼。即a、b、c、d的二進位制字首編碼分別為0,10,110,111。
如果在一段要傳送的電文裡面,a、b、c、d出現的概率分別為上圖的葉子結點的權值,那麼使我們要傳送的電文位元組數最少,便轉化為求以a、b、c、d為葉子結點的赫夫曼樹,並為之編碼,這種方式就是為赫夫曼編碼。
赫夫曼編碼的**實現思路:
1.先建立乙個權值從小到大的佇列,假設a權值為8,b權值為6,c權值為4,d權值為2
那麼這個佇列就為
2.再創建起以該隊列為基礎的赫夫曼樹,方法跟資料結構學習日誌之十五--赫夫曼樹一樣。
3.最後建立起以赫夫曼樹為基礎的編碼表,以上圖為例,該錶可為
具體**可見:
資料結構學習記錄17 赫夫曼樹與赫夫編碼
二.赫夫曼編碼 三.實現 首先,我們得了解一下幾個概念 路徑 乙個結點到另乙個結點之間的路徑。路徑長度 路徑上的分支數目叫路徑長度。帶權路徑長度 所有葉子結點的帶權路徑長度之和。如下圖,該樹的路徑長度是 1 2 3 3 9而帶權路徑則是 1 7 2 5 3 2 3 4 35 那麼,我們如何構造一棵赫...
資料結構之赫夫曼樹
每個結點應該包含的資訊有 字元內容 父結點和左右孩子結點的下標 權重以及該字元的編碼。struct hfnode class huffmantree void selectmin int len,int s1,int s2 else if ht i weight min2 void createhf...
資料結構 赫夫曼樹
赫夫曼樹 huffman tree 又稱為最優樹,是一類帶權路徑長度最短的樹。本文僅討論最優二叉樹。樹的路徑長度是指從樹根到樹中其餘各個結點的路徑長度之和。對具有n個結點的二叉樹而言,完全二叉樹具有最短的樹的路徑長度。若在二叉樹中,樹葉結點帶有權值,則有 結點的帶權路徑長度定義為從樹根到該結點之間的...