huffman python,哈夫曼(Huffman)编码python代码实现

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

首先看定义

哈夫曼编码(Huffman Coding),又称霍夫曼编码,是一种编码方式,哈夫曼编码是可变字长编码(VLC)的一种。Huffman于1952年提出一种编码方法,该方法完全依据字符出现概率来构造异字头的平均长度最短的码字,有时称之为最佳编码,一般就叫做Huffman编码(有时也称为霍夫曼编码)。

我们来看具体步骤

1. 制备每个字符的概率表

输入是存放字符的txt文本

43928fd58afb

输出以python字典的形式给出每个字符的概率,就是出现的次数:

43928fd58afb

代码如下

def findTheFrequency(text):

result=dict()

with open(text,'r') as f:

for line in f.readlines():

line = line.lower()

for i in line:

if i.isalpha():

if i in result:

result[i]+=1

else:

result.update({i:1})

return result

text="GreA3_Huffman_origin.txt"

result=findTheFrequency(text)

2. 创建Huffman数

首先定义一个节点的类,包含名称,概率,左孩子和右孩子

输入的是上一步输出的概率表

输出的是Huffman树的根节点,因为只要知道根节点,其实整棵树的信息就都知道了

代码如下:

class Node:

def __init__(self):

self.frequency=0

self.name=None

self.lchild=None

self.rchild=None

self.code=None

def __lt__(self,other):

return self.frequency

# establish the Huffman Tree

def estblishHuffmanTree(info_dict):

#output: the base node

node_list=[]

for i in info_dict:

a = Node()

a.frequency=info_dict[I]

a.name=I

node_list.append(a)

while len(node_list)>1:

node_list.sort(reverse=True)

node_1 = node_list.pop()

node_2 = node_list.pop()

new_node = Node()

new_node.frequency=node_1.frequency+node_2.frequency

new_node.lchild=node_1

new_node.rchild=node_2

node_list.append(new_node)

return new_node

base_node = estblishHuffmanTree(result)

3. 根据Huffman树进行编码

输入的是上一步输出的根节点以及原始文档

输出的是编码后的字典和结束后的文档

43928fd58afb

43928fd58afb

注意编码的过程中采用了回溯法的思想

代码如下:

def encode(node,rst_dict,code):

if node.name:

rst_dict.update({node.name:code})

return

code+='0'

encode(node.lchild,rst_dict,code)

code = code[:-1]

code+='1'

encode(node.rchild,rst_dict,code)

return rst_dict

code_dict=encode(base_node,{},'')

code_text="GreA3_Huffman_code.txt"

def encode_text(code_dict,text,code_text):

string=''

with open(text,'r') as f:

for line in f.readlines():

line=line.lower()

for i in line:

if i.isalpha():

string+=code_dict[I]

else:

string+='\n'

with open(code_text,'w') as f:

f.write(string)

encode_text(code_dict,text,code_text)

4. 解码

就是根据编号的码返回文本

代码如下:

def decode(text_addtedd,result_address,base_node):

text_string=''

a=base_node

with open(text_addtedd,'r') as f:

for line in f.readlines():

for i in line:

if i=='0':

b=a.lchild

if b.name:

text_string+=b.name

a=base_node

else:

a = b

elif i=='1':

b=a.rchild

if b.name:

text_string+=b.name

a=base_node

else:

a = b

else:

text_string+='\n'

with open(result_address,'w') as f:

f.write(text_string)

result_address="GreA3_Huffman_result.txt"

decode(code_text,result_address,base_node)


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

相关文章

Huffman Tree

Huffman Tree 哈夫曼树;哈夫曼编码;最优二叉树 自底向上 变长编码;前缀编码;熵编码 数据无损压缩;最短编码;最佳判定树 一、基本概念 Huffman Tree,又称最优二叉树,是带权路径长度最…

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

Huffman树和Huffman编码

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

Huffman树(哈夫曼树)

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

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

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

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

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

BT5的U盘完整安装

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

有哪些好用的BT下载器?

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

BT是如何下载的

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

ed2k下载

ed2k下载 在下载ed2k资源的时候,浏览器一般不能直接下载,这个时候该怎么办呢? 方法一:下载迅雷,直接安装 方法二:使用在线工具,将链接转化为别的形式 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,虽说我平时也会用迅雷下载国内的某些资源,但是仍然不妨碍它是我心目中的主力下载神器!它可以说是我最早接触的除迅雷之外的一款BT下载神器。它是完全免费的种子和磁力链接下载工具,最…

BT5 WIFI破解

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

BT5下载地址

http://www.backtrack-linux.org/downloads/ 下载方法: 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 下载,但是有时候拿到了种子却下载不动,会不会很抓狂,是不是还觉得是自己网不行,那作为一…

034_Unicode标准

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

24.字符编码

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