赫夫曼编码

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Huffman编码

一、需求分析

1、程序执行的命令包括:

1)、建赫夫曼树和求赫夫曼编码;2)、显示各个字符的编码;3)、将字符串译为编码;4)、将编码译为字符串。

2、测试数据

要编码的字符串:ABCDEF

各个字符以及频度:A 30 B 20 C 5 D5 E 10 F 30

各个字符的编码为:A:10 B:00 C:0110 D:0111 E:010 F:11

二、概要设计

本程序包含六个模块:

(1)主程序模块;(2)选择权值——选出权值最小的两个;(3)赫夫曼算法——建赫夫曼树和求赫夫曼编码;(4)显示编码——显示各个字符的编码;(5)编码——将一个字符串译为编码;(6)译码——将一串01数译为字符。

三、详细设计

#include

#include

using namespace std;

typedef struct {

int weight,parent,lch,rch;

}HTNode, *HuffmanTree;

typedef struct {

char c;

char* code;

}*Huffmancode;

void select (HuffmanTree HT,int i,int &s1,int &s2)

{

s1=100;s2=100;

int j=1,k=1,m=0,n=0;

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

if(HT[j].parent==0&&HT[j].weight

{s1=HT[j].weight;m=j;}

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

if(HT[k].parent==0&&k!=m&&HT[k].weight

{s2=HT[k].weight;n=k;}

if(m>n)

{

s1=n;s2=m;

}

else

{

s1=m;s2=n;

}

void HuffmanCoding( HuffmanTree &HT, Huffmancode &HC,int *w, char *y,int n ) //w为n 个字符权值向量

{

int m=0,i=0,s1=0,s2=0,start=0,c=0,f=0;

if (n<=1) return;

m=2*n-1; //HT长度

HT=(HuffmanTree) malloc((m+1)*sizeof(HTNode));

//0号单元不用

for (i=1;i<=m;i++){

HT[i].parent=0; HT[i].lch=0; HT[i].rch=0;}

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

HT[i].weight=w[i-1];

for (i=n+1;i<=m;i++){ //建赫夫曼树

select (HT,i-1,s1,s2);//函数调用,s1,s2为返回值

//在HT[1..i-1]中选择双亲为0且权值最小的两个结点的序号

HT[s1].parent=i; HT[s2].parent=i;

HT[i].lch=s1; H T[i].rch=s2;

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

}

//从叶子到根逆向求每个字符的赫夫曼编码

HC=(Huffmancode)malloc((n+1)*sizeof(char *));//头指针向量

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

HC[i].c=y[i-1];

char *cd=(char*)malloc(n*sizeof(char));//分配求编码的工作空间

cd[n-1]='\0'; //编码结束符

for (i=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].lch==c) cd[--start]='0';

else cd[--start]='1';

}

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

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

}

free(cd);

}

void show(Huffmancode HC,int n)

{

cout<<"各个字符的编码为:";

for(int j=1;j<=n;j++)

cout<

cout<

void coding(Huffmancode HC,int n, char *cd) {

int i=0,j=1;

cout<

while(cd[i]!='\0')

{

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

if(cd[i]==HC[j].c)

cout<

i++;

}

}

void transcode(Huffmancode HC,int n, char *cd) {

int i=0,j=1,m=1,f=0;

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

char *cdt=(char*)malloc(100*sizeof(char));

strset(temp,'\0');

strcpy(cdt,cd);

cout<

strncpy(temp,cdt,m);

while(cd[i]!='\0')

{

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

{

if(!strcmp(temp,HC[j].code))

{

cout<

cdt=&cd[i+1];

f=0;

break;

}

f=1;

}

if(f==1)

{

m++;

strncpy(temp,cdt,m);

}

else

{

strset(temp,'\0');

相关文档
最新文档