http://poj.org/problem?id=1521

题意:给你一个字符串,首先是计算出一个按正常编码的编码长度,其次是计算出一个用霍夫曼编码的编码长度,最后求正常编码的长度除以霍夫曼编码长度的值,保留一位小数。

思路:正常的编码长度的话,由于都是ASCII码值所以编码长度都为8,所以总长度就是8*字符串的长度Len,然后霍夫曼编码的话,discuss里面很多人都是用优先队列,用优先队列的话,就不用自己维护了,我没用采用优先队列,而是一直维护一个递减的数组,这样的效果和有优先队列是一样的。

霍夫曼编码的示意图

我在这里假设,A有10个,B有5个,C有3个,D有一个。

那么霍夫曼编码的话,就是这样编的。

而这道题是求霍夫曼编码的编码长度。

为什么C和D会比B要多一个编码长度,因为C和D在树枝上要比B要多一个分叉点,那么那个如果没有这个分叉点的话,C和D的编码长度就是和B的一样。

那么我们就可以首先用个把最少的两个字符数加起来,因为在现阶段每个字符都可以看出是只有一个0或者1编码编成的。然后把这两个字符合并起来,意思就是我可以看成没有D这个元素,而是有4个C。

这样就少了一个分叉点,这4个C又和5个B构成了一个分叉点。在现阶段,我们又可以把这5个B和4个C看成只有1个编码长度(0或1)构成的,然后把这两个字符的数加起来,在把这两个字符合并。

相当于只有10个A和9个B构成的。然后A就由0编码,B就由1编码,在把他们两个字符数相加,在合并,最后就相当于有19个A了。然后就编码就结束了。

这里或许有些人会不理解,其实你想,比如说D加了几次。首先D是在和C合并之前就加了一次,然后,D就被C包含了。然后C再和B合并之前有加了一次,这里就相当于D有又加了一次,最后B又包含了C,

最后B在和A合并之前又加了一次,这就可以说明。D是被加了3次的。D的编码长度也就是3,在上面图示上的D的编码也就是111.

每个分叉点的数目都是它下面所有的分支的数目和。而下面的分支在合并之前就加了一次。

 #include <stdio.h>
#include <string.h>
#include <stdlib.h> char inp[]; int s[]; int cmp(const void *a,const void *b)
{
return (*(int *)b)-(*(int *)a);
} int main()
{
while(scanf("%s",inp),strcmp(inp,"END")!=)
{
int ans=;
memset(s,,sizeof(s[]));
int len=strlen(inp);
for(int i=;i<len;i++)
s[inp[i]]++;
qsort(s,,sizeof(s[]),cmp);
if(s[]==len) ans=len;
else while(s[]!=len){
int i=;
for(;s[i]!=;i++); //这里注意有个分号,目的是找出它的最小的那个点。
ans+=s[--i];
ans+=s[i-];
s[i-]+=s[i];
s[i]=;
qsort(s,i,sizeof(s[]),cmp); //霍夫曼编码,是从最小的那两个开始编的。
}
printf("%d %d %.1f\n",len*,ans,1.0*len*/ans);
memset(inp,,sizeof(inp));
}
return ;
}

poj 1521的更多相关文章

  1. [POJ 1521]--Entropy(哈夫曼树)

    题目链接:http://poj.org/problem?id=1521 Entropy Time Limit: 1000MS    Memory Limit: 10000K Description A ...

  2. Poj(1521),哈夫曼编码

    题目链接:http://poj.org/problem?id=1521 这里,网上有很多博客都有写,很多人没有建树,直接就是求一下这个哈夫曼编码的长度,的确很巧妙,我也用的这个方法,但是,几乎所有博客 ...

  3. 【霍夫曼树】 poj 1521 Entropy

    poj.org/problem?id=1521 注意只有特殊情况:只有一种字母 #include<iostream> #include<cstdio> #include< ...

  4. POJ推荐50题

    此文来自北京邮电大学ACM-ICPC集训队 此50题在本博客均有代码,可以在左侧的搜索框中搜索题号查看代码. 以下是原文: POJ推荐50题1.标记“难”和“稍难”的题目可以看看,思考一下,不做要求, ...

  5. poj 1719 Shooting Contest

    http://poj.org/problem?id=1719 Shooting Contest Time Limit: 1000MS   Memory Limit: 10000K Total Subm ...

  6. POJ 3370. Halloween treats 抽屉原理 / 鸽巢原理

    Halloween treats Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 7644   Accepted: 2798 ...

  7. POJ 2356. Find a multiple 抽屉原理 / 鸽巢原理

    Find a multiple Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7192   Accepted: 3138   ...

  8. POJ 2965. The Pilots Brothers' refrigerator 枚举or爆搜or分治

    The Pilots Brothers' refrigerator Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 22286 ...

  9. POJ 1753. Flip Game 枚举or爆搜+位压缩,或者高斯消元法

    Flip Game Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 37427   Accepted: 16288 Descr ...

随机推荐

  1. Semantic ui 学习笔记 持续更新

    这个semantic 更新版本好快~ 首先是代码的标识<code></code> 具体样式就是红框这样的 圈起来代码感觉不错 不过要在semantic.css里在加上如下样式~ ...

  2. yii2嵌入微信公众号支付

    原文地址:https://segmentfault.com/a/1190000005114556

  3. php self与static的区别

    self vs static 用一个demo来直接说明self与static的区别.self示例: <?phpclass Vehicle {    protected static $name ...

  4. webstorm总结

    webStorm修改文件类型,文件着色 File->Settings->Editor->File Types

  5. mysql 简单练习

    1.查找全部学生的信息 [SQL]select * from student 受影响的行: 0 时间: 0.000s 2.查出成绩及格的所有人 [SQL]select * from student w ...

  6. 只有文本编辑器才是王道, 什么ide都是evil的浮云, 看看linus linux的内核开发工具vim emacs

    只有文本编辑器才是王道, 什么ide都是evil的浮云, 看看linus linux的内核开发工具vim emacs [ide is evil] (http://i.cnblogs.com/EditP ...

  7. HTTP报文详解

    二.HTTP请求首部字段 1 Accept 2 Accept-Charset 3 Accept-Encoding 4 Accept-Language 5 Authorization 6

  8. web开发前端学习

    bootstrap:  http://www.bootcss.com/ bootstrap:   http://bootsnipp.com/snippets/featured/single-colum ...

  9. Hadoop 面试题 之Hive

    1.Hive 有哪些方式保存元数据,各有哪些特点. 15. Hive内部表和外部表的区别 23.hive底层与数据库交互原理Hive的Hql语句掌握情况? 36.使用Hive或自定义mr实现如下逻辑: ...

  10. JAVA 笔记

    一.Java基础以及面向对象编程1.float类型的数自动转换成double类型时,可能会出现前后不相等的情况,因为有些数不能够用有限的二进制位精确表示.2.右移>>右移,左边空出位以符号 ...