<!--[if !supportLists]-->一、<!--[endif]-->什么是链表?
链表是使用指针进行连接的一种数据结构,他可以提供比数组更加灵活的数据存储。
认识一下链表之前,先知道节点。
Class Node { Object data;/用于存储数据; Node next;//指向下一个的指针 }
一、哈夫曼编码
以哈夫曼树─即最优二叉树,路径长度最小的二叉树,经常应用于数据压缩。在计算机信息处理中,“哈夫曼编码”是一种一致性编码法(又称“熵编码法”),用于数据的无损耗压缩。这一术语是指使用一张特殊的编码表将源字符(例如某文件中的一个符号)进行编码。这张编码表的特殊之处在于,它是根据每字符出现的估算概率而建立起来的(出现概率高的字符使用较短的编码,反之出现概率低的则使用较长的编码,这便使编码之后的字符串的平均期望长度降低,从而达到无损压缩数据的目的)。这种方法是由Huffman发展起来的。例如,在英文中,e的出现概率很高,而z的出现概率则最低。当利用哈夫曼编码对一篇英文进行压缩时,e极有可能用一个位(bit)来表示,而z则可能花去25个位(不是26)。用普通的表示方法时,每个英文字母均占用一个字节(byte),即8个位。二者相比,e使用了一般编码的1/8的长度,z则使用了3倍多。倘若我们能实现对于英文中各个字母出现概率的较准确的估算,就可以大幅度提高无损压缩的比例。
二、首先,需要一个Class LinkNode;结点类,用于保存节点的数据以及前一个与后一个节点的指针,这在C++中称之为指针,但是Java中是没有指针这个概念的。不过不妨碍理解。建立了一个结点类后,作为他的基础。代码如下:
public class HMF { private LinkNode [] nodes; public HMF(int[] data){ nodes = new LinkNode[data.length]; for(int i=0;i<data.length;i++){ nodes[i]=new LinkNode(); nodes[i].data=data[i]; } } //对节点排序 private void sort(LinkNode [] nodes){ int a= nodes.length; for(int i=0;i<a;i++){ for(int j=0;j<a-i-1;j++){ if(nodes[j].data > nodes[j+1].data){ //交换的不是数据,而是对象本身的位置 LinkNode x =nodes[j]; nodes[j]=nodes[j+1]; nodes[j+1]=x; } } } } //创建哈夫曼树 private LinkNode creatTree(){ LinkNode [] nodes=this.nodes;//临时变量 while(nodes.length>1){ sort(nodes); LinkNode lk0=nodes[0]; LinkNode lk1=nodes[1]; //去最小的两个 LinkNode lkn =new LinkNode(); lkn.data=lk0.data+lk1.data; lkn.left=lk0; lkn.right=lk1; //新建一个小一个单位的数组 LinkNode [] nodes2= new LinkNode[nodes.length-1]; for(int i=2;i<nodes.length;i++){ nodes2[i-2] =nodes[i]; } nodes2[nodes.length-2]=lkn; nodes=nodes2; } return nodes[0]; } // public void Code(){ LinkNode root = this.creatTree(); printTree(root," "); } public void printTree(LinkNode lk,String code){ if(lk!=null){ if(lk.left == null && lk.right == null) System.out.println(lk.data+"的编码是"+code); printTree(lk.left,code+"0"); printTree(lk.right,code+"1"); } } public static void main(String [] args){ int [] test = { 3,5,1,6,2,7} ; HMF hum = new HMF(test); hum.Code(); } }
相关推荐
理解二叉树线索化的实质是建立结点与其在相应序列中的前驱或后继之间的直接联系。二叉树的线索化过程是基于对二叉树进行遍历,而线索二叉树上的线索又为相应的遍历提供了方便
C语言实现的哈夫曼树
在C++中实现哈夫曼树,通常会结合链表和优先队列(STL中的`priority_queue`)这两种数据结构。 哈夫曼树的构建过程通常分为以下几步: 1. **创建最小堆**:首先,将每个字符及其出现频率(权重)存储为一个结构体...
哈夫曼树与哈夫曼编码是数据结构和算法领域中的一个重要概念,广泛应用于数据压缩、文本编码以及优先队列等场景。哈夫曼编码是一种特殊的前缀编码方法,能够为字符提供一种高效的二进制表示,使得频繁出现的字符具有...
根据给定的文件信息,我们可以深入探讨哈夫曼树(Huffman Tree)的基本操作与实现。哈夫曼树是一种在编码领域广泛应用的数据结构,主要用于数据压缩中的编码算法,特别是无损数据压缩。以下是对该代码及其功能的详细...
《C语言毕业设计:链表与哈夫曼树》 在C语言的世界里,链表是一种基础且重要的数据结构,而哈夫曼树(Huffman Tree)则是一种用于数据编码的有效算法,尤其在数据压缩领域有着广泛的应用。本文将深入探讨这两个概念...
我们选择链表是因为它可以方便地实现哈夫曼树的建立和遍历。 六、实验结果 通过实验,我们可以看到哈夫曼树的编译码器可以正确地实现哈夫曼编码和哈夫曼解码。实验结果表明,哈夫曼树的编译码器可以有效地实现数据...
链表与哈夫曼树的关联在于,哈夫曼树的构建过程中可能会使用到链表来实现优先队列。例如,可以用链表实现最小堆,其中每个节点包含一个字符及其频率,并通过指针链接。这种情况下,插入和删除节点(调整堆)可以通过...
1. 使用二叉链表存储哈夫曼树结构,方便插入和查找操作。 2. 建立哈夫曼树,这通常通过上面描述的贪心算法实现,确保了构建的树满足最小带权路径长度的特性。 3. 计算每个字符的哈夫曼编码,并将其显示出来,便于...
在这个MFC程序中,使用链表作为数据结构来存储哈夫曼树节点,实现了哈夫曼编码的生成和解码过程,并能将结果输出到文件,便于存储和传输。 链表在该程序中扮演了关键角色,它是哈夫曼树节点的载体。链表是一种动态...
哈夫曼树的存储结构可以使用静态三叉链表来实现。每个节点包含三个域:权重域、指针域和数据域。其中,权重域用于存储节点的权重,指针域用于存储指向左右孩子和指向双亲的指针,数据域用于存储节点的数据信息。 ...
链表与哈夫曼树的结合主要体现在构建哈夫曼树的过程中。哈夫曼树的构建通常采用“优先队列”(堆)或者“最小堆”的数据结构,但在某些情况下,也可以使用链表来实现。在这个过程中,我们可以用链表维护一个“待合并...
链表与哈夫曼树: 1. 链表作为基础数据结构:在C语言中,哈夫曼树的实现通常会用到链表,因为链表可以方便地动态插入和删除节点,适合构建和调整树结构。 2. 结构设计:哈夫曼树的节点通常包括权值、左子节点和右子...
这份名为"图+查找+排序+循环链表+循环链表+数组+广义表+二叉树与树的转换+哈夫曼树.pptx"的文档涵盖了多个关键知识点,下面将对这些主题进行详细解释。 1. **数组**:数组是最基本的数据结构,它允许存储具有相同...
哈夫曼树与哈夫曼编码是数据结构领域中的一个重要概念,主要应用于数据的压缩与解压缩,尤其在文本、图像等数据传输中起到优化存储和传输效率的作用。哈夫曼编码是一种高效的前缀编码方法,它通过构建一棵特殊的...
在数据结构的学习中,哈夫曼树(Huffman Tree)是一种特殊的二叉树,它在数据编码、数据压缩等领域有着广泛的应用。哈夫曼树基于贪心算法构建,旨在通过最小化路径长度来优化带权路径长度,从而提高数据传输或存储的...
在程序实现上,可以使用链表或者数组来表示哈夫曼树,其中链表更适用于动态调整,而数组则适用于空间效率的要求。`9(1).c` 文件可能是一个C语言实现的哈夫曼树构建和查找的示例代码,具体细节需要查看源代码才能了解...
3. 最小优先队列实现:可能是使用数组、链表或者优先级队列库来实现,用于存储和合并哈夫曼树节点。 4. 哈夫曼树的构建函数:接受字符频率列表,返回哈夫曼树的根节点。 5. 哈夫曼编码生成函数:遍历哈夫曼树,为每...
《四川大学计算机学院数据结构与算法分析实验报告——改进哈夫曼树类模板》 本实验报告详尽探讨了数据结构中的一个重要主题——哈夫曼树及其类模板的改进。哈夫曼树,又称为最优二叉树,是用于数据编码的一种特殊...
这可能涉及将哈夫曼树结构序列化为数组或链表,或者将哈夫曼编码表保存到文件中,以便在解码时重新加载。 总的来说,哈夫曼树是数据压缩和编码的重要工具,其二进制与字符串的转换算法在C语言中可以通过精心设计的...