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
- NYOJ 801 Haffman编码
- nyoj 801 Haffman编码
- nyoj 801 Haffman编码
- Haffman编码
- Haffman编码
- Haffman 编码
- haffman哈夫曼编码的实现
- 数据结构笔记--haffman树与haffman编码分析
- 使用haffman(哈夫曼)编码的简单压缩软件
- 使用haffman(哈夫曼)编码的简单压缩软件
- nyoj801 Haffman编码(优先队列实现)
- nyoj 801 Huffman编码
- Haffman编码/译码——数据结构作业(二)
- java_实现Haffman树及其编码与解码
- Haffman应用
- haffman树
- Haffman Code
- haffman树的遍历
- 查询比本部门平均工资高的员工信息
- win8装驱动装不上。。转自网上。。感谢网友。。分享出来
- 接口
- Struts2 获取表单请求参数
- IO流
- nyoj 801 Haffman编码
- HDU 1715 大菲波数 (java)
- properties
- Struts2 级联数据传递
- Android android:gravity和android:layout_gravity的区别以及android:visibility的作用
- 接口回调
- AndroidUI 布局动画-为布局添加动画
- 闭包
- 在Apple Store 升级OS X系统的话,假如我升级到一半不升了,那对原来的OS X系统会有影响吗?