huffman樹壓縮字元文件,就是將8bit的字元根據出現頻率進行重新編碼,使編碼之後每個字元的編碼在檔案讀入時都能被唯一確定。故字元的編碼必須是不頭包含的。huffman樹是一種簡單的壓縮編碼方式。
本文將採用c語言實現。編譯環境為gcc4.9.2,故可以採用c++的引用傳遞使**更加簡單。
首先,先編乙個標頭檔案「huffman.h」實現實現huffman樹的基本操作,**:
#include
#include
#include
typedef structhtnode,*huffmantree; //動態分配陣列儲存赫夫曼樹
typedef char * *huffmancode; //動態分配陣列儲存赫夫曼編碼表
void select(huffmantree ht,int n,int &s1,int &s2)
}for( ;i<=n;i++)
}if(ht[p1].weight>ht[p2].weight)
//p1,p2賦初始值
for( ;i<=n;i++)
else
if(ht[i].weightp2=i;}}
s1=p1;
s2=p2;
}void huffmancoding (huffmantree &ht,huffmancode &hc ,int *w,int n);
for( ;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)
free(cd); //釋放工作空間
}//huffmancoding
壓縮檔案的程式「壓縮.cpp」,**:
#include
#include
#include
#include"huffman.h"
int main()
while(te=fgetc(f1)) //第一次讀入計算權值
fseek(f1,0l,seek_set);
huffmancoding(ht,hc,w,128);
for(i=1;i<=128;i++)
printf("%d %s\n",i-1,hc[i]);
printf("\n\n\n"); //輸出huffman字元和編碼
strcpy(name1,name);
strcat(name1,".out");
if((f2=fopen(name1,"wb+"))==null)
for(i=1;i<=128;i++)
fwrite(&w[i],4,1,f2);
int da[9];
int j=1;
unsigned char c1=0;
while(te=fgetc(f1))
else
if(j==9) }
}//粗略壓縮
printf("%d\n",j-1);
for(i=1;iprintf("%d\n",da[i]);
j--;
fwrite(&j,4,1,f2);
for(i=1;i<=j;i++)
j=1;
fseek(f1,0,seek_set);
while(te=fgetc(f1))
else
if(j==9) }
}//粗略壓縮
fclose(f1);
fclose(f2);
return 0;
}之後是解壓
#include
#include
#include"huffman.h"
int main()
printf("\n");
fread(&j,4,1,f1);
printf("%d ",j);
for(i=1;i<=j;i++)
huffmancoding(ht,hc,w,128);
for(i=1;i<=128;i++)
//fclose(f1);
f2=fopen(name,"w");
//strcpy(name1,name);
//strcat(name1,".out");
// f2=fopen(name1,"rb");
int buf;
int a;
int *bu;
bu=&buf;
int end=0;
end=255;//вс0ср1
while(fread(bu,1,1,f1))
a=buf/64;
buf=buf-a*64;
if(a==0) end=ht[end].lchild;
else end=ht[end].rchild;
if(end<=128)
a=buf/32;
buf=buf-a*32;
if(a==0) end=ht[end].lchild;
else end=ht[end].rchild;
if(end<=128)
a=buf/16;
buf=buf-a*16;
if(a==0) end=ht[end].lchild;
else end=ht[end].rchild;
if(end<=128)
a=buf/8;
buf=buf-a*8;
if(a==0) end=ht[end].lchild;
else end=ht[end].rchild;
if(end<=128)
a=buf/4;
buf=buf-a*4;
if(a==0) end=ht[end].lchild;
else end=ht[end].rchild;
if(end<=128)
a=buf/2;
buf=buf-a*2;
if(a==0) end=ht[end].lchild;
else end=ht[end].rchild;
if(end<=128)
a=buf;
if(a==0) end=ht[end].lchild;
else end=ht[end].rchild;
if(end<=128)
} for(i=1;i<=j;i++)}}
p.s.
以上為演算法實現,最終寫完這篇部落格居然用了一年;現在看以前的**發現有很多不成熟的地方;
利用Huffman樹實現檔案壓縮
利用huffman樹實現檔案壓縮 使用的編輯語言是c 專案目的是能夠實現對檔案的壓縮及解壓,涉及到的技術主要有huffman樹的實現,檔案的io操作,優先順序佇列等 整體思路 整個過程是依賴於huffman樹,因此要構建出乙個可供我們使用的huffman樹 壓縮時,操作原始檔,以字元形式讀取檔案資訊...
Huffman樹的實現
huffmantree.h inte ce for the huffmantree class.if defined afx huffmantree h e2fe6c12 c0a9 4483 af1b 9623f1fd0ef8 included define afx huffmantree h e2...
Huffman樹與MinHeap實現
ifndef min heap define min heap define max size 256 template class minheap private int left int curr int right int curr int parent int curr t a max si...