Python算法之哈夫曼编码

Python算法之哈夫曼编码

问题:哈夫曼编码,英文名称Huffman Coding,有时也翻译为霍夫曼编码,在1952年提出的,是最好的编码方式。哈夫曼编码在电子通讯方面有着重要的应用,同时也广泛应用于数据压缩,其压缩率通常在20% 90%之间 赫夫曼码是可变字长编码(VLC)的一种。哈夫曼树是最优二叉树,带权路径长度最小的二叉树。

原理:

假设有几个数字40,10,20,16,14。

首先将这五个数字按照从小到大的顺序排列:10, 14,16,20, 40。

构建哈夫曼树:

1.首先选取10,14

2.重新排序:16,20,24,40

3.重新排序24,36,40,60

4.按照二叉树左0右1,构建哈夫曼树

所以最终得到数字10的编码为100,数字14的编码为101,数字16的编码为110,数字20的编码为111,数字40的编码为0。

代码:

from heapq import *inp = input(‘请输入要构建哈夫曼树的字符串:’)# 统计每个字符出现的频率并生成字典def generate_dict(s): dic = {} for i in s: if i not in dic: dic[i] = 1 else: dic[i] += 1 return dicdic = generate_dict(inp)# 节点类class Node: def __init__(self, name=None, weight=None): self.name = name self.weight = weight self.parent = None self.left = None self.right = None self.id = None # 自定义类的比较 def __lt__(self, other): return int(self.weight) < int(other.weight)# 按权值排序def sort(list): return sorted(list, key=lambda Node: Node.weight)def generate_node2(dic): lis = [] for i in dic: newNode = Node(i, dic[i]) heappush(lis, newNode) return lislis = generate_node2(dic)# Huffman编码2使用堆的方式def HuffmanTree2(lis): global id while len(lis) != 1: a = heappop(lis) b = heappop(lis) new = Node() new.weight = a.weight + b.weight new.left, new.right = a, b a.parent = new b.parent = new heappush(lis, new) return lislis = HuffmanTree2(lis)node = lis[0]# 定义前序遍历方法并执行一定的操作def pre_order(root, code): if root is None: code = code[:-1] return pre_order(root.left, code + '0') if root.name is not None: print(root.name, '的权重为', root.weight, '编码为', code) pre_order(root.right, code + '1')code = ''print('构造的哈夫曼树为:')pre_order(node, code)

运行结果:

请输入要构建哈夫曼树的字符串:12908755343298构造的哈夫曼树为:1 的权重为 1 编码为 0007 的权重为 1 编码为 0015 的权重为 2 编码为 0109 的权重为 2 编码为 0112 的权重为 2 编码为 1000 的权重为 1 编码为 10104 的权重为 1 编码为 10118 的权重为 2 编码为 1103 的权重为 2 编码为 111

郑重声明:本文内容及图片均整理自互联网,不代表本站立场,版权归原作者所有,如有侵权请联系管理员(admin#wlmqw.com)删除。
(0)
用户投稿
上一篇 2022年6月12日
下一篇 2022年6月12日

相关推荐

  • 网站提交入口百度(搜索引擎网站收录提交入口链接)

    在网站的SEO优化过程中,发布高质量的外链对于提升网站权重极为重要,其中分类目录网站是优质外链之一。如果能被高质量分类目录网站收录,对于网站来说就相当于增加了一条永久性的优质外部链…

    2022年4月18日
  • 北京发布首个数字人产业政策

    经济日报北京8月13日讯(记者韩秉志)北京市经济和信息化局近日正式对外发布《北京市促进数字人产业创新发展行动计划(2022—2025年)》,这是国内首个数字人产业专项支持政策。根据…

    2022年8月15日
  • BEB波浪尺的算法分享

    惊艳新代码—来啦!波浪尺的第二部分代码为你奉上! 一大早发布的波浪尺算法代码,评论区讨论热烈,这也从侧面反映出该思路的价值和建立通用性算法的极大意义,不再耽搁,继续分享…

    2022年6月21日
  • 荣耀之战参与方式详解,10款皮肤必得其一,新专精装英雄4选2

    王者荣耀官方在10号正式开启夏日之旅最后一波福利——荣耀之战,目前该活动采用逐区开放的形式上线,包含助力阶段、对决阶段和领奖阶段三个环节,那么具体如何参与,以及奖励如何? 率先开启…

    2022年8月12日
  • 游戏本身有错吗

    在《摆脱童稚状态》这一篇文章中描述了丹麦对“性”进行科学管理,开放色情照片,规定色情作品可以生产。除了开始人们买得多到最后哥本哈根的色情商店绝迹。最后王小波得出了一个结论:“人有多…

    2022年6月30日
  • 玩转Fiddler抓包教程(6)-Fiddler状态面板详解

    1.简介 按照从上往下,从左往右的计划,今天就轮到介绍和分享Fiddler的状态面板了。 2.状态面板概览 Fiddler的状态面板概览,如下图所示: 3.状态面板详解 Fiddl…

    2022年7月26日
  • MySQL 性能优化思路和工具

    一、优化思路 作为架构师或者开发人员,说到数据库性能优化,你的思路是什么样的? 或者具体一点,如果在面试的时候遇到这个问题:你会从哪些维度来优化数据库,你会怎么回答? 我们在第一节…

    2022年6月22日
  • 每种解锁方式仅 118 元:小米智能门锁 E 大促 708 元起

    小米智能门锁 E 发售于 2020 年 5 月 25 日,支持 6 种解锁方式,自带电子门铃,C 级锁芯,日常售价 999 元。 京东 618 大促期间,17 日晚 20 点,到手…

    2022年6月18日
  • 《Go题库·8》channel实现方式/原理/概念/底层实现

    面试企业 好未来、米哈游、跟谁学,字节跳动、美团、网易、新浪、滴滴、小米 题目解析 GOLANG ROADMA社区 答案(知北游)+ 背景: Go语言提供了一种不同的并发模型&#8…

    2022年6月23日
  • #汇编语言#课程设计1#王爽著

    assume cs:code data segment db ‘1975’,’1976′,’1977′,&#…

    2022年7月1日

联系我们

联系邮箱:admin#wlmqw.com
工作时间:周一至周五,10:30-18:30,节假日休息