霍夫曼樹和霍夫曼編碼

來源:互聯網
上載者:User
#include <stdio.h>#include <stdlib.h>#include <cstring>using namespace std;typedef struct HuffNode{int weight;int parent, lchild, rchild;}HuffNode, HuffTree;void select(HuffTree* H, int m, int* s1, int* s2)//在索引為0~m的元素中找到**parent為0**且權重最小的兩個元素的索引s1,s2{//初始化兩個最小的元素min1,與min2, 且min1<min2int min1 = 500;int min2 = 1000;int min1_index, min2_index = 1000;for(int i = 0; i<=m; i++){if(H[i].parent==0)    //這個條件很重要!!它使得前一次被選中的根節點在這次選擇中不會被選中{if(H[i].weight < min1)  //則當前元素<min1<min2, 應將min2用min1賦值, 再將當前元素賦給min1{min2 = min1;min2_index = min1_index;min1 = H[i].weight;min1_index = i;continue;}if(H[i].weight < min2)   //則min1<當前元素<min2, 應將當前元素賦給min2{min2 = H[i].weight;min2_index = i;}}}*s1 = min1_index;*s2 = min2_index;}void display(HuffTree* H, int n){for(int i = 0; i<=n-1; i++){printf("%d, weight:%d, parent:%d, lchild:%d, rchild:%d\n", i, H[i].weight, H[i].parent, H[i].lchild, H[i].rchild);}}void HuffmanCoding(int n, HuffTree* H, char** HuffCode, int w[]){//n個葉子結點, n-1個非葉子結點.共2n-1個結點int m = 2*n-1;//為線性儲存結構分配空間H = (HuffNode *)malloc(sizeof(HuffNode)*m);  HuffNode* p = H;int * p_w = w;//對前n個葉子結點,其權重等於w[]中的元素值for(int i = 0; i<=n-1; i++){//*p = {*p_w, 0,0,0};//這句話的作用等價於下面四句:H[i].weight = *p_w;H[i].parent = 0;H[i].lchild = 0;H[i].rchild = 0;p++;p_w++;}//對後n-1個非葉子結點,其權重0for(int i = n; i<=m-1; i++){//*p = {0,0,0,0};H[i].weight = 0;H[i].parent = 0;H[i].lchild = 0;H[i].rchild = 0;p++;}//對n-1個非葉子結點for(int i = n; i<=m-1; i++){int s1, s2 = 0;select(H, i-1, &s1, &s2);//在前i-1個元素中找到parent為0且權重最小的兩個元素的索引s1,s2H[i].lchild = s1;H[i].rchild = s2;H[i].weight = H[s1].weight + H[s2].weight;H[s1].parent = i;H[s2].parent = i;display(H, m);}display(H, m);//為二維霍夫曼編碼結構分配空間, 共n個元素, 每個元素是一個char*類型的指標HuffCode = (char**)malloc(sizeof(char*)*(n));    if(!HuffCode)printf("error to malloc for HUffCode.");//為每一個字元編碼首先預分配長度為n的空間,char * codestring = (char*)malloc(sizeof(char)*n);codestring[n-1] = '\0';//從葉子結點到根逆向求每個字元的Huffmancodefor(int i = 0; i<=n-1; i++){int start_index = n-2;int c = i;   //initialize index of current node to index of the first leaf nodeint f = H[c].parent;  //initialize the inde of current parentwhile(f!=0){if(H[f].lchild == c)codestring[start_index--] = '0';if(H[f].rchild == c)codestring[start_index--] = '1';c = f;f = H[c].parent;}//由於HuffCode的每一維都是一個指標, 因此, 這裡對每個指標分配長度為n-1-start_index的空間HuffCode[i]=(char *)malloc((n-1-start_index)*sizeof(char));strcpy(HuffCode[i], &(codestring[start_index+1]));printf("code string[%d] is:%s\n",i, &(codestring[start_index+1]));}free(codestring);codestring=NULL;}int main(){int w[] = {5,29,7,8,14,23,3,11};HuffTree H;char **HuffCode;HuffmanCoding(8, &H, HuffCode, w);}

運行結果:


注意:

霍夫曼編碼並不是唯一的,只要平均帶權路徑長度最小就OK.

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.