目錄
目的:編碼過程:
圖示過程說明:
整體**:
相關小知識點:
執行結果:
掌握霍夫曼樹的生成演算法
熟練掌握霍夫曼編碼的方法
a.首先輸入n個待編碼的字元data及其權值weight,並將n個字元的權值放入到霍夫曼樹的節點中。
b.用select函式遍歷n個字元,找出權值最小的兩個s1和s2,構造乙個新的節點hi,將s1和s2連線到hi的lchild和rchild節點上, hi節點的weight為s1和s2的weight之和。
c.將新建立的節點hi替換s1和s2,繼續步驟b(這時的字元數為n-i,i=1,2,…),直到只剩下乙個節點為止。至此,霍夫曼樹構造完成。
d.給霍夫曼樹ht分配編碼,並輸出。
#include#include#includetypedef structhtnode,*huffmantree; //動態分配陣列儲存霍夫曼樹
typedef char* *huffmancode;//動態分配陣列儲存霍夫曼編碼
//選擇出最小的兩個結點
void select(huffmantree &ht,int k,int &s1,int &s2)
for(;i<=m;++i,++p) //對另外n-1個葉子結點賦初值
for(i=n+1;i<=m;i++)
//從葉子到根逆向求每個字元的霍夫曼編碼
hc=(huffmancode)malloc((n+1)*sizeof(char*)); //分配n個字元編碼的頭指標變數
cd=(char*)malloc(n*sizeof(char)); //分配求編碼的工作空間
cd[n-1]='\0';//編碼結束符
for(i=1;i<=n;i++) //逐個字元求霍夫曼編碼
hc[i]=(char*)malloc((n-start)*sizeof(char)); //為第i個字元編碼分配空間
strcpy(hc[i],&cd[start]);//從cd複製編碼到hc
}free(cd); //釋放工作空間
}void main()
huffmancoding(ht,hc,w,n);
for(i=1;i<=n;i++)
printf("%c:%s\n",ch[i],hc[i]);
}
char* *huffmancode 等價於 char* huffmancode;
strcpy(s1,s2); strcpy函式的意思是:把字串s2拷貝到s1中,連同字串結束標誌也一同拷貝。如果s2="china",那麼s1中存放的是china\0。
學生黨,有什麼不對的地方請大佬們指出!
資料結構 哈夫曼樹 哈夫曼編碼
哈夫曼樹又稱最優樹 二叉樹 是一類帶權路徑最短的樹。構造這種樹的演算法最早是由哈夫曼 huffman 1952年提出,這種樹在資訊檢索中很有用。結點之間的路徑長度 從乙個結點到另乙個結點之間的分支數目。樹的路徑長度 從樹的根到樹中每乙個結點的路徑長度之和。結點的帶權路徑長度 從該結點到樹根之間的路徑...
哈夫曼編碼 哈夫曼樹 (資料結構)
哈夫曼編碼,又稱霍夫曼編碼,是一種編碼方式,哈夫曼編碼是可變字長編碼 vlc 的一種。huffman於1952年提出一種編碼方法,該方法完全依據字元出現概率來構造異字頭的平均長度最短的碼字,有時稱之為最佳編碼,一般就叫做huffman編碼 有時也稱為霍夫曼編碼 include include inc...
資料結構 哈夫曼編碼
time limit 1000ms memory limit 65536kb submit statistic problem description 字元的編碼方式有多種,除了大家熟悉的ascii 編碼,哈夫曼編碼 huffman coding 也是一種編碼方式,它是可變字長編碼。該方法完全依據字...