浅谈Huffman树
所谓Huffman树,就是叶子结点带权的\(K\)叉树,假设每个叶子的权值为\(v\),到根的距离为\(dep\),那么最小化\(\sum v_i*dep_i\)就是\(Huffman\)树的拿手好戏。
为了最小化这个值,显然我们应该尽量让权值大的叶子深度浅,合并果子就是一个典型\(2\)叉\(Huffman\)树问题。
那么对于\(k\)叉\(Huffman\)树呢?
我们以\(3\)叉\(Huffman\)树为例,有这么\(6\)个数:\(1,2,3,5,8,9\)
按照合并果子这题的思路,我们应该先花\(6\)体力合并\(1,2,3\),新序列为:\(6,5,8,9\)
然后花\(19\)体力合并\(5,6,8\),新序列为:\(19,9\)
最后花\(28\)体力合并\(19,9\),新序列是\(28\),一共用的体力为\(53\)
但是我们换一种方式合并:
\(1,2,3,5,8,9\)
\(3,3,5,8,9\)
\(11,8,9\)
\(28\)
一共用了\(42\)体力。
那么问题就出现了,显然对于\(2\)叉\(Huffman\)树的贪心策略不再适用于\(k\)叉\(Huffman\)树。
但是,是真的不适用么?
仔细考虑上面两个例子,在用了\(53\)体力的例子里,我们最后一步合并了\(19,9\),但其实我们还可以假设有一个权值为\(0\)的点在这一步被合并了。
但在用了\(42\)体力的例子里,我们第一步就把权值\(0\)给安排了。
所以对于\(2\)叉\(Huffman\)树的贪心策略还是有用的,不过我们忽视了权值为\(0\)的结点。因为\(2\)叉\(Huffman\)树怎么建都不会存在某一步被合并的结点少于\(2\),但是\(k\)叉\(Huffman\)树不一样,它必须满足\((n-1)mod(k-1)=0\)才会每一步合并的结点都不少于\(k\)。因为每次合并都会减少\(k-1\)个结点,一共会减少\(n-1\)个结点。如果不满足上述等式,我们只需要不断添加权值为\(0\)的结点直到它满足为止即可。
关于\(k\)叉\(Huffman\)树的建立,也可以按照合并果子一样用堆辅助即可。
浅谈Huffman树的更多相关文章
- 浅谈B+树索引的分裂优化(转)
http://www.tamabc.com/article/85038.html 从MySQL Bug#67718浅谈B+树索引的分裂优化 原文链接:http://hedengcheng.com/ ...
- 浅谈oracle树状结构层级查询之start with ....connect by prior、level及order by
浅谈oracle树状结构层级查询 oracle树状结构查询即层次递归查询,是sql语句经常用到的,在实际开发中组织结构实现及其层次化实现功能也是经常遇到的,虽然我是一个java程序开发者,我一直觉得只 ...
- 浅谈oracle树状结构层级查询测试数据
浅谈oracle树状结构层级查询 oracle树状结构查询即层次递归查询,是sql语句经常用到的,在实际开发中组织结构实现及其层次化实现功能也是经常遇到的,虽然我是一个java程序开发者,我一直觉得只 ...
- (转)浅谈trie树
浅谈Trie树(字典树) Trie树(字典树) 一.引入 字典是干啥的?查找字的. 字典树自然也是起查找作用的.查找的是啥?单词. 看以下几个题: 1.给出n个单词和m个询问,每次询问 ...
- 【转】Senior Data Structure · 浅谈线段树(Segment Tree)
本文章转自洛谷 原作者: _皎月半洒花 一.简介线段树 ps: _此处以询问区间和为例.实际上线段树可以处理很多符合结合律的操作.(比如说加法,a[1]+a[2]+a[3]+a[4]=(a[1]+a[ ...
- 浅谈B树
B树即二叉搜索树: 1.所有非叶子结点至多拥有两个儿子(Left和Right): 2.所有结点存储一个关键字: 3.非叶子结点的左指针指向小于其关键字的子树,右指针指向大于其关键字的子树: 如: ...
- 浅谈 trie树 及其实现
定义:又称字典树,单词查找树或者前缀树,是一种用于快速检索的多叉树结构, 如英文字母的字典树是一个26叉树,数字的字典树是一个10叉树. 核心思想:是空间换时间.利用字符串的公共前缀来降低查询时间的开 ...
- 浅谈Trie树(字典树)
Trie树(字典树) 一.引入 字典是干啥的?查找字的. 字典树自然也是起查找作用的.查找的是啥?单词. 看以下几个题: 1.给出n个单词和m个询问,每次询问一个单词,回答这个单词是否在单 ...
- [转] 浅谈Trie树(字典树)
原文地址:https://www.cnblogs.com/TheRoadToTheGold/p/6290732.html Trie树(字典树) 一.引入 字典是干啥的?查找字的. 字典树自然也是起查找 ...
随机推荐
- Biorhythms
Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 135099 Accepted: 43146 Description So ...
- java 基于tomcat的数据源案例
1.在context中定义数据源 <?xml version="1.0" encoding="UTF-8"?> <Context path=& ...
- 网站存储session的方案
1: ASP.NET State Service是什么 用来管理 Session 的,正常来说,Session 位于IIS进程中(其实可以理解成在服务器的内存中),当IIS重启或程序池回收会自动清空S ...
- 九度OJ 1180:对称矩阵 (矩阵计算)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:2637 解决:1354 题目描述: 输入一个N维矩阵,判断是否对称. 输入: 输入第一行包括一个数:N(1<=N<=100),表 ...
- 【python】-- 面向对象引子、概念
面向过程编程 1.编程范式 编程是 程序 员 用特定的语法+数据结构+算法组成的代码来告诉计算机如何执行任务的过程 , 一个程序是程序员为了得到一个任务结果而编写的一组指令的集合,正所谓条条大路通罗马 ...
- spring AOP理解和相关术语
一.AOP理解 AOP:横向抽取机制,底层使用代理方式实现. 示例: 现有LogDAO接口以及实现Log接口的Log类.类有add的方法,现在要打印add方法的开始时间和结束时间.(即增强Log的ad ...
- mysql存储引擎(待补充)
数据库中的表也应该有不同的类型,表的类型不同,会对应mysql不同的存取机制,表类型又称为存储引擎 存储引擎说白了就是如何存取数据.如何为存储的数据建立索引和如何更新.查询数据等技术的实现方法.因为在 ...
- 详谈 MySQL Online DDL
作为一名DBA,对数据库进行DDL操作非常多,如添加索引,添加字段等等.对于MySQL数据库,DDL支持的并不是很好,一不留心就导致了全表被锁,经常搞得刚入门小伙伴很郁闷又无辜,不是说MySQL支持O ...
- TP里的关联查询
$res = $db->join('b on a.ex_id = b.pe_eid')->select(); 注意:这里的表a.表b需要带表前缀
- html转义字符及css清除
1. [代码][Java]代码 import java.util.HashMap;import java.util.Map; import org.apache.commons.lang3. ...