Huffman Tree

article/2025/9/29 1:15:18

Huffman Tree

哈夫曼树;哈夫曼编码;最优二叉树
自底向上
变长编码;前缀编码;熵编码
数据无损压缩;最短编码;最佳判定树

一、基本概念

  1. Huffman Tree,又称最优二叉树,是带权路径长度最短的树,权值较大的结点离根较近。
    定义:给定n权值作为n个叶子节点,构造一棵二叉树,若这棵二叉树的带权路径长度达到最小,则称这样的二叉树为最优二叉树,也称为Huffman树。

  2. 路径:在一棵树中,从一个结点往下可以达到的孩子或孙子结点之间的通路。

  3. 路径长度:通路中分支的数目称为路径长度。
    e.g. 若规定根结点的层数为 1 1 1,则从根结点到第 L L L层结点的路径长度为 L − 1 L-1 L1

  4. 结点的权:若将树中结点赋给一个有着某种含义的数值,则这个数值称为该结点的权。

  5. 带权路径长度:从根结点到该结点之间的路径长度与该结点的乘积

  6. 树的带权路径长度:树的带权路径长度规定为所有叶子结点的带权路径长度之和,记为WPL
    W P L = ∑ i = 1 n w i l i WPL = \sum_{i=1}^nw_il_i WPL=i=1nwili
    其中, n n n表示叶子结点的数目, w i w_i wi l i l_i li分别表示叶子结点 k i k_i ki的权值和树根结点到叶子结点 k i k_i ki之间的路径长度。

二、性质

  1. 不唯一(具有相同带权结点);左右子树可以互换;
  2. 带权值的节点都是叶子节点;
  3. Huffman tree中只有叶子节点和度为 2 2 2的节点,没有度为1的节点;
  4. 一棵有 n n n个叶子节点的Huffman tree共有 2 n − 1 2n-1 2n1个节点,需要 n − 1 n-1 n1次合并。

三、构造

假设有 n n n个权值,则构造出的哈夫曼树有 n n n个叶子结点。 n n n个结点的权值分别设为 w 1 , w 2 , … , w n w_1, w_2, …, w_n w1,w2,,wn,则哈夫曼树的构造规则为:

  1. w 1 , w 2 , … , w n w_1, w_2, …, w_n w1,w2,,wn看成是有 n n n棵树的森林(每棵树仅有一个结点);
  2. 在森林中选出两个根结点的权值最小的树合并,作为一棵新树的左、右子树,且新树的根结点权值为其左、右子树根结点权值之和;
  3. 从森林中删除选取的两棵树,并将新树加入森林;
  4. 重复(2)、(3)步,直到森林中只剩一棵树为止,该树即为所求得的哈夫曼树。
    在这里插入图片描述
    在这里插入图片描述

四、应用—— Huffman Coding

  1. 定义:Huffman Coding是一种用于无损数据压缩的熵编码(权编码)算法。由美国计算机科学家大卫·霍夫曼(David Albert Huffman)在1952年发明。
  2. 性质:
    • 变长码:频繁出现的字符分配更短的码;不频繁出现的字符分配更长的码
    • 前缀编码(立刻可解码性):任一字符的编码都不会是另一字符的(更长)编码的前缀
  3. 分类:
    • 静态编码:1)依据数据构建Huffman tree;2)依据Huffman tree为字符分配相应的码
      • 需要存储Huffman tree,方可解码
    • 动态编码 t + 1 t+1 t+1个字符的编码依据前 t t t个字符
      • 无需存储Huffman tree,即可解码
  4. 约定:
    • 将权值小的最为左节点,权值大的作为右节点
    • 左孩子编码为0,右孩子编码为1

五、实现

1. 基于python的实现

  1. 构建Huffman tree的节点对象(名称;权值;左子节点;右子节点)
  2. 根据构建的Huffman tree,并生成对应的码本
    • 初始化节点对象
    • 利用heapq构建最小堆
    • 每次取出堆中最小的两个值,构成新树,循环该过程,知道仅剩一个根节点
    • 迭代编码
      • 终止条件:到达叶子节点(判断Huffman tree是否只有一个节点的特殊情况)
      • 编码左节点(0)、右节点(1)
  3. 依据码本进行编码
  4. 依据码本进行解码
class HeapNode(object):left = Noneright = Noneitem = Noneweight = 0def __init__(self, i, w):self.item = iself.weight = wdef setChildren(self, ln, rn):self.left = lnself.right = rndef __repr__(self):return "%s - %s — %s _ %s" % (self.item, self.weight, self.left, self.right)def __lt__(self, other):return self.weight < other.weight
from itertools import groupby
from heapq import *class HuffmanTree():def __init__(self):self.codes = {}self.reverse_mapping = {}def build_huffman_tree(self, text):itemqueue =  [HeapNode(a,len(list(b))) for a,b in groupby(sorted(text))]heapify(itemqueue)while len(itemqueue) > 1:l = heappop(itemqueue)r = heappop(itemqueue)n = HeapNode(None, r.weight+l.weight)n.setChildren(l,r)heappush(itemqueue, n)return itemqueuedef make_codes(self, s, node):if node.item:if not s:self.codes[node.item] = "0"else:self.codes[node.item] = sself.reverse_mapping[s] = node.itemelse:self.make_codes(s+"0", node.left)self.make_codes(s+"1", node.right)def encoded_text(self, text):encoded_text = ""for character in text:encoded_text += self.codes[character]return encoded_textdef decode_text(self, encoded_text):current_code = ""decoded_text = ""for bit in encoded_text:current_code += bitif(current_code in self.reverse_mapping):character = self.reverse_mapping[current_code]decoded_text += charactercurrent_code = ""return decoded_text
if __name__ == '__main__':InputFile = "./sample.txt"with open(InputFile,'r') as f:text = f.read().rstrip()huff = HuffmanTree()huffTree = huff.build_huffman_tree(text)huff.make_codes('', huffTree[0])encode = huff.encoded_text("hello")text_ = huff.decode_text(encode)print (encode)print (text_)
1010000110110101101000
hello

http://chatgpt.dhexx.cn/article/hmJNx3Wo.shtml

相关文章

Huffman Codes

题目 In 1953, David A. Huffman published his paper “A Method for the Construction of Minimum-Redundancy Codes”,and hence printed his name in the history of computer science. As a professor who gives the final exam problem on Huffman codes, I am encounte…

HuffmanTree

#include "stdafx.h" #include "stdio.h" #include "stdlib.h" #include "string.h"typedef int ELEMTYPE;//哈弗曼树节点结构体 typedef struct HuffmanTree {ELEMTYPE weight;ELEMTYPE id;//区分权值相同的节点struct HuffmanTree* …

JPEG中Huffman解码实例讲解

DHT Huffuman表格式 -------------------------------------------------------------------------- 名称 字节数 值 说明 -------------------------------------------------------------------------- 段标识 1 FF 段类型 1 C4 段…

哈夫曼树(huffman)

学完了huffman树&#xff0c;讲一下自己对它的理解 huffman树遵循二叉树的原则&#xff0c;每个节点最多有两个子节点&#xff0c;但是每个节点都带有一个权重&#xff0c;如果我们要将一组字符串 “ B D C A F E ” 插入huffman树&#xff0c;每个字符都会带有一个权重&#…

Huffman树和Huffman编码

文章目录 Huffman树的定义带权路径长度WPL Huffman树的构造Huffman树的特点 Huffman编码构造Huffman编码 Huffman树的定义 哈夫曼&#xff08;Huffman&#xff09;树&#xff0c;又称最优二叉树&#xff0c;是一类带权路径长度WPL最短的树。 带权路径长度WPL 要理解带权路径…

Huffman树(哈夫曼树)

哈夫曼树又称最优二叉树&#xff0c;是一种带权路径长度最短的二叉树。所谓树的带权路径长度&#xff0c;就是树中所有的叶结点的权值乘上其到根结点的路径长度&#xff08;若根结点为0层&#xff0c;叶结点到根结点的路径长度为叶结点的层数&#xff09;。树的带权路径长度记为…

虚拟机下安装BackTrack5 (BT5)教程及BT5汉化

isare邀请您访问Backtrack中文网 http://www.backtrack.org.cn/?fromuid50397 isare邀请您访问Backtrack中文网 http://www.backtrack.org.cn/?fromuserisare PS&#xff1a;back track 安装过程中有2点要注意&#xff1a;第一&#xff1a;复制到99%的时候会等大约10来分钟&a…

bt 下载工具 deluge 配置 优化 使用

目录 Ubuntu 18 配置 deluge Deluge 安卓远程客户端 Deluge 性能调优 deluge是基于libtorrentpython的跨平台bt/pt客户端&#xff0c;适合在Linux环境下使用 deluge完全开源免费&#xff0c;对IPv6支持良好&#xff0c;性能优于transmission&#xff1b;在嵌入式设备上使用d…

BT5的U盘完整安装

BT5是什么就不用多说了&#xff0c;从网上看了许多教程&#xff0c;大多是利用unetbootin工具将ISO文件直接解压到U盘上&#xff0c;这样并不能完全使用BT&#xff0c;保存好的文件&#xff0c;重启机器后就没了&#xff0c;其实就是当做光盘使用了&#xff0c;另外还有一个方法…

有哪些好用的BT下载器?

​​​​​​2022年5个好用的 BT/ 磁力链接下载工具推荐 &#xff5c;Windows 、安卓系统 | 科技雷达 A full-featured download manager

BT是如何下载的

BT协议简介 一、BT下载是怎么来的&#xff1f; 在互联网上下载文件的方式大概有这么几种&#xff1a;FTP、HTTP、BT、eMule(电驴)等&#xff0c; 浏览器会直接支持FTP和HTTP下载&#xff0c;BT和eMule下载一般需要专用的下载软件的支持。 接下来分别简单介绍一下他们的区别&…

ed2k下载

ed2k下载 在下载ed2k资源的时候&#xff0c;浏览器一般不能直接下载&#xff0c;这个时候该怎么办呢&#xff1f; 方法一&#xff1a;下载迅雷&#xff0c;直接安装 方法二&#xff1a;使用在线工具&#xff0c;将链接转化为别的形式 https://tool.lu/urlconvert/ 方法三&am…

BT是怎么下载的

BT协议简介 一、BT下载是怎么来的? 在互联网上下载文件的方式大概有这么几种:FTP、HTTP、BT、eMule(电驴)等, 浏览器会直接支持FTP和HTTP下载,BT和eMule下载一般需要专用的下载软件的支持。 接下来分别简单介绍一下他们的区别: FTP 是 File Transfer Protocol(文件…

最好用的bt下载器qbittorrent下载安装使用教程

qBittorrent绝对是我心目中BT下载工具中的NO.1&#xff0c;虽说我平时也会用迅雷下载国内的某些资源&#xff0c;但是仍然不妨碍它是我心目中的主力下载神器&#xff01;它可以说是我最早接触的除迅雷之外的一款BT下载神器。它是完全免费的种子和磁力链接下载工具&#xff0c;最…

BT5 WIFI破解

实验环境 VMwareWorkstation 9.0 BackTrack5 R3-GNOME-32 工具说明 VMware&#xff1a;著名的虚拟机软件&#xff0c;本实验采用虚拟机环境下安装BackTrack。 BackTrack&#xff1a;是一个基于Ubuntu GNU/Linux的发行版本&#xff0c;主要用做数字取证和入侵测试。其无线安全审…

BT5下载地址

http://www.backtrack-linux.org/downloads/ 下载方法&#xff1a; 1,先填写好网页里的三个框,如: Your Name(你的名字): ABC Email Address(邮箱): ABC163.com Country(国家): china 2,然后点"download" 3,按照自己的…

最全BT介绍

BitTorrent 简介 riba2534 2021年04月11日 19:26 阅读 851 关注 BitTorrent 简介 从 P2P 说起 经常在网上飙车的老司机应该都知道 BT 下载&#xff0c;但是有时候拿到了种子却下载不动&#xff0c;会不会很抓狂&#xff0c;是不是还觉得是自己网不行&#xff0c;那作为一…

034_Unicode标准

1. Unicode标准 1.1. 由于ASCII字符集、ISO字符集、GBK字符集列出的字符集都有容量限制, 而且不兼容多语言环境, Unicode联盟开发了Unicode标准。 1.2. Unicode标准涵盖了世界上的所有字符、标点和符号。 1.3. 不论是何种平台、程序或语言, Unicode都能够进行文本数据的处理…

24.字符编码

1.字符编码 1.1简介 字符编码只与文本文件和字符串有关。 字符编码&#xff1a;记录人类字符与二进制数的对应关系。计算机只能识别二进制&#xff0c;但是通过字符编码可以展示出各式各样的语言字符。1.2发展过程 1.计算机是美国人发明的&#xff0c;为了能够让加计算机能够…

汉字编码

http://blog.csdn.net/zzidea/article/details/8497532 C语言编程&#xff0c;基本的类型有字符型&#xff0c;整数型&#xff0c;浮点型。这些类型是我们对事物进行描述所必不可少的东西。即基础&#xff0c;又非常核心。所以必须掌握。 一、 字符集 ASCII GB2…