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)删除。
用户投稿
上一篇 2022年6月12日 14:44
下一篇 2022年6月12日 14:44

相关推荐

  • 闲鱼无货源怎么赚钱(闲鱼无货源卖什么好)

    如今电商平台开店,无货源模式已经成为大家最普遍的开店方式了,而其中闲鱼无货源就是不少人的首选。闲鱼无货源是一个很适合普通人操作的暴利项目,如果你没有知识,技能,经验,资源,就先从闲…

    2022年11月25日
  • 百度关键词快速排名的4大原理解析(百度怎么刷关键词)

    近期百度公告惊雷算法2.0,升级之快还是第一次吧,看来百度对于刷点击行为是零容忍了。之前尹华峰SEO技术博客介绍过一篇如何使用刷点击工具,其实市面上有很多这类SEO快速排名的软件,…

    2022年11月25日
  • 淘宝直播平台抽成多少(淘宝直播平台抽成比例)

    随着时代的发展,现在直播带货已经成为主要带货方式,其中淘宝是主流带货平台,不少人在上面直播带货赚钱,一些小伙伴也想加入,那么淘宝直播平台抽成多少?下面小编为大家带来淘宝直播平台抽成…

    2022年11月24日
  • 白衬衫搭配什么裤子好看,女生衬衫穿法图片

    说起白衬衫和长裤的搭配组合,不知道大家有没有发现,虽然是很常见的造型,可不同年龄段惯用的穿搭方式却不相同,从而也穿出了不同的味道。简直是现在这个季节,时髦精们的必备造型之一~ 70…

    2022年11月24日
  • 剧情找找茬第九关怎么过 剧情找找茬第九关攻略技巧

    剧情找找茬第九关的剧情是锁山传人,许多小伙伴都还不太清楚要怎么通关,下面小编就给大家带来了剧情找找茬第九关通关攻略,感兴趣的小伙伴快来看看吧。 剧情找找茬第九关怎么过 第一步:点击…

    2022年11月23日
  • seo宣传推广(SEO推广)

    今天小编给各位分享seo宣传推广的知识,其中也会对SEO推广进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧! 如何做seo网络推广? 做网络推广的方法: 1、…

    2022年11月20日
  • 绘制高质量的业务流程图的5个步骤详解(业务逻辑流程图解析)

    在日常工作中,产品经理需要经常和业务流程图打交道。对于新手产品经理来说,业务流程图也是必须掌握的基本功之一。但是绘制流程图并不是一件简单的事情,本文作者从自身工作实践出发,结合相关…

    2022年11月20日
  • 产品推广渠道有哪些方式(推广自己的产品)

    首先,需要做好产品定位和市场定位,这是最基础的,然后是市场宣传,可以考虑以下方式: 1,淘宝天猫京东等电商推广 开通电商销售渠道,做好运营。 2,社区论坛推广 论坛和社区的发帖和回…

    2022年11月19日
  • 亚马逊一般发什么物流(亚马逊物流的特点有哪些)

    fba物流运输方式有哪些?都有哪些特点?我们熟知的fba物流运输方式有海运、空运、还有国际快递,那么你知道它们都有哪些特点吗? 一、空运的方式 亚马逊fba物流方式有很多,空运只是…

    2022年11月18日
  • 3阶魔方教程 1~7步骤(魔方教程一步一步图解)

    基础层先魔方复原法 by信手拈花 0. 魔方转动的公式表示和复原步骤 0. 1魔方转动的公式表示 魔方转动的公式表示 0. 2层先法魔方复原步骤 层先法魔方复原步骤 让我开始魔方复…

    2022年11月18日

联系我们

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