赫夫曼編碼

2021-08-01 08:16:38 字數 1112 閱讀 4481

//赫夫曼編碼:最優二叉樹,是帶權路徑長度最短的二叉樹; 根據結點的個數和權值不同,最優二叉樹的形狀也不同

//將每個帶有權值的結點作為一顆僅有根結點 的二叉樹,樹的權值為節點的權值

//將其中兩顆權值最小 的樹組成一顆新二叉樹,新樹的權值為兩棵樹的權值和

//重複上述兩個步驟

//最優二叉樹的左右子樹可以互換,不影響樹的帶權路徑長度

//最優二叉樹的節點數是葉子的2倍-1;

//赫夫曼編碼:設定初態——獲取終態——從葉子到根逆序編碼

首先建立赫夫曼樹,n個葉子有2*n-1個結點的樹,用順序儲存結構a儲存;初態設定如上圖(a)所示;parent=-1表示該結點還未被訪問

接下來,從陣列中選取兩個weight最小的葉子結點構造新的結點,如a[6]:weight=3和a[0]:weight=5構成結點a[8]:weight=8;結點a[8]的左右孩子分別填充序號6、0;依次填充直至完成;

最後進行編碼,若為左子樹取0,右子樹取1; 從葉子結點向根節點進行逆序編碼;請仔細檢視上圖,發現最後一行,即根節點的parnet=-1,以次判斷是否從葉子編碼至根節點;

(詳見嚴蔚敏de《資料結構》和高一凡的《資料結構演算法和分析(stl版)》)

#include

template

struct htnode;

template

class huffmantree

void createht(string filename)

cout

<>close();

//終態:

for(i=n;itrue; //建立赫夫曼樹的標誌

}//編碼

void huffmancodingleaf() const

} void huffmantree()

else

}else

if(s[c]==1)

else

} cout

};

赫夫曼編碼

include include using namespace std typedef struct htnode,huffmantree 動態分配陣列儲存赫夫曼樹 typedef char huffmancode 動態分配陣列儲存赫夫曼編碼 赫夫曼編碼的演算法實現 void sethuffmant...

赫夫曼編碼

用赫夫曼樹進行編碼是我們處理資料壓縮常用的方法。請同學們用赫夫曼編碼方法儲存你班同學 資料結構 課程的期終考試成績。include include include include define ok 1 define maxnn 100000 typedef struct studentstuden...

赫夫曼編碼

問題r 赫夫曼編碼 思路 對於赫夫曼來說,往左走為0,往右走為1,可以發現每一位就往下走一層。因此整體報文的長度可以用不同報文在樹中的位置來確定,也就是說,符號種類 每個符號在樹中的深度即為整體報文的長度 而ascll碼的位元位長度為符號個數 8 include include include us...