Huffman編碼源代碼

構建Huffman樹:

1.將給定的n個權值看作n棵只有結點無左右孩子的二叉樹,組合成一個集合HT。

2.從集合HT中選出2棵權值最小的二叉樹,組成一棵新的二叉樹,其權值為這兩棵二叉樹的權值之和。

3.將步驟2中選出的二叉樹從集合HT中刪去,同時將步驟2中新的二叉樹加入到集合HT中。

4.重復步驟2和步驟3,直到集合HT中只含有一棵樹,這棵樹就是Huffman樹。

偽代碼:

typedefstruct//定義結構體

{

intweight;//保存權值

intparent, lchild, rchild;//保存父節點、左右孩子的節點值

}HuffmanNode, *HuffmanTree;

typedefchar**HuffmanCode;//用來存儲哈夫曼編碼

procHuffmanCoding(HuffmanTree &HT,int*w,intn)//編碼函數定義

if(n <= 1)then Error();

m := 2 * n - 1;//n nodes create huffman tree need 2n-1 nodes

HT:= (HuffmanNode*)malloc((m +1) *sizeof(HuffmanNode));//HT存放Huffman tree的所有節點,申請m+1個位置

memset(HT, 0, (m + 1)*sizeof(HuffmanNode));//對所有節點初始化為0

//setthe n nodes

fori from 1 to n

HT[i].weight := *w++;//初始化各節點的權值

//createHuffman tree

fori from n + 1 to m//從HT的第n+1個位置開始

select(HT, i - 1, s1,s2);//選擇剩余節點中權值較小的s1和s2

HT[s1].parent := i;//s1,s2的父節點都是當前結點

HT[s2].parent := i;

HT[i].lchild := s1;

HT[i].rchild := s2;

HT[i].weight :=HT[s1].weight + HT[s2].weight;

end{for}

HC := (HuffmanCode)malloc((n + 1) *sizeof(char*));

char*cd = (char*)malloc(n *sizeof(char));//申請n個位置,最后一位存放結束符

cd[n - 1] ='\0';

fori from 1 to n

start = n - 1;

for(c= i, f = HT[i].parent; f != 0; c = f, f = HT[f].parent)

if(HT[f].lchild == c)

cd[--start] ='0';//cd從后往前依次存放

else

cd[--start] ='1';

end{for}

HC[i] = (char*)malloc((n - start) *sizeof(char));

strcpy(HC[i],&cd[start]);

end{for}

end{proc}




源碼:

#include

#include

#include

usingnamespacestd;

/*哈夫曼樹的存儲結構,它是二叉樹*/

typedefstruct

{

intweight;//保存權值

intparent, lchild, rchild;//保存父節點、左右孩子的節點值

}HuffmanNode, *HuffmanTree;

typedefchar**HuffmanCode;//用來存儲哈夫曼編碼

voidHuffmanCoding(HuffmanTree &HT,int*w,intn);//Huffman編碼函數

voidselect(HuffmanTree HT,intn,int&s1,int&s2);//選擇書中節點值較小的兩個節點

voidError(char*message);//顯示錯誤信息

intmain(intargc,char* argv[])

{

inti,n;

int*w;

HuffmanCode HC;

HuffmanTree HT;

cout<<"Enter the size of the code:";

cin>>n;

w=(int*)malloc(n*sizeof(int));

cout<<"Enter the weight of the code:";

for(i=0;i

cin>>w[i];

cout<<"The Huffmancode is:"<

HuffmanCoding(HT, w, n);

system("pause");

}

voidHuffmanCoding(HuffmanTree &HT,int*w,intn)

{

if(n <= 1)

Error("code is small");

intm = 2 * n - 1;//n nodes create huffman tree need2n-1 nodes

HT = (HuffmanNode*)malloc((m +1) *sizeof(HuffmanNode));//Huffman tree的所有節點

ints1, s2;//record the two mini weights nodes

memset(HT, 0, (m + 1)*sizeof(HuffmanNode));//對所有節點初始化為0

//setthe n nodes

for(inti = 1; i <= n; i++)

{

HT[i].weight = *w++;//初始化各節點權值

}

//創建Huffmantree

for(inti = n + 1; i <= m; ++i)

{

//選擇剩余節點中權值較小的s1和s2

select(HT, i - 1, s1,s2);

HT[s1].parent = i;

HT[s2].parent = i;

HT[i].lchild = s1;

HT[i].rchild = s2;

HT[i].weight = HT[s1].weight+ HT[s2].weight;

}

HuffmanCode HC;

intstart, c, f;

HC = (HuffmanCode)malloc((n + 1)*sizeof(char*));

char*cd = (char*)malloc(n *sizeof(char));

cd[n - 1] ='\0';

for(inti = 1; i <= n; ++i)

{

start = n - 1;

for(c= i, f = HT[i].parent; f != 0; c = f, f = HT[f].parent)

if(HT[f].lchild == c)

cd[--start] ='0';

else

cd[--start] ='1';

HC[i] = (char*)malloc((n - start) *sizeof(char));

strcpy(HC[i],&cd[start]);

}

for(inti = 1; i <= n; i++)

{

cout<

}

free(cd);

free(HC);

free(HT);

}

voidError(char*message)

{

fprintf(stderr,"Error: %s(5s will exit)",message);

cout<<"\n";

Sleep(5000);

exit(1);

}

voidselect(HuffmanTree HT,intn,int&s1,int&s2)

{

s1 = 1;

s2 = 1;

intmin= 99999;

inti;

//選擇未被使用的第一個節點,

for(i = 1; i <= n; ++i)

{

if(HT[i].parent == 0)

{

min = HT[i].weight;

break;

}

}

//findthe mini s1

for(intp =1; p <= n; ++p)

{

if(0== HT[p].parent && min >= HT[p].weight)

{

s1 = p;

min = HT[p].weight;

}

}

//findthe s2

min = 99999;

for(intq =1; q <= n; ++q)

{

if(0== HT[q].parent && min >= HT[q].weight )

{

if(q == s1)

continue;

s2 = q;

min = HT[q].weight;

}

}

}

運行結果示例:


最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,048評論 6 542
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,414評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,169評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,722評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,465評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,823評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,813評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,000評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,554評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,295評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,513評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,035評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,722評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,125評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,430評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,237評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,482評論 2 379

推薦閱讀更多精彩內容