温故而知新, 哈夫曼树(Huffman tree)

哈夫曼树定义:在一棵二叉树中,若带权路径长度达到最小,称这样的二叉树为最优二叉树,也称哈夫曼树。

如何构建哈夫曼树:

一般可以按如下步骤构建:

假设有n个权值W1,W2,...,Wn,将这些权值看成是有n棵树的森林(每棵树仅有一个节点),

则哈夫曼树的构造规则为:

1,在森林中选出2个根节点的权值最小的树合并为一棵新树,作为左右子树,且新树的根节点权值为其左右子树根节点权值之和。

2,从森林中删除这两棵树,同时把新树加入到森林中。

3,重复1,2步骤,直到森林中只有一棵树为止,此树就是哈夫曼树。

哈夫曼树构造过程是一个递归过程,证明此构造过程出来的树一定是最优树。

那么我们只要证明:一棵最优二叉树,删除权值最小的两个叶节点(必须有共同父节点),同时父节点

的权值记为刚刚删除的2个子节点的权值之和,则新生成的树也是最优二叉树。

假定初始最优二叉树为T,权值为W(T),合并掉T的2个叶节点a,b生成c节点,a和b的权值分别记为W(a), W(b),

记新树为T‘(包含c节点),记树的权值为W(T‘),则W(T)=W(T‘)+W(a)+W(b),现在证明T‘也是一颗最优二叉树,

假定T‘不是最优二叉树,则有T*(包含c节点)为最优二叉树,且W(T*)<W(T‘),因为T*包含c,

把c拆分成权值分别为W(a),W(b)的a和b,形成新树T^,那么W(T^)=W(T*)+W(a)+W(b),

那么W(T^)<W(T‘)+W(a)+W(b),最终W(T^)<W(T),这跟T是最优二叉树矛盾,所以反过来说明T‘是最优二叉树。得证。

原文地址:https://www.cnblogs.com/printk/p/9823476.html

时间: 2024-11-08 18:43:47

温故而知新, 哈夫曼树(Huffman tree)的相关文章

Python---哈夫曼树---Huffman Tree

今天要讲的是天才哈夫曼的哈夫曼编码,这是树形数据结构的一个典型应用. !!!敲黑板!!!哈夫曼树的构建以及编码方式将是我们的学习重点. 老方式,代码+解释,手把手教你Python完成哈夫曼编码的全过程.. 首先,我先假设你已经有了二叉树的相关知识,主要就是概念和遍历方式这些点.如果没有这些知识储备,可能理解起来会比较困难. 好了,废话不多说. 哈夫曼树原理 秉着能不写就不写的理念,关于哈夫曼树的原理及其构建,还是贴一篇博客吧. http://www.cnblogs.com/mcgrady/p/3

哈夫曼树(Huffman)

在数据结构书中,讲解树内容的时候,都会介绍哈夫曼树(Huffman)和哈夫曼编码(哈夫曼树的一种应用).关于哈夫曼树的定义,在这里就不讨论了,接下来贴出LZ实现哈夫曼树的一种方案. 构建哈夫曼树: 1.首先将所有的节点构成独立的二叉树,这些二叉树构成的一个森林,将这些二叉树构建成一个最小堆: 2.选择最小堆中两个最小树,构建成一颗新的树,将新树插入到最小堆中,删除被选出的两颗最小树: 3.如果最小堆节点数大于1,重复2. 4.最小堆中最后一个节点,这棵树就是哈夫曼树. 本文中二叉树的实现类似二叉

详细了解哈夫曼树和背包问题

写在前面 最近在疯狂复习数据结构和算法,虽然看完了一部完整的视频.但是转眼看看自己手中的<剑指Offer>里面还是不是很清楚...而且最近也突然觉得自己知识和别人比起来就是一个渣渣.各种被人家吊打... 这两个算法一个(哈夫曼树)是看最近视频动手实践的,一个(背包问题)是前段时间一个面试里面的题目,当时不知道这是一个系类的问题,昨天和大神聊完天之后才明白.所以乘着短暂的热情还在就记录下来先从哈夫曼树开始!! 1.哈夫曼树(实现基本的编码解码) 简单定义: 给定n个权值作为n个叶子结点,构造一棵

C++哈夫曼树编码和译码的实现

一.背景介绍: 给定n个权值作为n个叶子结点,构造一棵二叉树,若带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree).哈夫曼树是带权路径长度最短的树,权值较大的结点离根较近. 二.实现步骤: 1.构造一棵哈夫曼树 2.根据创建好的哈夫曼树创建一张哈夫曼编码表 3.输入一串哈夫曼序列,输出原始字符 三.设计思想: 1.首先要构造一棵哈夫曼树,哈夫曼树的结点结构包括权值,双亲,左右孩子:假如由n个字符来构造一棵哈夫曼树,则共有结点2n-1个:在构造前,先初始化

哈夫曼树 POJ 3253 Fence Repair

竟然做过原题,一眼看上去竟然没感觉... 哈夫曼树定义:给定n个权值作为n个叶子结点,构造一棵二叉树,若带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman tree).哈夫曼树是带权路径长度最短的树,权值较大的结点离根较近. 1.路径和路径长度 在一棵树中,从一个结点往下可以达到的孩子或孙子结点之间的通路,称为路径.通路中分支的数目称为路径长度.若规定根结点的层数为1,则从根结点到第L层结点的路径长度为L-1. 2.结点的权及带权路径长度 若将树中结点赋给一个有着某

哈夫曼树——贪心

哈夫曼树——贪心 哈夫曼树:给定n个权值作为n的叶子结点,构造一棵二叉树,若带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman tree).哈夫曼树是带权路径长度                 最短的树,权值较大的结点离根较近. 此类题目一般求算哈夫曼树路径总值,利用贪心选择性质每次从队头取出两个边权和最小的树合并成新树入队(优先队列,保证队首元素最小),每次记录新树权值,当队内只剩一棵树时结束算法: priority_queue<long long,vector

文件压缩——哈夫曼树编码(一)

何谓哈夫曼树?-- 百度百科:给定n个权值作为n个叶子结点,构造一棵二叉树,若带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree).哈夫曼树是带权路径长度最短的树,权值较大的结点离根较近. 哈夫曼树的应用?-- 哈夫曼编码 与 哈夫曼译码. 哈夫曼树为基础的项目?-- 文件压缩. 文件压缩分两种:1.有损压缩.2.无损压缩. 哈夫曼树为核心算法的压缩方式是无损压缩. 其实我们windows常用的zip类型的压缩包底层,哈夫曼树就是核心算法之一(当然不全是)

20172303 2018-2019-1《程序设计与数据结构》哈夫曼树编码与解码

20172303 2018-2019-1<程序设计与数据结构>哈夫曼树编码与解码 哈夫曼树简介 定义:给定n个权值作为n个叶子结点,构造一棵二叉树,若带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree).哈夫曼树是带权路径长度最短的树,权值较大的结点离根较近. 带权路径长度(Weighted Path Length of Tree,简记为WPL) 结点的权:在一些应用中,赋予树中结点的一个有某种意义的实数. 结点的带权路径长度:结点到树根之间的路径长度与

数据结构与算法 -- 哈夫曼树思想与创建详解1

PS:什么是哈夫曼树? 给定n个权值作为n个叶子结点,构造一棵二叉树,若该树的带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree).哈夫曼树是带权路径长度最短的树,权值较大的结点离根较近. 计算规则: 假设一组权值,一个权值是一个结点,12  34  2  5  7  ,在这其中找出两个最小的权值,然后组成一个新的权值,再次找出最小的权值结点.如图: 问题: 1:如果程序找出两个最小的权值,把两个权值最小的相加结果再次添加到数组中呢. 2:完成第一步后,又