Entropy

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 5972    Accepted Submission(s): 2507

Problem Description
An
entropy encoder is a data encoding method that achieves lossless data
compression by encoding a message with “wasted” or “extra” information
removed. In other words, entropy encoding removes information that was
not necessary in the first place to accurately encode the message. A
high degree of entropy implies a message with a great deal of wasted
information; english text encoded in ASCII is an example of a message
type that has very high entropy. Already compressed messages, such as
JPEG graphics or ZIP archives, have very little entropy and do not
benefit from further attempts at entropy encoding.

English text
encoded in ASCII has a high degree of entropy because all characters are
encoded using the same number of bits, eight. It is a known fact that
the letters E, L, N, R, S and T occur at a considerably higher frequency
than do most other letters in english text. If a way could be found to
encode just these letters with four bits, then the new encoding would be
smaller, would contain all the original information, and would have
less entropy. ASCII uses a fixed number of bits for a reason, however:
it’s easy, since one is always dealing with a fixed number of bits to
represent each possible glyph or character. How would an encoding scheme
that used four bits for the above letters be able to distinguish
between the four-bit codes and eight-bit codes? This seemingly difficult
problem is solved using what is known as a “prefix-free
variable-length” encoding.

In such an encoding, any number of
bits can be used to represent any glyph, and glyphs not present in the
message are simply not encoded. However, in order to be able to recover
the information, no bit pattern that encodes a glyph is allowed to be
the prefix of any other encoding bit pattern. This allows the encoded
bitstream to be read bit by bit, and whenever a set of bits is
encountered that represents a glyph, that glyph can be decoded. If the
prefix-free constraint was not enforced, then such a decoding would be
impossible.

Consider the text “AAAAABCD”. Using ASCII, encoding
this would require 64 bits. If, instead, we encode “A” with the bit
pattern “00”, “B” with “01”, “C” with “10”, and “D” with “11” then we
can encode this text in only 16 bits; the resulting bit pattern would be
“0000000000011011”. This is still a fixed-length encoding, however;
we’re using two bits per glyph instead of eight. Since the glyph “A”
occurs with greater frequency, could we do better by encoding it with
fewer bits? In fact we can, but in order to maintain a prefix-free
encoding, some of the other bit patterns will become longer than two
bits. An optimal encoding is to encode “A” with “0”, “B” with “10”, “C”
with “110”, and “D” with “111”. (This is clearly not the only optimal
encoding, as it is obvious that the encodings for B, C and D could be
interchanged freely for any given encoding without increasing the size
of the final encoded message.) Using this encoding, the message encodes
in only 13 bits to “0000010110111”, a compression ratio of 4.9 to 1
(that is, each bit in the final encoded message represents as much
information as did 4.9 bits in the original encoding). Read through this
bit pattern from left to right and you’ll see that the prefix-free
encoding makes it simple to decode this into the original text even
though the codes have varying bit lengths.

As a second example,
consider the text “THE CAT IN THE HAT”. In this text, the letter “T” and
the space character both occur with the highest frequency, so they will
clearly have the shortest encoding bit patterns in an optimal encoding.
The letters “C”, “I’ and “N” only occur once, however, so they will
have the longest codes.

There are many possible sets of
prefix-free variable-length bit patterns that would yield the optimal
encoding, that is, that would allow the text to be encoded in the fewest
number of bits. One such optimal encoding is to encode spaces with
“00”, “A” with “100”, “C” with “1110”, “E” with “1111”, “H” with “110”,
“I” with “1010”, “N” with “1011” and “T” with “01”. The optimal encoding
therefore requires only 51 bits compared to the 144 that would be
necessary to encode the message with 8-bit ASCII encoding, a compression
ratio of 2.8 to 1.

 
Input
The
input file will contain a list of text strings, one per line. The text
strings will consist only of uppercase alphanumeric characters and
underscores (which are used in place of spaces). The end of the input
will be signalled by a line containing only the word “END” as the text
string. This line should not be processed.
 
Output
For
each text string in the input, output the length in bits of the 8-bit
ASCII encoding, the length in bits of an optimal prefix-free
variable-length encoding, and the compression ratio accurate to one
decimal point.
 
Sample Input
AAAAABCD
THE_CAT_IN_THE_HAT
END
 
Sample Output
64 13 4.9
144 51 2.8
 
Source
 
题意:
只有大写字母和下划线的字符串,求哈夫曼编码长度和压缩比例。
代码:
 //搞不懂。。。算出每个字符出现的次数用优先队列从小到大存节点,每次取队列中两个最小的加起来再存入队列至队列中只有一个节点。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<functional>
#include<vector>
using namespace std;
int a[];
char s[];
int ans;
int main()
{
while(scanf("%s",s))
{
if(!strcmp(s,"END"))
break;
priority_queue<int,vector<int>,greater<int> >q;
int len=strlen(s);
memset(a,,sizeof(a));
for(int i=;i<len;i++)
{
if(s[i]=='_')
a[]++;
else a[s[i]-'A'+]++;
}
for(int i=;i<=;i++)
if(a[i]!=)
q.push(a[i]);
if(q.size()==)
ans=len;
else
{
ans=;
while(q.size()!=)
{
int x=q.top();
q.pop();
int y=q.top();
q.pop();
ans=ans+x+y;
q.push(x+y);
}
}
printf("%d %d %.1lf\n",*len,ans,(double)*len/(double)ans);
}
return ;
}

*HDU1053 哈夫曼编码的更多相关文章

  1. 哈夫曼(huffman)树和哈夫曼编码

    哈夫曼树 哈夫曼树也叫最优二叉树(哈夫曼树) 问题:什么是哈夫曼树? 例:将学生的百分制成绩转换为五分制成绩:≥90 分: A,80-89分: B,70-79分: C,60-69分: D,<60 ...

  2. (转载)哈夫曼编码(Huffman)

    转载自:click here 1.哈夫曼编码的起源: 哈夫曼编码是 1952 年由 David A. Huffman 提出的一种无损数据压缩的编码算法.哈夫曼编码先统计出每种字母在字符串里出现的频率, ...

  3. 数据结构图文解析之:哈夫曼树与哈夫曼编码详解及C++模板实现

    0. 数据结构图文解析系列 数据结构系列文章 数据结构图文解析之:数组.单链表.双链表介绍及C++模板实现 数据结构图文解析之:栈的简介及C++模板实现 数据结构图文解析之:队列详解与C++模板实现 ...

  4. HDU2527 哈夫曼编码

    Safe Or Unsafe Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...

  5. YTU 3027: 哈夫曼编码

    原文链接:https://www.dreamwings.cn/ytu3027/2899.html 3027: 哈夫曼编码 时间限制: 1 Sec  内存限制: 128 MB 提交: 2  解决: 2 ...

  6. 使用F#来实现哈夫曼编码吧

    最近算法课要求实现哈夫曼编码,由于前面的问题都是使用了F#来解决,偶然换成C#也十分古怪,报告也不好看,风格差太多.一开始是打算把C#版本的哈夫曼编码换用F#来写,结果写到一半就觉得日了狗了...毕竟 ...

  7. 赫夫曼\哈夫曼\霍夫曼编码 (Huffman Tree)

    哈夫曼树 给定n个权值作为n的叶子结点,构造一棵二叉树,若带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree).哈夫曼树是带权路径长度最短的树,权值较大的结点离 ...

  8. hdu2527哈夫曼编码

    /* Safe Or Unsafe Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) T ...

  9. [数据结构与算法]哈夫曼(Huffman)树与哈夫曼编码

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

随机推荐

  1. fetch 资源请求

    简介:fetch() 方法用于发起获取资源的请求.它返回一个 promise,这个 promise 会在请求响应后被 resolve,并传回 Response 对象. 为了更好的体验,可点击这里阅读 ...

  2. html5页面打包成App - Android或Iphone安装程序

    下载安装前端开发工具:HBuilder 官网下载:http://www.dcloud.io/ 根据官网说明安装 * 打开登录HBuilder,把做好的H5页面通过添加app项目把H5的文件夹加入进来( ...

  3. js parseInt 显示0

    parseInt 有第二个参数, 就是进制参数 parseInt("08", 10);  //表示这个数字是十进制的就不会出错了.

  4. 【ZJOI2007】棋盘制作 BZOJ1057

    Description 国 际象棋是世界上最古老的博弈游戏之一,和中国的围棋.象棋以及日本的将棋同享盛名.据说国际象棋起源于易经的思想,棋盘是一个8*8大小的黑白相间的方 阵,对应八八六十四卦,黑白对 ...

  5. WSME api controller嵌套使用wtypes

    # 定义user类型和user列表类型 from wsme import types as wtypes class User(wtypes.Base): name = wtypes.text age ...

  6. W7无法更新

    从提示中可以推断可能服务中没有启动更新服务,当即开始>>>运行>>>services.msc 打开服务管理,找到Windows Update服务,启动它.重新更新服 ...

  7. java基本算法之冒泡排序

    冒泡排序:是一种较简单的排序算法.它会遍历若干次要排序的数列,每次遍历时,它都会从前往后依次的比较相邻两个数的大小:如果前者比后者大,则交换它们的位置.这样,一次遍历之后,最大的元素就在数列的末尾! ...

  8. 数组排序sort()

    数组排序sort() sort()方法使数组中的元素按照一定的顺序排列. 语法: arrayObject.sort(方法函数) 参数说明: 1.如果不指定<方法函数>,则按unicode码 ...

  9. .NET LINQ 串联运算

    串联运算      串联是指将一个序列追加到另一个序列的运算. 方法 方法名 说明 C# 查询表达式语法 Visual Basic 查询表达式语法 更多信息 Concat 串联两个序列以组成一个序列. ...

  10. 使用VS2010编译64的Geos库

    Geos库在cmake中总是报错,所以我决定试试nmake编译64位的库.现将编译过程记录如下: 1.下载Geos,我下的是最新版3.5.0,地址在 http://trac.osgeo.org/geo ...