Python实现Huffman编码

简介: Python实现Huffman编码

1.Huffman编码简介

Huffman编码是依靠Huffman树来实现的,Huffman树是带全路径长度最小的二叉树。

树的带权路径长度为所有叶子节点的权值与到根节点路径长度的乘积之和,公式为:

Huffman编码以根节点到叶子节点的路径来编码的,左为0,右为1

1.1Huffman编码示意图

由这个huffman树得出得huffman编码为:a011b100,c0001,d00001,e11,f101,g000000,h0010,i010,j0011,k000001


2.代码思路

python实现这个需要注意两点,一是根据叶子节点的权值也就是编码字母的值来反向建立huffman树。二是通过建立好的huffman树生成huffman编码。

建立huffman树的主要思路是在给的权值中选最小的和第二小建立节点。将它俩的和放入之前的权值列表再选择其中最小和第二小的,以此循环。

生成huffman编码的思路是用一个列表记录其路径,左为0右为1。当然,为了Huffman树唯一,规定左孩子的值必须小于等于右孩子的值。


3.python代码

#节点类
class Node(object):
    def  __init__(self,name=None,value=None):
        self._name=name
        self._value=value
        self._left=None
        self._right=None
#哈夫曼树类
class HuffmanTree(object):
    #根据Huffman树的思想:以叶子节点为基础,反向建立Huffman
    def __init__(self,char_weights):
        self.a=[Node(part[0],part[1])  for part in char_weights]  #根据输入的字符及其频数生成叶子节点
        while len(self.a)!=1:
            self.a.sort(key=lambda  node:node._value,reverse=True)
             c=Node(value=(self.a[-1]._value+self.a[-2]._value))
            c._left=self.a.pop(-1)
            c._right=self.a.pop(-1)
            self.a.append(c)
        self.root=self.a[0]
        self.b=list(range(10))       #self.b用于保存每个叶子节点的Haffuman编码,range的值只需要不小于树的深度就行
    #用递归的思想生成编码
    def pre(self,tree,length):
        node=tree
        if (not node):
            return
        elif node._name:
            x=str(node._name) + '的编码为:'
            for i in range(length):
                x+=str(self.b[i])
            print(x)
            return
        self.b[length]=0
        self.pre(node._left,length+1)
        self.b[length]=1
        self.pre(node._right,length+1)
     #生成哈夫曼编码
    def get_code(self):
        self.pre(self.root,0)
if __name__=='__main__':
    #输入的是字符及其频数
     char_weights=[('a',7),('b',19),('c',2),('d',6),('e',32),('f',3),('g',21),('h',10)]
    tree=HuffmanTree(char_weights)
    tree.get_code()

 


4.总结

Huffman树与Huffman编码都是以二叉树为依托的,二叉树是数据结构中非常重要的一环,用python来实现它不仅能将这个知识吃透彻,还能锻炼自己的编程能力。还能偷点小懒,可以不用笔算了输入字母的权值,一秒出答案。

目录
相关文章
|
5月前
|
存储 Python
Python文件编码概念详解
Python文件编码概念详解
47 1
|
10天前
|
Python
python第三方库-字符串编码工具 chardet 的使用(python3经典编程案例)
这篇文章介绍了如何使用Python的第三方库chardet来检测字符串的编码类型,包括ASCII、GBK、UTF-8和日文编码的检测示例。
41 6
|
8天前
|
Python
Python 中如何指定 open 编码为ANSI
Python 中如何指定 open 编码为ANSI
19 1
|
2月前
|
数据采集 开发工具 Python
海康威视工业相机SDK+Python+PyQt开发数据采集系统(支持软件触发、编码器触发)
该系统基于海康威视工业相机SDK,使用Python与PyQt开发,支持Gige与USB相机设备的搜索及双相机同时显示。系统提供软件触发与编码器触发模式,并可在数据采集过程中实时保存图像。此外,用户可以调节曝光时间和增益,并进行信息输入,这些信息将被保存至配置文件以便下次自动加载。参数调节与实时预览等功能进一步增强了系统的实用性。
59 1
|
2月前
|
开发者 Python
Python编码风格
Python编码风格
13 1
|
2月前
|
JSON 数据库 开发者
FastAPI入门指南:Python开发者必看——从零基础到精通,掌握FastAPI的全栈式Web开发流程,解锁高效编码的秘密!
【8月更文挑战第31天】在当今的Web开发领域,FastAPI迅速成为开发者的热门选择。本指南带领Python开发者快速入门FastAPI,涵盖环境搭建、基础代码、路径参数、请求体处理、数据库操作及异常处理等内容,帮助你轻松掌握这一高效Web框架。通过实践操作,你将学会构建高性能的Web应用,并为后续复杂项目打下坚实基础。
65 0
|
3月前
|
Python
11个提升Python列表编码效率的高级技巧
Python中关于列表的一些很酷的技巧
40 1
|
3月前
|
存储 缓存 Python
python中小数据池和编码
python中小数据池和编码
48 3
|
3月前
|
缓存 Java Unix
python中内存管理等10个编码习惯
【7月更文挑战第3天】本文涵盖了Python编程中的变量管理、模块导入、命令行参数、内存管理和面向对象设计的10个关键概念。
39 0
python中内存管理等10个编码习惯
|
4月前
|
自然语言处理 Python
Python编码问题
Python编码问题是指在处理文本时,由于编码不一致导致程序不能正确处理文本的问题。在Python中,编码问题主要有两种情况:文件编码问题和字符串编码问题。
48 7
下一篇
无影云桌面