利用huffman樹實現字元文件的壓縮

2021-07-07 07:02:26 字數 3417 閱讀 4863

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...