nyoj 801 Haffman编码

来源:互联网 发布:藏刀不能在淘宝卖 编辑:程序博客网 时间:2024/05/01 05:18


Haffman编码

时间限制:1000 ms  |  内存限制:65535 KB
难度:3
描述

哈弗曼编码大家一定很熟悉吧(不熟悉也没关系,自己查去。。。)。现在给你一串字符以及它们所对应的权值,让你构造哈弗曼树,从而确定每个字符的哈弗曼编码。当然,这里有一些小规定:

1.规定哈弗曼树的左子树编码为0,右子树编码为1;

2.若两个字符权值相同,则ASCII码值小的字符为左孩子,大的为右孩子;

3.创建的新节点所代表的字符与它的左孩子的字符相同;

4.所有字符为ASCII码表上32-96之间的字符(即“ ”到“`”之间的字符)。

输入
输入包含多组数据(不超过100组)
每组数据第一行一个整数n,表示字符个数。接下来n行,每行有一个字符ch和一个整数weight,表示字符ch所对应的权值,中间用空格隔开。
输入数据保证每组测试数据的字符不会重复。
输出
对于每组测试数据,按照输入顺序输出相应的字符以及它们的哈弗曼编码结果,具体格式见样例。
样例输入
3a 10b 5c 84a 1b 1c 1d 1
样例输出
a:0b:10c:11a:00b:01c:10d:11

分析:

万恶的哈夫曼,完全不理解啊,我什么时候可以把它给搞清楚啊,那么都变量,那么多变化,

都不知道数据结构怎么就这么难呢

虽然是抄的代码,但还是要保存一下的,为了以后可以好好地研究一下

001.#include<stdio.h>
002.#include<string.h>
003.#include<algorithm>
004.#define INF 99999999;
005.using namespace std;
006.struct f
007.{
008.char ch,*str;
009.int w,p,l,r;
010.} num[200];
011.int main()
012.{
013.int m,n,min1,min2,s1,s2,i,j,s,c,q;
014.char *cd;
015.while(scanf("%d",&n)!=EOF)
016.{
017.for(i=1; i<=n; i++)
018.{
019.getchar();
020.scanf("%c%d",&num[i].ch,&num[i].w);
021.num[i].p=num[i].l=num[i].r=0;
022.}
023.m=2*n;
024.for(i=n+1; i<m; i++)
025.num[i].w=num[i].p=num[i].l=num[i].r=0;
026.//构造哈夫曼树
027.for(i=n+1; i<m; i++)
028.{
029.min1=min2=INF;
030.s1=s2=0;
031.for(j=1; j<=i-1; j++)
032.{
033. 
034.if(num[j].p!=0)
035.continue;
036.if(min1>num[j].w)
037.{
038.min2=min1;
039.min1=num[j].w;
040.s2=s1;
041.s1=j;
042.}
043.else if(min1==num[j].w&&num[s1].ch>num[j].ch)
044.{
045.min2=min1;
046.min1=num[j].w;
047.s2=s1;
048.s1=j;
049.}
050.else if(min2>num[j].w)
051.{
052.min2=num[j].w;
053.s2=j;
054.}
055.else if(min2==num[j].w&&num[s2].ch>num[j].ch)
056.{
057.min2=num[j].w;
058.s2=j;
059.}
060.}
061.num[i].w=num[s1].w+num[s2].w;
062.num[s1].p=i;
063.num[s2].p=i;
064.if(num[s1].w==num[s2].w)
065.{
066.if(num[s1].ch>num[s2].ch)
067.{
068.num[i].ch=num[s2].ch;
069.num[i].l=s2;
070.num[i].r=s1;
071.}
072.if(num[s1].ch<num[s2].ch)
073.{
074.num[i].ch=num[s1].ch;
075.num[i].l=s1;
076.num[i].r=s2;
077.}
078.}
079.else
080.{
081.num[i].ch=num[s1].ch;
082.num[i].l=s1;
083.num[i].r=s2;
084.}
085.}
086.cd=(char *)malloc(n*sizeof(char));
087.cd[n-1]='\0';
088.for(i=1; i<=n; i++)
089.{
090.s=n-1;
091.c=i;
092.q=num[i].p;
093.while(q!=0)
094.{
095.--s;
096.if(num[q].l==c)
097.cd[s]='0';
098.else
099.cd[s]='1';
100.c=q;
101.q=num[q].p;
102.}
103.num[i].str=(char *)malloc((n-s)*sizeof(char));
104.strcpy(num[i].str,&cd[s]);
105.}
106.free(cd);
107.for(i=1; i<=n; i++)
108.printf("%c:%s\n",num[i].ch,num[i].str);
109.}
110.return 0;
111.}

0 0
原创粉丝点击