哈夫曼树
来源:互联网 发布:淘宝网图片保护网址 编辑:程序博客网 时间:2024/06/18 10:49
数据结构实验之二叉树六:哈夫曼编码
Time Limit: 1000MS Memory Limit: 65536KB
Submit Statistic
Problem Description
字符的编码方式有多种,除了大家熟悉的ASCII编码,哈夫曼编码(Huffman Coding)也是一种编码方式,它是可变字长编码。该方法完全依据字符出现概率来构造出平均长度最短的编码,称之为最优编码。哈夫曼编码常被用于数据文件压缩中,其压缩率通常在20%~90%之间。你的任务是对从键盘输入的一个字符串求出它的ASCII编码长度和哈夫曼编码长度的比值。
Input
输入数据有多组,每组数据一行,表示要编码的字符串。
Output
对应字符的ASCII编码长度la,huffman编码长度lh和la/lh的值(保留一位小数),数据之间以空格间隔。
Example Input
AAAAABCD
THE_CAT_IN_THE_HAT
Example Output
64 13 4.9
144 51 2.8
c语音
# include<stdio.h>
# include<stdlib.h>
# include<string.h>
void k(int a[], int l, int r)
{
int i=l, j=r;
int x=a[l];
if(l>=r)
return ;
while(i<j)
{
while(i<j&&a[j]>=x)
j--;
a[i]=a[j];
while(i<j&&a[i]<=x)
i++;
a[j]=a[i];
}
a[i]=x;
k(a, l, i-1);
k(a, i+1, r);
}
int main()
{
char s[1010];
int i, a[1010], sum1, sum2, b[1010];
int x, y;
while(~scanf("%s", s))
{
int n=strlen(s);
int tail=0, top=0;
sum1=sum2=0;
memset(a, 0, sizeof(a));
for(i=0; i<n; i++)
{
a[s[i]]++;
}
for(i=0; i<500; i++)
{
if(a[i])
b[tail++]=a[i];
}
k(b, 0, tail-1);
sum1=n*8;
while(top<tail)
{
x=b[top++];
if(top<tail)
{
y=b[top++];
sum2 += (x+y);
b[tail++]=x+y;
k(b, top, tail-1);
}
}
printf("%d %d %.1lf\n", sum1, sum2, sum1*1.0/(sum2*1.0));
}
return 0;
}
Time Limit: 1000MS Memory Limit: 65536KB
Submit Statistic
Problem Description
字符的编码方式有多种,除了大家熟悉的ASCII编码,哈夫曼编码(Huffman Coding)也是一种编码方式,它是可变字长编码。该方法完全依据字符出现概率来构造出平均长度最短的编码,称之为最优编码。哈夫曼编码常被用于数据文件压缩中,其压缩率通常在20%~90%之间。你的任务是对从键盘输入的一个字符串求出它的ASCII编码长度和哈夫曼编码长度的比值。
Input
输入数据有多组,每组数据一行,表示要编码的字符串。
Output
对应字符的ASCII编码长度la,huffman编码长度lh和la/lh的值(保留一位小数),数据之间以空格间隔。
Example Input
AAAAABCD
THE_CAT_IN_THE_HAT
Example Output
64 13 4.9
144 51 2.8
c语音
# include<stdio.h>
# include<stdlib.h>
# include<string.h>
void k(int a[], int l, int r)
{
int i=l, j=r;
int x=a[l];
if(l>=r)
return ;
while(i<j)
{
while(i<j&&a[j]>=x)
j--;
a[i]=a[j];
while(i<j&&a[i]<=x)
i++;
a[j]=a[i];
}
a[i]=x;
k(a, l, i-1);
k(a, i+1, r);
}
int main()
{
char s[1010];
int i, a[1010], sum1, sum2, b[1010];
int x, y;
while(~scanf("%s", s))
{
int n=strlen(s);
int tail=0, top=0;
sum1=sum2=0;
memset(a, 0, sizeof(a));
for(i=0; i<n; i++)
{
a[s[i]]++;
}
for(i=0; i<500; i++)
{
if(a[i])
b[tail++]=a[i];
}
k(b, 0, tail-1);
sum1=n*8;
while(top<tail)
{
x=b[top++];
if(top<tail)
{
y=b[top++];
sum2 += (x+y);
b[tail++]=x+y;
k(b, top, tail-1);
}
}
printf("%d %d %.1lf\n", sum1, sum2, sum1*1.0/(sum2*1.0));
}
return 0;
}
阅读全文
0 0
- 哈夫曼树
- 哈夫曼树
- 哈夫曼树
- 哈夫曼树
- 哈夫曼树
- 哈夫曼树
- 哈夫曼树
- 哈夫曼树
- 哈夫曼树
- 哈夫曼树
- 哈夫曼树
- 哈夫曼树
- 哈夫曼树
- 哈夫曼树
- 哈夫曼树
- 哈夫曼树
- 哈夫曼树
- 哈夫曼树
- iOS多个网络请求同时进行
- git版本管理
- 由数字构成的菱形
- vue 路由跳转 + 过渡效果
- 【Scikit-Learn 中文文档】45 监督学习:从高维观察预测输出变量
- 哈夫曼树
- maven 工程启动找不到 Spring ContextLoaderListener 的解决办法
- git撤销修改
- 数据结构实验图论一:基于邻接矩阵的广度优先搜索遍历
- Linux文件
- 中山大学算法课程题目详解(第十二周)
- WEB安全入门基础
- Java开发快递物流项目(6)
- 数据结构实验之图论二:图的深度遍历