数据结构笔记_31 哈夫曼编码(含创建哈夫曼树)

本文介绍了哈夫曼编码的基本概念,比较了定长编码和变长编码的优缺点。详细阐述了哈夫曼编码的特性,并指出构建哈夫曼树的不同方法可能影响编码,但最小带权路径长度(WPL)保持不变。同时,提供了创建哈夫曼树的思路和步骤,包括创建Node节点、获取字符频率、构建赫夫曼树的List以及完整代码示例和测试过程。
摘要由CSDN通过智能技术生成

一、霍夫曼编码基本介绍:

在这里插入图片描述

二、通信领域中几种信息的处理方式:

1.定长编码:

原理是将字符对应的ASCLL码转换成二进制后传输信息。

缺点:需要存储大量的二进制数据太浪费时间,空间了。
在这里插入图片描述
比如,

空格的ASCLL码值为32,转换成二进制,如图:

在这里插入图片描述

2.变长编码:

在这里插入图片描述
缺点:匹配的时候,存在多义性。

例如,10110。既可以分解成1,0,110也可以分解成10,110亦可以是101,10.

3.哈夫曼编码:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
注意,这个赫夫曼树根据排序方法不同,也可能不太一样,

排序方法的不同是啥意思?比如说有可能会出现权值最小的两个二叉树的权值相加,例如:1+5等于6,而待排数列中还有好几个6,那这个1+5生成的子树该插入到这么多6的什么位置呢?

这样对应的赫夫曼编码也不完全一样,但是WPL是一样的,都是最小的,比如:如果我们让每次生成的新的二又树总是排在权值相同的二叉树的最后一个,则生成的二叉树为:
在这里插入图片描述

三、代码

1、思路:

在这里插入图片描述

2、分步代码

1)创建Node ,带数据(字符),权值,left 和 right.


class Node implements Comparable<Node> {
   
	Byte data;// 存放数据(字符)本身,比如'a' => 97 ' ' => 32
	int weight;// 权值,表示字符出现的次数
	Node left;
	Node right;

	public Node(Byte data, int weight) {
   
		this.data = data;
		this.weight = weight;
	}

	@Override
	public int compareTo(Node o) {
   
		// TODO Auto-generated method stub
		// 从小到大排序
		return this.weight - o.weight;
	}

	@Override
	public String toString() {
   
		return "Node [data=" + data + ", weight=" + weight + "]";
	}

	// 前序遍历
	public void preOrder() {
   
		System.out.println(this);
		if (this.left != null) {
   
			this.left.preOrder();
		}
		if (this.right != null) {
   
			this.right.preOrder();
		}
	}

}

2)得到"i like like like java do you like a java",对应的 byte[] 数组。

		String content = "i like like like java do you like a java";
		byte[] contentBytes = content.getBytes();

3)编写一个方法

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值