霍夫曼编码算法2025年3月17日 | 阅读13分钟 可以使用霍夫曼编码技术来压缩数据,使其变小而不丢失任何信息。它是大卫·霍夫曼在最初创造它之后。包含频繁重复字符的数据通常使用霍夫曼编码进行压缩。 霍夫曼编码是一种著名的贪心算法。分配给字符的代码大小取决于字符的频率,这就是它被称为贪心算法的原因。为频率最高的字符分配短长度的变长代码,反之亦然。它使用变长编码,这意味着它为提供的比特流中的每个字符分配不同的变长代码。 前缀规则本质上,这条规则规定,分配给字符的代码不能是另一个代码的前缀。如果违反了这条规则,在解码创建的霍夫曼树时可能会出现各种歧义。 让我们通过一个例子来更好地理解这条规则:为每个字符分配一个代码,例如 假设生成的比特流是001,代码可以如下解码 什么是霍夫曼编码过程? 霍夫曼码是在主要两个步骤中为数据流中的每个不同字符获得的
霍夫曼编码的步骤 用于使用提供的字符构建霍夫曼树的步骤 如果在此情况下使用霍夫曼编码进行数据压缩,则必须确定以下信息才能进行解码
如何从输入字符构建霍夫曼树?首先必须确定数据流中每个字符的频率。
霍夫曼编码示例让我们用一个例子来解释算法 ![]() ![]() 霍夫曼编码算法步骤 1:构建一个最小堆,其中每个节点代表一个具有单个节点的树的根,并保存 5(来自给定数据流的不同字符数)。 ![]() 步骤 2:在步骤二中,从最小堆中获取两个最小频率的节点。添加一个第三个内部节点,频率为 2 + 3 = 5,该节点是通过连接两个提取的节点创建的。 ![]()
步骤 3:在步骤三中,以类似的方式从堆中获取两个最小频率的节点。此外,添加一个由连接这两个提取节点形成的新内部节点;其在树中的频率应为 4 + 4 = 8。 ![]()
步骤 4:在步骤四中,获取两个最小频率的节点。此外,添加一个由连接这两个提取节点形成的新内部节点;其在树中的频率应为 5 + 7 = 12。
![]() 步骤 5:在步骤 5 中,获取接下来的两个最小频率的节点。此外,添加一个由连接这两个提取节点形成的新内部节点;其在树中的频率应为 12 + 8 = 20。 继续,直到所有不同字符都已添加到树中。上图显示了为指定角色创建的霍夫曼树。 现在,对于每个非叶节点,为左边缘分配 0,为右边缘分配 1,以创建每个字母的代码。 确定边权重的规则
遵循权重分配后,修改后的树显示如下 ![]() 理解代码
下面是 C 语言的实现 输出 f: 0 c: 100 d: 101 a: 1100 b: 1101 e: 111 …………… Process executed in 1.11 seconds Press any key to continue. 以上代码的 Java 实现输出 f: 0 c: 100 d: 101 a: 1100 b: 1101 e: 111 ………………. Process executed in 1.11 seconds Press any key to continue. 说明 通过遍历,霍夫曼树被创建和解码。然后在位于叶节点中的字符上应用遍历期间收集的值。使用霍夫曼码可以这样识别给定数据流中的每个唯一字符。O (nlogn),其中 n 是字符总数,是时间复杂度。如果 n 个节点,则调用 ExtractMin() 2*(n - 1) 次。由于 extractMin() 调用 minHeapify(),其执行时间为 O (logn)。因此,总复杂度为 O (nlogn)。如果输入数组已排序,则存在线性时间算法。我们将在下一篇文章中更详细地介绍这一点。 霍夫曼编码的缺点在本节中,我们将讨论霍夫曼编码的缺点以及为什么它并不总是最佳选择
贪心霍夫曼码构造算法
霍夫曼编码的用途
结论
|
我们请求您订阅我们的新闻通讯以获取最新更新。