当前位置: 首页 > 网络应用技术

数据结构 - 哈夫曼和哈夫曼代码简介以及Java实施案例

时间:2023-03-08 12:11:06 网络应用技术

  《收割树》最初是收割机代码的数据结构,也称为最佳二进制树。Harvan的编码经常用于数据的压缩和减压技术。本文详细介绍了Harvan Tree的概念,并提供了Java实施,并最终引入了Harvan Code。

  哈夫曼树:给定n个正确的值,当n留节点以构造二进制树时。哈夫曼树)。哈夫曼树是最短的动力路径的树,而具有很大值的节点更接近根。

  下图是一个示例,首先解释一些概念:

  正确的:

  给出某个实体的数量是对实体的一个或某些属性的数值描述。在数据结构中,实体有两个类别:节点(元素)和边框(关系),因此有节点和边框力量。

  小路:

  在一棵树中,一个对另一个节点的节点称为path.above,从根节点到节点h的路径是路径。

  节点路径长度:

  在一棵树中,一个节点传递给另一个节点的“边缘”数称为两个节点之间的路径的长度。或路径上的分支数称为路径长度。从根节点到节点h的路径长度为3。

  树路径长度:

  树路径的长度是从树的根到每个节点的路径长度的总和。+2+2+3 = 22

  节点权利的长度:

  树的每个节点都可以具有自己的“重量”,重量可以在不同算法中起不同的作用。节点的正确路径的长度是指树的根节点的路径长度到节点,和节点的重量的产物。在上图中,节点的长度为3 * 3 = 9

  树的长度:

  树上的叶节点的长度。它也称为WPL。上图上图中的树长度为3 2+3 3+3 4+2 1+3 * 5 = 44

  收割机树的施工方法称为《收割机算法》。它的施工步骤是:

  注意:

  有五个权利节点{a5,b15,c40,d30,e10}。

  首先将右值从小到大的顺序排列到有序的序列,即:A5,E10,B15,D30,C40。

  两个最小功率作为新节点N1的两个节点是两个子节点。相对较小的是左儿童(实际上,您无法跟随,因为Harvan Tree具有多种形状,ButWPL是最小的)。这是一个AS N1的左孩子。E是N1的合适孩子。如下图所示,新节点的功率值为5+10 = 15。

  替换N1 A和E,将其插入有序的序列,并从小到大。也就是说:N15,B15,D30,C40。

  重复步骤2。将N1和B作为新节点N2的两个子节点。AS如下图所示,N2 = 15+15 = 30的重量。

  更换N2 N1和B,插入有序的序列,并从小到大。也就是说:N230,D30,C40。

  重复步骤2.将n2和d作为新节点N3的两个子节点,如下图所示,n3 = 30+30 = 60的重量。

  在N2中替换N3和D,并插入有序的序列以保持从小到大的排列。也就是说:C40,N360。

  重复步骤2.c和n3用作新节点T的两个子节点。如下图所示,因为t是根节点,因此完成了收割机的结构。

  此时,图上图中的二进制树的长度wpl = 40×1+30×2+15×3+10×4+5×4 = 205。这是最短的路径长度。

  根据最佳二进制形状和上面形状的独特性质,我们还可以写下以下形状最好的二进制树:

  Harvan的Java实施现在提供了下面的两种类型的施工方法。SORT。它们的时间效率不一致。在实际使用中选择一个。

  收获树的出现主要用于收获法规。Harvan的编码具有非常广泛的应用程序。Harvan的编码通常用于数据的压缩和减压技术。

  收割员编码的基本思想是将字符的频率用作力量,构建收割者树,然后使用Harvan Tree编码字符。该Harvan Tree是使用要编码的字符作为叶子节点。文件中字符作为叶节点的右侧的频率,以在N-1合并操作后构造的方式,在N-1合并后构建N-1合并操作后构造它。一棵树,叶子越大,靠近根部。

  例如,我们有一段文本“ baadcadfeed”将网络传输到其他文本。显然,使用二进制数字(0和1)表示自然。我们现在只有六个字母的ABCDEF,因此我们可以使用相应的二进制数据。

  真正的传输数据是编码的“ 00100001101000001111111100100011”,可以根据3位数字进行解码。如果文章很长,那么这样的二进制字符串也会很可怕。实际上,它是英语,中文,中文,中文,中文,中文或其他语言,字母或中文字符的频率不同,例如英文中的几个元音“ ae i o u”,中文字符”非常频繁。

  假设六个字母的频率为A 27,B 8,C 15,D15,E 30,F 5,仅100%。这意味着我们可以按照Harvan Tree重新计划。左下图显示构建收割机过程的过程的正确值。右侧的图片是一棵收割机,将右向左分支为0,右划分将其更改为1。

  目前,我们可以将六个字母从树根编码为叶子。

  我们再次将文本的内容编码为“ badcadfeed”。与比较相比,我们可以看到结果较小。

  换句话说,我们的数据已被压缩,节省了大约17%的存储或传输成本。随着字符和多头形权重的增加,这种压缩将显示其优势。

  当我们收到一个新的编码(例如1001010010101001000111100)时,我们应该如何解码?

  编码中国-Adrica 0是1,而Harvan编码是一个可变单词 - 长编码(VLC)。任何字符的编码不得是另一个字符的前缀。该编码也称为前缀编码。

  根据上面设计的编码,没有“ 10”和“ 100”代码与1001和1000易于混淆。

  但是,在解码时,仍使用收割机树,也就是说,发件人和接收器必须就同一收割机编码规则达成协议。

  当我们收到1001010010101001000111100时,可以看到商定的Havman树是1001的第一个字母是B。下一个01表示第二个字符是A,如下图所示,其余的可以相应地,成功地解码。

  通常,需要编码的字符集为{d1,d2,...,dn},电子文本中每个字符的数量或频率为{w1,w2,...,...,wn},..。,DN用作叶点,使用W1,W2,...,Wn用作构造收割机树的相应叶子节点的正确值。收割者树的左分支代表0,右分支代表1,然后由根节传递到叶子节点的路径分支组成的0和1序列的序列由节点的相应字符编码。

  作者:Liu Java