huffman編碼相信學過資料結構這麼課的都知道,概念也比較好理解,但是一般好理解的演算法,在實際實現的過程中總是會遇到各種問題,一方面個人認為是對演算法的實現過程不熟,另一方面在實際實現的過程中可以提公升自己實現演算法的能力,將自己的想法實現後還是比較滿足的。下面是本人親自實現的huffman編碼與解碼的c語言實現,主要是記錄一下自己當時的想法,供以後備忘吧。
資料結構定義如下:
typedef structhtnode, * huffmantree;
typedef char * * huffmancode;
建huffman樹的過程是使用順序結構陣列儲存樹,由於沒有度為一的節點,因此總數為2*n - 1個節點,n為葉子節點個數,也是待編碼的字元個數。
建樹的關鍵**如下:
//建立huffman樹,初始化1到n號元素的parent都為0,每次從parent為0的元素中
//挑選最小的兩個建樹之後,將它們的parent都置為對應號碼
for(i = n + 1; i <= m; i++)
for(j = 1; j <= i - 1; j++)
ht[min1].parent = i;
for(j = 1; j <= i - 1; j++)
if(ht[j].parent == 0)
for(j = 1; j <= i - 1; j++)
ht[min2].parent = i;
ht[i].lchild = min1;
ht[i].rchild = min2;
ht[i].weight = ht[min1].weight + ht[min2].weight;
}
編碼過程是更加樹的結構,對每個非葉子節點的左子樹為『0』,右子樹為『1』。實現如下:
//編碼
huffmancode hc = (huffmancode)malloc(n*sizeof(char *));
char * cd = (char *)malloc(n*sizeof(char));
cd[n-1] = '\0';
for(i = 0; i < n; i++)
hc[i] = (char*)malloc((n-end)*sizeof(char));
strcpy(hc[i], &cd[end]);
} free(cd);
全部實現,封裝在乙個huffmanencode函式中。
huffmancode huffmanencode(huffmantree & ht, unsigned int * w, int n)
for(i = n + 1;i <= m; i++)
//建立huffman樹,初始化1到n號元素的parent都為0,每次從parent為0的元素中
//挑選最小的兩個建樹之後,將它們的parent都置為對應號碼
for(i = n + 1; i <= m; i++)
for(j = 1; j <= i - 1; j++)
ht[min1].parent = i;
for(j = 1; j <= i - 1; j++)
if(ht[j].parent == 0)
for(j = 1; j <= i - 1; j++)
ht[min2].parent = i;
ht[i].lchild = min1;
ht[i].rchild = min2;
ht[i].weight = ht[min1].weight + ht[min2].weight; }
//編碼
huffmancode hc = (huffmancode)malloc(n*sizeof(char *));
char * cd = (char *)malloc(n*sizeof(char));
cd[n-1] = '\0';
for(i = 0; i < n; i++)
hc[i] = (char*)malloc((n-end)*sizeof(char));
strcpy(hc[i], &cd[end]);
} free(cd);
return hc;
}
對於編碼後得到的編碼字串行hc,結果過程只需找到對應的下標即可。如下:
int huffmandecode(huffmantree ht,char* code, int n)
while(code[i] == '0' || code[i] == '1')
return r;
}
最後,主函式中的呼叫如下,整個實現起來後比較方便。
int main()
huffmantree ht;
huffmancode hc = huffmanencode(ht, weight, n);
printf("\n構建的赫夫曼樹如下(權重-左孩子-右孩子-父親):\n");
for(int i = 1; i <= 2*n-1; i++)
printf("\n每個字元對應的編碼如下:\n");
for(int i = 0; i < n; i++)
printf("\n請輸入待解碼的編碼字串:");
char str[n];
scanf("%s", str);
int hcindex = huffmandecode(ht, str, n);
printf("%s編碼的字元是:%c\n", str, codechar[hcindex-1]);
return 0;
}
結果如下:
Huffman編碼與解碼
近期學習資料結構碰到huffman編碼與解碼問題,自己動手寫了一些,注釋比較全,ok,下面直接貼 include include define telemtype char define wtype int define leafnumber 5 預設權重集合大小 define totalnumbe...
huffman編碼和解碼實現
寫資料結構的實驗確實是蠻麻煩的,下面提供乙個還可以執行的源程式給大家參考,應付實驗老師是綽綽有餘的了 link.h檔案內容 pragma once class link link的實現檔案什麼內容也沒有,所以就不寫啦 huffman.h內容 pragma once include link.h cl...
C 實現Huffman編碼和解碼
using system using system.collections using system.collections.generic using system.linq using system.text namespace stringcompresser public huffman c...