哈夫曼編碼(huffman coding),又稱霍夫曼編碼,是一種編碼方式,哈夫曼編碼是可變字長編碼(vlc)的一種。huffman於2023年提出一種編碼方法,該方法完全依據字元出現概率來構造異字頭的平均長度最短的碼字,有時稱之為最佳編碼,一般就叫做huffman編碼(有時也稱為霍夫曼編碼)
要構造二叉樹(哈夫曼樹),二叉樹的葉子節點才是用來儲存資料的節點,取出的具體資料由給出的編碼確定
每一組資料對應乙個哈夫曼樹不同檔案的哈夫曼樹一般是不一樣的
構造哈夫曼樹
每一次取出出現概率(權值)最小的兩個節點作為新節點的子節點(小左大右),新節點的權值即左右子節點權值之和,然後將新的節點放入原資料集合中,遞迴
解碼從建立好的哈夫曼樹的頭節點開始查詢,找到葉子節點即返回乙個資料,然後重新開始查詢
(不能用其他的樹的編碼來完成解碼,容易出現記憶體訪問錯誤
)首先確定資料符號有哪些以及每一種符號權值是多少(此處不做解釋)
本演算法以如下資料構件哈夫曼樹
char c[8]
=;//資料集合
int w[8]
=;//對應權值
void
sort()
}}}
由於用到二叉樹,基礎節點定義如下:
struct ht
;
由於重複對資料進行排序,時間複雜度較高,故採用陣列先排序,然後建立對應有序鍊錶,每一次建立乙個根節點就插入即可
struct l
;//雙鏈表結構
ht *h;
//全域性變數
void
insert
(ht *p,l *e)
t=t->next;}if
(p->weightdata->weight)
else
//各種條件使資料插入該插入的位置(此處不再解釋)
}void
creat
(l *
&head)
設定讀取方式
void
find
(ht *t,
char
*s)else
elseif(
*s==
'1')
//其他情況終止查詢
}}
檢驗
//測試資料如下:000100011011101110
intmain()
creat
(head)
; p=head->data;
h=p;
char s[
10000];
cin>>s;
find
(h,s)
;return0;
}
哈夫曼樹的構造演算法,哈夫曼編碼演算法
include define max 100 define maxvalue 500 typedef struct int weight int parent,lchild,rchild node 哈夫曼樹結點型別 以下部分定義哈夫曼編碼儲存結構 typedef structcodetype typ...
構造哈夫曼樹 哈夫曼編碼
1.權值越大的節點,距離根越近 2.樹中沒有度為1的節點,這類樹叫正則 嚴格 二叉樹,樹的總節點 2 雙分支結點 1 單分支結點 雙分支結點 3.樹的帶權路勁 wpl 所有葉子結點的帶權長度路勁之和 長度最短。嗶哩嗶哩王卓老師的口訣 構造森林全是根,選用兩小選新樹,刪除兩小添新人,重複23剩單根 1...
哈夫曼樹構造 哈夫曼編碼
一 哈夫曼樹 p189 1.定義 帶權路徑長度 wpl 最小的二叉樹稱為哈夫曼樹 wpl 樹中所有葉子節點的帶權路徑長度之和 帶權路徑長度 從樹根到任意節點的路徑長度與該節點上權值的乘積 2.構造 1 將這n個節點分別作為n課僅含乙個結點的二叉樹,構成森林f 2 構造乙個新節點,從f中選取兩棵根節點...