所谓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\)树的建立,也可以按照合并果子一样用堆辅助即可。

最新文章

  1. gridview汇出EXCEL (ExportGridViewToExcel(dt, HttpContext.Current.Response);)
  2. Session的SqlServer模式的配置
  3. HTML基础 整理
  4. 使用Phalcon开发工具碰到的数据库问题"Table 'XXX' doesn't exist in database when dumping meta-data for XXX"
  5. POJ3928、LA4329【树状数组】
  6. Android studio中Rendering Problems不能可视化操作的解决办法
  7. rsyslog+LogAnalyzer 日志收集
  8. Linux服务器下Java环境搭建
  9. 解决VS2015中没有报表项(ReportViewer)的方法
  10. 第二次项目冲刺(Beta阶段)第一天
  11. python 开发之路 -MySQL
  12. 阿里电话面试问题----100万个URL如何找到出现频率最高的前100个?
  13. IT轮子系列(七)——winform 版本更新组件
  14. python 文件和目录操作题库
  15. windows系统开启虚拟化
  16. html5 随机数函数
  17. python 回溯法 子集树模板 系列 —— 4、数字组合问题
  18. JS跨域设置和取Cookie
  19. Informix存储过程
  20. JavaWeb总结(十五)

热门文章

  1. http => https 升级
  2. plsql 详细安装及汉化步骤
  3. Python菜鸟之路:Python基础-Python操作RabbitMQ
  4. CSS 布局实例系列(四)如何实现容器中每一行的子容器数量随着浏览器宽度的变化而变化?
  5. liferay 指定默认首页
  6. ABAP服务器文件操作
  7. C#读取excel 找不到可安装的ISAM
  8. java 类中定义接口的调用方法
  9. ELKK 日志处理
  10. 常用grads函数