(2016-3)字符串的哈夫曼编码长度

问题描述:

给定一个字符串(长度不超过100),求哈夫曼编码的最短长度

样例输入:

输入1:

abbcccdddd

输出1:

19

输入2:

we will we will r u

输出2:

50

思路:

本题如果真要用哈夫曼来建树,计算值会非常复杂。

首先要能够发现规律:哈夫曼树的编码长度等于各个叶节点权值与路径长度乘积之和,同时这个值等于非叶节点之和。

采用优先队列模拟哈夫曼树的建立。采用map记录字符与出现的次数,将每个字符的次数依次加入优先队列(数值小的在队头),每一次从队列中出队最小的两个,相加后再加入队列中。用ans记录每一次相加和temp值之和,当队列中剩下一个元素时,ans的值即为所求

知识点:

priority_queue 优先队列

  1. priority_queue<int>q; 默认为数字(字典序)大的值在队首top,等价于priority_queue<int, vector<int>, less<int> >q;
  2. priority_queue<int, vector<int>, greater<int> >q; 表示数字(字典序)小的在队首
  3. 没有front、back函数,只有top用于读取队首元素

注意:

  1. map中查找元素用find,要仔细
  2. <
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值