实验七--哈夫曼编码实验

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

实验七哈夫曼编码

哈夫曼编码

1. 问题描述

设某编码系统共有n个字符,使用频率分别为{w1, w2,…, w n},设计一个不等长的编码方案,使得该编码系统的空间效率最好。

2. 基本要求

⑴设计数据结构;

⑵设计编码算法;

⑶分析时间复杂度和空间复杂度。

3. 编码

#include

#include

using namespace std;

const int Size=10,Size1=50;

struct element

{

int weight;

int lchild,rchild,parent;

};

char s[Size];int w[Size],w1[Size];

int getW(char T1[]) //统计字母频率,获得权值

{

char T[Size1];

strcpy(T,T1);

char c;int count,k=0;

for(int i=0;T[i]!='\0';i++)

{

count=0;

if(T[i]>='a'&&T[1]<='z')

{

c=T[i];

s[k]=c;s[k+1]='\0';

}

if(c!='\0')

{

for(int j=0;T[j]!='\0';j++)

{

if(T[j]==c)

{

count++;

T[j]='$';

}

}

}

if(c!='\0')

{

w1[k]=count;

w[k++]=count;

}

c='\0';

}

return k;

}

void Select(element h[],int &i3,int &i4)//获得哈夫曼数组中权值最小的两个下标{

int c;

i3=-1;i4=-1;

for(int i=0;i3==-1;i++)

if(h[i].parent==-1)

i3=i;

for(i;i4==-1;i++)

if(h[i].parent==-1)

i4=i;

if(h[i3].weight>h[i4].weight)

{

c=i3;

i3=i4;

i4=c;

}

for(i;h[i].weight>0;i++)

{

if(h[i].parent==-1)

if(h[i].weight

i4=i3,i3=i;

else if(h[i].weight

i4=i;

}

}

void HuffmanTree(element *huffTree,int n)//哈夫曼树

{

int i1,i2;

for(int i=0;i<2*n-1;i++)

{

huffTree[i].parent=-1;

huffTree[i].lchild=-1;

huffTree[i].rchild=-1;

}

for(i=0;i

huffTree[i].weight=w[i];

for(int k=n;k<2*n-1;k++)

{

Select(huffTree,i1,i2);

huffTree[i1].parent=k;

huffTree[i2].parent=k;

huffTree[k].weight=huffTree[i1].weight+huffTree[i2].weight; huffTree[k].lchild=i1;

huffTree[k].rchild=i2;

}

}

struct codetype

{

char bits[Size];

char ch;

};

codetype code[Size];

void bm(element h[],int m)//记录路径编码

{

char b[Size];b[0]='\0';

int s1[Size],cd;

int top=-1,i=0,k;

while(m!=-1||top!=-1)

{

while(m!=-1)

{

if(h[m].lchild==-1 && h[m].rchild==-1)//记录路径编码'0','1'的算法,用到parent回溯。

{

cd=0;

for(int j=h[m].parent;j!=-1;j=h[j].parent)

cd++;

b[cd]='\0';

k=m;

for(j=h[k].parent;j!=-1;j=h[j].parent)

{

if(h[j].lchild==k) b[--cd]='0';

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

k=j;

}

for(j=0;s[j]>='a'&&s[j]<='z';j++)

{

if(h[m].weight==w[j])

{

strcpy(code[i].bits,b);

code[i++].ch=s[j];

w[j]=-1;break;

}

}

}

s1[++top]=m;

m=h[m].lchild;

}

if(top!=-1)

{

m=s1[top--];

m=h[m].rchild;

}

}

}

void jm(element huffT[],int n,char t1[])

相关文档
最新文档