資料結構 赫夫曼樹

2021-10-04 00:13:37 字數 1487 閱讀 9182

赫夫曼編碼是首個試用的編碼方案。屬於無失真壓縮的編碼方案。在資料通訊中,赫夫曼編碼可以根據字元出現頻率,構造出一種不等長的二進位制,使編碼後的電文長度最短,且不產生二義性。

weighteed path length是樹中所有節點的帶權路徑長度之和。wpl 值越小,說明構造出來的二叉樹效能越優。赫夫曼樹為最優 wpl 二叉樹

1. 定長編碼:一種二進位制資訊的通道編碼,類似ascii編碼,一次變換的輸入資訊位數固定不變。

2. 變長編碼:單個編碼的長度不一致,可以根據整體出現頻率來調節。

3. 字首碼:就是沒有任何碼字是其他碼字的字首。乙個優點就是,字首碼可以方便變長編碼的組合,不會引起歧義。赫夫曼編碼就是最優的字首碼二叉樹。

程式思路:首先根據每個字元出現的次數(權值),建立乙個具有優先順序的佇列。(出現次數越少排在越前,次數越多排在越後)。然後根據赫夫曼樹的構造方法,選擇兩個權值最小的結點的權值和構造乙個新結點s,將s按照大小插入佇列中。至佇列只剩乙個元素時(該元素為根結點),赫夫曼樹構造完畢。根據遍歷赫夫曼樹的結果,左子樹用0表示,右子樹用1表示,為每個葉子結點生成乙個**,**中的字串就是存放的編碼。遍歷至沒有左子樹和右子樹的時候,就加*\0*。最後設計編碼過程和解碼過程。編碼時遍歷需要壓縮的檔案,找到對應的字元,從赫夫曼表中列印出編碼。解碼時根據赫夫曼編碼,遇到0向左子樹走,遇到1向右子樹走,最後把字元顯示出來。

httree * buildtree(char *inputstring)

//統計待編碼的字串各個字元出現次數,傳入的字元轉換為ascii值,在probability陣列中對應位置自加

for(int j=0;inputstring[j]!='\0';j++)

//pqueue為佇列的頭指標

pqueue * huffmanqueue;

//為佇列頭指標分配空間

initpqueue(&huffmanqueue);

//初始化佇列 填充佇列

for(int k=0;k<256;k++) }

} //addpqueue

void addpqueue(pqueue **queue,type val,unsigned int priority)

pqueuenode *aux = (pqueuenode *)malloc(sizeof(pqueuenode));

aux->priority = priority;

aux->val= val;

//如果是空的佇列 則不用比較 直接插入

if((*queue)->size == 0||(*queue)->first == null)

//如果不是空佇列 則比較後再插入 情況一權值小於第乙個結點

else

//情況二 使用迭代比較

else}}

} }//初始化佇列

#include "queue.h"

#include #include void initpqueue(pqueue **queue)

資料結構 赫夫曼樹

赫夫曼樹 huffman tree 又稱為最優樹,是一類帶權路徑長度最短的樹。本文僅討論最優二叉樹。樹的路徑長度是指從樹根到樹中其餘各個結點的路徑長度之和。對具有n個結點的二叉樹而言,完全二叉樹具有最短的樹的路徑長度。若在二叉樹中,樹葉結點帶有權值,則有 結點的帶權路徑長度定義為從樹根到該結點之間的...

資料結構(八) 赫夫曼樹

一 基本介紹 1 給定n個權值作為n個葉子節點,構造一顆二叉樹,如果這個樹的帶權路徑長度達到最小,就叫做 最優二叉樹 也叫 赫夫曼樹 帶權路徑最短 最優二叉樹 赫夫曼樹 2 赫夫曼樹是帶權路徑長度最短的樹,權值較大的節點離根很近 二 重要概念 三 赫夫曼樹建立思路 乙個數列,要求轉成一顆赫夫曼樹 1...

資料結構之赫夫曼樹

每個結點應該包含的資訊有 字元內容 父結點和左右孩子結點的下標 權重以及該字元的編碼。struct hfnode class huffmantree void selectmin int len,int s1,int s2 else if ht i weight min2 void createhf...