贪心算法 — 例题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.哈夫曼编码问题相关推荐

  1. 哈夫曼编码压缩率计算_程序员的算法课(8)-贪心算法:理解霍夫曼编码

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/m0_37609579/article/ ...

  2. 程序员的算法课(8)-贪心算法:理解霍夫曼编码

    一.一种很贪婪的算法定义 贪心是人类自带的能力,贪心算法是在贪心决策上进行统筹规划的统称. [百度百科]贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择.也就是说,不从整体 ...

  3. 哈夫曼算法以及求哈夫曼编码

    哈夫曼树又称最优树,是一类带权路径长度最短的树.其中带权路径长度WPL最小的二叉树称作最优二叉树或哈夫曼树. 哈夫曼的构造算法: (1):根据给定的n个权值{w1,w2,w3.....},构造n课只有 ...

  4. 哈夫曼树(最优二叉树)、哈夫曼编码

    在此祝大家新年快乐,新的一年守住头发,不断进步! 哈夫曼树 一.哈夫曼树基本概念 二.哈夫曼树的构造算法 三.哈夫曼构造算法的实现 四.哈夫曼编码 五.哈夫曼编码的算法实现 一.哈夫曼树基本概念 (1 ...

  5. 哈夫曼树及哈夫曼编码

    哈夫曼树 哈夫曼树,最优二叉树,带权路径长度(WPL)最短的树.它没有度为1的点,是一棵严格的二叉树(满二叉树). 何谓'带权路径长度' 了解哈夫曼树,我们首先要知道树的几个相关术语,并了解什么是WP ...

  6. 数据结构与算法基础-学习-19-哈夫曼解码

    一.个人理解 哈夫曼树和哈夫曼编码相关概念.代码.实现思路分享,请看之前的文章链接<数据结构与算法基础-学习-17-二叉树之哈夫曼树>.<数据结构与算法基础-学习-18-哈夫曼编码& ...

  7. 贪心算法-03哈夫曼编码问题

    哈夫曼编码 简介 哈夫曼编码是一种字符编码方式,可以对指定的字符集进行数据压缩,压缩率在20%到90%. 问题描述 现在有一个包含5个字符{A,B,C,D,E},各个字符的出现频率依次为{0.35, ...

  8. 贪心算法 - 哈夫曼编码 Huffman

    转载地址  :   http://blog.csdn.net/xuefeng0707/article/details/7844834 哈夫曼编码: 一种字符编码方式,常用于数据文件压缩.压缩率通常在2 ...

  9. 贪心算法之用优先队列(priority_queue)实现哈夫曼编码问题

    1.问题 参考我的博客:贪心算法之哈夫曼编码问题 2.优先队列知识复习 参考我的博客: C++之STL之priority_queue 3.代码实现 #include <iostream> ...

  10. 贪心算法之最小堆实现霍夫曼编码

    贪心算法之最小堆实现霍夫曼编码 实现之前需要学习的地方: 如果你不了解堆.堆的插入.堆的删除,可以先看下我前面几篇博客 http://blog.csdn.net/u011068702/article/ ...

最新文章

  1. 你不能忽视的HTML语言3
  2. IBASE hierarchy structure and related API
  3. 【CF1100F】 Ivan and Burgers (分治+线性基)
  4. mysql ssl编译_centos编译安装配置支持ssl加密的mysql replication
  5. hive根据已有表创建新表_读取Hive中所有表的表结构,并在新Hive库中创建表,索引等...
  6. aix系统查看服务器型号齐全,查看AIX系统位数
  7. HMM,MEMM,CRF模型的比较
  8. 贝叶斯网络:故障诊断方法研究
  9. java 解析中文乱码_解析Java中文乱码的处理方法
  10. Java保留小数位数两种简单方法
  11. 【转】教你如何用手机连接电脑上网
  12. Kafka 常用命令
  13. The COMMIT TRANSACTION request has no corresponding BEGIN
  14. html 项目实战摄影开课吧,最新《开课吧Web全栈架构师正式课》(Vue.JS及实战项目)...
  15. vb与c语言数组传递,VB几种函数参数传递方法,Variant,数组,Optional,ParamArray
  16. Redis资料汇总(二) 数据类型
  17. 中鑫优配热点前瞻:国防军工+数据安全+燃料电池+煤炭
  18. 学习阶段路线已备好,Python入门—进阶—爬虫—算法,带你进阶
  19. jsp+servlet实现简单商品上传、商品浏览、与商品分页技术
  20. CKEditor的使用示例

热门文章

  1. 2020抖音无人直播技术:最新不封号无人直播的操作方法详细介绍
  2. Objective C TCP 通讯实例
  3. python半自动化获取QQ空间说说
  4. echarts 生成 迁徙图_echarts3 迁徙图 迁入迁出
  5. shapefile文件格式转inp文件格式
  6. 四川大学转专业计算机条件,四川大学转专业需要什么条件
  7. 智慧城市的投资运营与评估
  8. Java处理wangeditor上传图片并升级一下
  9. 基于单片机的热敏电阻测温设计
  10. Depends简介与使用说明