贪心算法 --- 例题2.哈夫曼编码问题
贪心算法 — 例题2.哈夫曼编码问题
一.问题描述
Huffman树在编码中有着广泛的应用。在这里,我们只关心Huffman树的构造过程。
树的带权路径长度:树中所有叶子结点的带权路径长度之和,通常记作:WPL = Σwi*li (i=1~n)
哈夫曼树,Huffman树定义:在权为w1,w2,…,wn的n个叶子结点的所有二叉树中,带权路径长度WPL最小的二叉树称为赫夫曼树或最优二叉树。
本题任务:对于给定的一个数列,现在请你求出用该数列构造Huffman树的总费用。
二.解题思路
哈夫曼树的构造(哈夫曼算法)
- 1.根据给定的n个权值{w1,w2,…,wn}构成二叉树集合F={T1,T2,…,Tn},其中每棵二叉树Ti中只有一个带权为wi的根结点,其左右子树为空.
- 2.在F中选取两棵根结点权值最小的树作为左右子树构造一棵新的二叉树,且置新的二叉树的根结点的权值为左右子树根结点的权值之和.
- 3.在F中删除这两棵树,同时将新的二叉树加入F中.
- 4.重复2、3,直到F只含有一棵树为止.(得到哈夫曼树)
代码如下:
// 哈夫曼编码贪心算法实现
// 输入格式
// 输入的第一行包含一个正整数n(n<=100)。
// 接下来是n个正整数,表示p0, p1, …, pn-1,每个数不超过1000。
// 输出格式
// 输出用这些数构造Huffman树的总费用。
#include<bits/stdc++.h>
using namespace std;
int Huffman(int *a, int n)
{int ans = 0;int pos = 0;int temp_n = n;while(n>1){// sort(a+pos, a+temp_n);sort(a, a+temp_n); ans = ans + (a[pos] + a[pos+1]);a[pos+1] = a[pos] + a[pos+1];pos++;n--;}return ans;
}
int Huffman2(int a[], int n)
{int ans = 0;sort(a, a+n);for(int i=0; i<n-1; i++){ans += (a[i]+a[i+1]);a[i+1] += a[i];sort(a, a+n);}return ans;
}
int main()
{int t, n;cin>>t;while (t--){cin>>n; int a[n];for(int i=0; i<n; i++) cin>>a[i];cout<<Huffman2(a, n)<<endl;}system("pause");return 0;
}
参考毕方明老师《算法设计与分析》课件.
欢迎大家访问个人博客网站—乔治的编程小屋,和我一起为大厂offer努力!
贪心算法 --- 例题2.哈夫曼编码问题相关推荐
- 哈夫曼编码压缩率计算_程序员的算法课(8)-贪心算法:理解霍夫曼编码
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/m0_37609579/article/ ...
- 程序员的算法课(8)-贪心算法:理解霍夫曼编码
一.一种很贪婪的算法定义 贪心是人类自带的能力,贪心算法是在贪心决策上进行统筹规划的统称. [百度百科]贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择.也就是说,不从整体 ...
- 哈夫曼算法以及求哈夫曼编码
哈夫曼树又称最优树,是一类带权路径长度最短的树.其中带权路径长度WPL最小的二叉树称作最优二叉树或哈夫曼树. 哈夫曼的构造算法: (1):根据给定的n个权值{w1,w2,w3.....},构造n课只有 ...
- 哈夫曼树(最优二叉树)、哈夫曼编码
在此祝大家新年快乐,新的一年守住头发,不断进步! 哈夫曼树 一.哈夫曼树基本概念 二.哈夫曼树的构造算法 三.哈夫曼构造算法的实现 四.哈夫曼编码 五.哈夫曼编码的算法实现 一.哈夫曼树基本概念 (1 ...
- 哈夫曼树及哈夫曼编码
哈夫曼树 哈夫曼树,最优二叉树,带权路径长度(WPL)最短的树.它没有度为1的点,是一棵严格的二叉树(满二叉树). 何谓'带权路径长度' 了解哈夫曼树,我们首先要知道树的几个相关术语,并了解什么是WP ...
- 数据结构与算法基础-学习-19-哈夫曼解码
一.个人理解 哈夫曼树和哈夫曼编码相关概念.代码.实现思路分享,请看之前的文章链接<数据结构与算法基础-学习-17-二叉树之哈夫曼树>.<数据结构与算法基础-学习-18-哈夫曼编码& ...
- 贪心算法-03哈夫曼编码问题
哈夫曼编码 简介 哈夫曼编码是一种字符编码方式,可以对指定的字符集进行数据压缩,压缩率在20%到90%. 问题描述 现在有一个包含5个字符{A,B,C,D,E},各个字符的出现频率依次为{0.35, ...
- 贪心算法 - 哈夫曼编码 Huffman
转载地址 : http://blog.csdn.net/xuefeng0707/article/details/7844834 哈夫曼编码: 一种字符编码方式,常用于数据文件压缩.压缩率通常在2 ...
- 贪心算法之用优先队列(priority_queue)实现哈夫曼编码问题
1.问题 参考我的博客:贪心算法之哈夫曼编码问题 2.优先队列知识复习 参考我的博客: C++之STL之priority_queue 3.代码实现 #include <iostream> ...
- 贪心算法之最小堆实现霍夫曼编码
贪心算法之最小堆实现霍夫曼编码 实现之前需要学习的地方: 如果你不了解堆.堆的插入.堆的删除,可以先看下我前面几篇博客 http://blog.csdn.net/u011068702/article/ ...
最新文章
- 你不能忽视的HTML语言3
- IBASE hierarchy structure and related API
- 【CF1100F】 Ivan and Burgers (分治+线性基)
- mysql ssl编译_centos编译安装配置支持ssl加密的mysql replication
- hive根据已有表创建新表_读取Hive中所有表的表结构,并在新Hive库中创建表,索引等...
- aix系统查看服务器型号齐全,查看AIX系统位数
- HMM,MEMM,CRF模型的比较
- 贝叶斯网络:故障诊断方法研究
- java 解析中文乱码_解析Java中文乱码的处理方法
- Java保留小数位数两种简单方法
- 【转】教你如何用手机连接电脑上网
- Kafka 常用命令
- The COMMIT TRANSACTION request has no corresponding BEGIN
- html 项目实战摄影开课吧,最新《开课吧Web全栈架构师正式课》(Vue.JS及实战项目)...
- vb与c语言数组传递,VB几种函数参数传递方法,Variant,数组,Optional,ParamArray
- Redis资料汇总(二) 数据类型
- 中鑫优配热点前瞻:国防军工+数据安全+燃料电池+煤炭
- 学习阶段路线已备好,Python入门—进阶—爬虫—算法,带你进阶
- jsp+servlet实现简单商品上传、商品浏览、与商品分页技术
- CKEditor的使用示例