关于哈夫曼树怎么构建的、哈夫曼编码怎么求,请参考

哈夫曼树及python实现

这些基础的东西就不在这里阐述了,本文直接上代码。

参考链接哈夫曼树的 Python 实现

哈夫曼树的构建和编码

  1. '''
  2. huffman编码
  3. '''
  4. import copy
  5. class Node:
  6. def __init__(self, name, weight):
  7. self.name = name #节点名
  8. self.weight = weight #节点权重
  9. self.left = None #节点左孩子
  10. self.right = None #节点右孩子
  11. self.father = None # 节点父节点
  12. #判断是否是左孩子
  13. def is_left_child(self):
  14. return self.father.left == self
  15. #创建最初的叶子节点
  16. def create_prim_nodes(data_set, labels):
  17. if(len(data_set) != len(labels)):
  18. raise Exception('数据和标签不匹配!')
  19. nodes = []
  20. for i in range(len(labels)):
  21. nodes.append( Node(labels[i],data_set[i]) )
  22. return nodes
  23. # 创建huffman树
  24. def create_HF_tree(nodes):
  25. #此处注意,copy()属于浅拷贝,只拷贝最外层元素,内层嵌套元素则通过引用,而不是独立分配内存
  26. tree_nodes = nodes.copy()
  27. while len(tree_nodes) > 1: #只剩根节点时,退出循环
  28. tree_nodes.sort(key=lambda node: node.weight)#升序排列
  29. new_left = tree_nodes.pop(0)
  30. new_right = tree_nodes.pop(0)
  31. new_node = Node(None, (new_left.weight + new_right.weight))
  32. new_node.left = new_left
  33. new_node.right = new_right
  34. new_left.father = new_right.father = new_node
  35. tree_nodes.append(new_node)
  36. tree_nodes[0].father = None #根节点父亲为None
  37. return tree_nodes[0] #返回根节点
  38. #获取huffman编码
  39. def get_huffman_code(root, nodes):
  40. codes = {}
  41. for node in nodes:
  42. code=''
  43. name = node.name
  44. while node.father != None:
  45. if node.is_left_child():
  46. code = '0' + code
  47. else:
  48. code = '1' + code
  49. node = node.father
  50. codes[name] = code
  51. return codes
  52. if __name__ == '__main__':
  53. labels = ['a','b','c','d','e','f']
  54. data_set = [9,12,6,3,5,15]
  55. nodes = create_prim_nodes(data_set,labels)#创建初始叶子节点
  56. root = create_HF_tree(nodes)#创建huffman
  57. codes = get_huffman_code(root, nodes)#获取huffman编码
  58. #打印huffman码
  59. for key in codes.keys():
  60. print(key,': ',codes[key])

运行结果如下:

  1. a : 00
  2. b : 01
  3. c : 100
  4. d : 1010
  5. e : 1011
  6. f : 11

哈夫曼编码+python实现的更多相关文章

  1. 基于python的二元霍夫曼编码译码详细设计

    一.设计题目 对一幅BMP格式的灰度图像(个人证件照片)进行二元霍夫曼编码和译码 二.算法设计 (1)二元霍夫曼编码: ①:图像灰度处理: 利用python的PIL自带的灰度图像转换函数,首先将彩色图 ...

  2. 哈夫曼编码(Huffman coding)的那些事,(编码技术介绍和程序实现)

    前言 哈夫曼编码(Huffman coding)是一种可变长的前缀码.哈夫曼编码使用的算法是David A. Huffman还是在MIT的学生时提出的,并且在1952年发表了名为<A Metho ...

  3. 哈夫曼(huffman)树和哈夫曼编码

    哈夫曼树 哈夫曼树也叫最优二叉树(哈夫曼树) 问题:什么是哈夫曼树? 例:将学生的百分制成绩转换为五分制成绩:≥90 分: A,80-89分: B,70-79分: C,60-69分: D,<60 ...

  4. (转载)哈夫曼编码(Huffman)

    转载自:click here 1.哈夫曼编码的起源: 哈夫曼编码是 1952 年由 David A. Huffman 提出的一种无损数据压缩的编码算法.哈夫曼编码先统计出每种字母在字符串里出现的频率, ...

  5. 数据结构图文解析之:哈夫曼树与哈夫曼编码详解及C++模板实现

    0. 数据结构图文解析系列 数据结构系列文章 数据结构图文解析之:数组.单链表.双链表介绍及C++模板实现 数据结构图文解析之:栈的简介及C++模板实现 数据结构图文解析之:队列详解与C++模板实现 ...

  6. HDU2527 哈夫曼编码

    Safe Or Unsafe Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...

  7. *HDU1053 哈夫曼编码

    Entropy Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Sub ...

  8. YTU 3027: 哈夫曼编码

    原文链接:https://www.dreamwings.cn/ytu3027/2899.html 3027: 哈夫曼编码 时间限制: 1 Sec  内存限制: 128 MB 提交: 2  解决: 2 ...

  9. 使用F#来实现哈夫曼编码吧

    最近算法课要求实现哈夫曼编码,由于前面的问题都是使用了F#来解决,偶然换成C#也十分古怪,报告也不好看,风格差太多.一开始是打算把C#版本的哈夫曼编码换用F#来写,结果写到一半就觉得日了狗了...毕竟 ...

随机推荐

  1. 深入理解跨域SSO单点登录原理与技术

    [本文版权归微信公众号"代码艺术"(ID:onblog)所有,若是转载请务必保留本段原创声明,违者必究.若是文章有不足之处,欢迎关注微信公众号私信与我进行交流!] 一:SSO体系结 ...

  2. Linux远程连接mongodb

    当没有客户端工具,eg:robo3T时,如何修改mongodb里的数据呢? 1.连接mongodb服务器mongo 1.1.1.1:1688 2.查看数据库列表show dbs 3.选择使用log库u ...

  3. 入门大数据---Hive的搭建

    本博客主要介绍Hive和MySql的搭建:  学习视频一天就讲完了,我看完了自己搭建MySql遇到了一堆坑,然后花了快两天才解决完,终于把MySql搭建好了.然后又去搭建Hive,又遇到了很多坑,就这 ...

  4. cv2.VideoCapture 图像旋转问题

    使用cv2.VideoCapture()时发现,分解后的图片均顺时针旋转90度, 为了重新转回来使用np.rot90(mat, 1)即逆时针将矩阵旋转90度. 大功告成!!!

  5. 新手安装配置git简洁教程

    第一步,下载安装git 打开 [git官网] https://git-scm.com/,下载git对应操作系统的版本. 所有东西下载慢的话就可以去找镜像!官网下载太慢,我们可以使用淘宝镜像下载:htt ...

  6. valueOf()、toString()

    基本上,所有JS数据类型都拥有valueOf和toString这两个方法,null除外.它们俩解决javascript值运算与显示的问题. JavaScript 的 valueOf() 方法 valu ...

  7. 【MyBtis】获取数据插入postgresql后返回的自增id

    问题描述 数据库采用的是postgresql,以下面的rule表为例,该表的id设置为自增,那么经常有这样的需求,在执行insert操作后,紧接着需要获取该记录的自增id往中间表中插入数据,或者是再根 ...

  8. Html中a标签用法总结:创建email,电话,描点链接等。以及防止链接被搜索引擎收录

    <a>标签可以用来创建一个到其他网页.文件.同一页面内的位置.电子邮件地址或任何其他URL的超链接.  是我们常用的一个标签之一,今天就讲讲如何使用a来创建email,电话,描点链接等.以 ...

  9. Ocelot网关+IdentityServer4实现API权限认证

    Ocelot是一个用.NET Core实现并且开源的API网关,它功能强大,包括了:路由.请求聚合.服务发现.认证.鉴权.限流熔断.并内置了负载均衡器与Service Fabric.Butterfly ...

  10. SQL注入笔记-updatexml与extractvalue

    0x1介绍 MySQL 5.1.5版本中添加了对XML文档进行查询和修改的函数 EXTRACTVALUE(XML_document, XPath_string); UPDATEXML(XML_docu ...