哈夫曼編碼原理解析及演算法構造過程

2021-09-20 18:47:27 字數 1557 閱讀 3142

哈夫曼編碼(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中選取兩棵根節點...