【2016】字符串的哈夫曼编码长度(优先队列)(没思路)

27 篇文章 2 订阅
6 篇文章 0 订阅

优先队列priority_queue知识点总结:

  • 只能用top()访问元素,常用函数有top/push/pop/empty/size
  • 优先级设置

思路:

  • 字符出现的频率则为其权值
  • 哈夫曼树的编码长度等于各个叶节点权值与路径长度乘积之和,同时这个值等于非叶节点之和
    #include<iostream>
    #include<functional>  //支持greater
    #include<string>
    #include<queue>
    #include<map>
    using namespace std;
    map<char, int> mp;  //字符到整型的映射map<char,int>,字符串到整型的映射 map<string,int>
    priority_queue<int,vector<int>,greater<int> > q;
    int main() {
    	string s;
    	getline(cin, s);    //类似char数组的gets,吸收一行,包括空格,用cin>>str,不能吸收空格
    	for (int i = 0; i < s.length(); i++) {
    		mp[s[i]]++;
    	}
    	int ans = 0;
    	map<char, int>::iterator it;
    	for (it = mp.begin(); it != mp.end(); it++)    
    		q.push(it->second);
    	while (q.size()!=1) {   //不是!q.empty()
    		int a = q.top();
    		q.pop();
    		int b = q.top();
    		q.pop();
    		int x = a + b;
    		ans += x;
    		q.push(x);
    	}
    	cout << ans;
    	system("pause");
    	return 0;
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值