`

Java 哈夫曼编码反编码的实现

    博客分类:
  • java
阅读更多
Java 哈夫曼编码反编码的实现:

//哈弗曼编码的实现类  
public class HffmanCoding { 
    private int charsAndWeight[][];// [][0]是 字符,[][1]存放的是字符的权值(次数)  
    private int hfmcoding[][];// 存放哈弗曼树  
    private int i = 0;// 循环变量  
    private String hcs[]; 
 
    public HffmanCoding(int[][] chars) { 
        // TODO 构造方法  
        charsAndWeight = new int[chars.length][2]; 
        charsAndWeight = chars; 
        hfmcoding = new int[2 * chars.length - 1][4];// 为哈弗曼树分配空间  
    } 
 
    // 哈弗曼树的实现  
    public void coding() { 
        int n = charsAndWeight.length; 
        if (n == 0) 
            return; 
        int m = 2 * n - 1; 
        // 初始化哈弗曼树  
        for (i = 0; i < n; i++) { 
            hfmcoding[i][0] = charsAndWeight[i][1];// 初始化哈弗曼树的权值  
            hfmcoding[i][1] = 0;// 初始化哈弗曼树的根节点  
            hfmcoding[i][2] = 0;// 初始化哈弗曼树的左孩子  
            hfmcoding[i][3] = 0;// 初始化哈弗曼树的右孩子  
        } 
        for (i = n; i < m; i++) { 
            hfmcoding[i][0] = 0;// 初始化哈弗曼树的权值  
            hfmcoding[i][1] = 0;// 初始化哈弗曼树的根节点  
            hfmcoding[i][2] = 0;// 初始化哈弗曼树的左孩子  
            hfmcoding[i][3] = 0;// 初始化哈弗曼树的右孩子  
        } 
 
        // 构建哈弗曼树  
        for (i = n; i < m; i++) { 
            int s1[] = select(i);// 在哈弗曼树中查找双亲为零的 weight最小的节点  
            hfmcoding[s1[0]][1] = i;// 为哈弗曼树最小值付双亲  
            hfmcoding[s1[1]][1] = i; 
            hfmcoding[i][2] = s1[0];// 新节点的左孩子  
            hfmcoding[i][3] = s1[1];// 新节点的右孩子  
            hfmcoding[i][0] = hfmcoding[s1[0]][0] + hfmcoding[s1[1]][0];// 新节点的权值是左右孩子的权值之和  
        } 
 
    } 
 
    // 查找双亲为零的 weight最小的节点  
    private int[] select(int w) { 
        // TODO Auto-generated method stub  
        int s[] = { -1, -1 }, j = 0;// s1 最小权值且双亲为零的节点的序号 , i 是循环变量  
        int min1 = 32767, min2 = 32767; 
        for (j = 0; j < w; j++) { 
            if (hfmcoding[j][1] == 0) {// 只在尚未构造二叉树的结点中查找(双亲为零的节点)  
                if (hfmcoding[j][0] < min1) { 
                    min2 = min1; 
                    s[1] = s[0]; 
                    min1 = hfmcoding[j][0]; 
                    s[0] = j; 
 
                } else if (hfmcoding[j][0] < min2) { 
                    min2 = hfmcoding[j][0]; 
                    s[1] = j; 
                } 
            } 
        } 
 
        return s; 
    } 
 
    public String[] CreateHCode() {// 根据哈夫曼树求哈夫曼编码  
        int n = charsAndWeight.length; 
        int i, f, c; 
        String hcodeString = ""; 
        hcs = new String[n]; 
        for (i = 0; i < n; i++) {// 根据哈夫曼树求哈夫曼编码  
            c = i; 
            hcodeString = ""; 
            f = hfmcoding[i][1]; // f 哈弗曼树的根节点  
            while (f != 0) {// 循序直到树根结点  
                if (hfmcoding[f][2] == c) {// 处理左孩子结点  
                    hcodeString += "0"; 
                } else { 
                    hcodeString += "1"; 
                } 
                c = f; 
                f = hfmcoding[f][1]; 
            } 
            hcs[i] = new String(new StringBuffer(hcodeString).reverse()); 
        } 
        return hcs; 
    } 
 
    public String show(String s) {// 对字符串显示编码  
        String textString = ""; 
        char c[]; 
        int k = -1; 
        c = new char[s.length()]; 
        c = s.toCharArray();// 将字符串转化为字符数组  
        for (int i = 0; i < c.length; i++) { 
            k = c[i]; 
            for (int j = 0; j < charsAndWeight.length; j++) 
                if (k == charsAndWeight[j][0]) 
                    textString += hcs[j]; 
        } 
        return textString; 
 
    } 
 
    // 哈弗曼编码反编译  
    public String reCoding(String s) { 
 
        String text = "";// 存放反编译后的字符  
        int k = 0, m = hfmcoding.length - 1;// 从根节点开始查询  
        char c[]; 
        c = new char[s.length()]; 
        c = s.toCharArray(); 
        k = m; 
        for (int i = 0; i < c.length; i++) { 
            if (c[i] == '0') { 
                k = hfmcoding[k][2];// k的值为根节点左孩子的序号  
                if (hfmcoding[k][2] == 0 && hfmcoding[k][3] == 0)// 判断是不是叶子节点,条件(左右孩子都为零)  
                { 
                    text += (char) charsAndWeight[k][0]; 
                    k = m; 
                } 
            } 
            if (c[i] == '1') { 
                k = hfmcoding[k][3];// k的值为根节点右孩子的序号  
                if (hfmcoding[k][2] == 0 && hfmcoding[k][3] == 0)// 判断是不是叶子节点,条件(左右孩子都为零)  
                { 
                    text += (char) charsAndWeight[k][0]; 
                    k = m; 
                } 
 
            } 
        } 
        return text; 
    } 

 
调用的时候直接调用该类就行了 
 
eg : 
 
int chars[][] ; 
 
String s =“101010110”; 
 
HffmanCoding hfc = new HffmanCoding(chars); 
 
hfc.coding();//哈弗曼树  
String s[] = hfc.CreateHCode();//哈弗曼编码  
 
s=hfc.show(s); 
0
0
分享到:
评论

相关推荐

    哈夫曼编码算法与分析(java实现)

    哈夫曼编码算法与分析(java实现) 哈夫曼编码是一种广泛用于数据文件压缩的十分有效的编码方法,它通过对文件中各个字符出现的频率进行分析,生成各个字符的哈夫曼编码方案。哈夫曼编码的主要思想是通过构造一棵...

    哈夫曼编码实现压缩解压缩java

    下面将详细介绍哈夫曼编码的原理、构建过程以及在Java中的实现。 1. **哈夫曼编码原理**: 哈夫曼编码是建立在频率统计基础上的,通过对输入文本中各个字符出现频率的统计,构造一棵特殊的二叉树——哈夫曼树。在...

    哈夫曼编码解码的可视化界面实现

    在本项目中,使用Java语言实现了一个哈夫曼编码和解码的可视化界面,使得用户能够直观地观察到编码和解码的过程。 首先,`HuffmanAlgorithmAbstract.java`和`HuffmanAlgorithmImpl1.java`是哈夫曼编码算法的抽象类...

    哈夫曼编码的贪心算法设计

    通过本次实验,不仅能够深入理解哈夫曼编码的基本原理,还能实际操作使用C语言编程实现哈夫曼编码器。这种实践经历对于学习数据结构和算法具有重要意义。此外,掌握了贪心算法的设计方法,对于解决实际问题也...

    java 哈夫曼编码实现翻译

    哈夫曼编码是一种基于字符频率构建的前缀编码方法,常用于数据压缩。它通过创建一棵特殊的二叉树——哈夫曼树(也称为最优二叉树),来为每个字符分配一个唯一的二进制编码。在哈夫曼树中,频率较高的字符其编码通常...

    Java哈夫曼编码的文件的压缩与解压.docx

    本文将围绕Java实现哈夫曼编码的文件压缩与解压进行详细解析。 首先,我们看到`main`方法调用了`zipFile`和`unZipFile`两个静态方法,分别用于文件的压缩和解压缩操作。`zipFile`方法接收源文件路径和目标压缩文件...

    Java实现哈夫曼编码

    ### Java实现哈夫曼编码:深入解析与代码解读 #### 哈夫曼编码简介 哈夫曼编码(Huffman Coding)是一种广泛应用于数据压缩领域的编码技术,它是由David Huffman在1952年提出的。这种编码方式的核心思想是根据数据...

    xsjl.rar_Java哈夫曼编码_哈夫曼_哈夫曼 编码_哈夫曼压缩

    总结来说,Java哈夫曼编码是利用数据结构和算法理论实现的一种压缩技术,它在处理大量重复字符的数据时表现优秀。通过合理地分配编码长度,哈夫曼编码可以有效地减少存储空间,同时保持数据的可恢复性,因此在文本...

    哈夫曼树和哈夫曼编码的Java实现

    在Java中实现哈夫曼树和哈夫曼编码,可以分为以下几个关键部分: 1. **创建`HuffmanNode`类**:表示哈夫曼树的节点,包含字符、频率以及指向左右子节点的引用。 2. **优先队列`PriorityQueue&lt;HuffmanNode&gt;`**:用于...

    java哈夫曼编码,压缩,解压缩

    在Java中实现哈夫曼编码,主要涉及到以下几个关键步骤: 1. **构建哈夫曼树**: - 首先,统计输入文本中各个字符的出现频率。 - 接着,使用优先队列(如最小堆)创建一个哈夫曼树。每次从队列中取出两个频率最小...

    java哈夫曼编码译码器

    - **设计目的**:设计一个能够实现对文件进行哈夫曼编码与解码的Java程序。通过对文件进行编码压缩和解码恢复,演示哈夫曼编码的有效性和实用性。 - **设计要求**: - 构造哈夫曼树及其编码。 - 对“明文”进行...

    java实现哈夫曼算法

    【Java实现哈夫曼编码】在Java中实现哈夫曼编码,首先需要创建一个`TreeNode`类来表示树的节点,包含字符、权重以及左右子节点。接着,通过以下步骤来构建哈夫曼树: 1. **初始化树**:输入的字符及其频率存储在...

    hafuman.rar_Java哈夫曼编码_huffman_huffman java_vlc_哈夫曼编码

    在Java编程语言中,我们可以实现哈夫曼编码来压缩和解压缩数据。 首先,我们需要理解哈夫曼树的概念。哈夫曼树,也称为最优二叉树,是一种带权路径长度最短的二叉树。在构建哈夫曼树的过程中,我们会将出现频率最高...

    Huffman-coding-version-2.rar_Java哈夫曼编码_哈夫曼编码

    这个“Huffman-coding-version-2.rar”压缩包包含了一个Java实现的哈夫曼编码程序,特别适合初学者学习和研究,因为代码中有丰富的注释,可以帮助理解算法的细节。 哈夫曼编码的基本思想是利用字符出现频率来构建...

    哈夫曼编码的JAVA实现.rar

    在"哈夫曼编码的JAVA实现.pdf"文件中,可能包含了详细的代码示例,解释了如何用Java语言实现以上步骤。文件可能涵盖了从创建频率统计到构建哈夫曼树,再到编码和解码数据的完整过程。通过阅读这份文档,你可以深入...

    哈夫曼编码

    在Java编程语言中,我们可以自定义实现哈夫曼编码的算法来对文本进行编码和解码。 首先,我们需要理解哈夫曼树的概念。哈夫曼树(又称最优二叉树)是一棵带权路径长度最短的二叉树,其中每个叶子节点代表一个需要...

    Java实现哈夫曼编码和解码

    在Java中实现哈夫曼编码和解码,我们需要理解以下几个关键步骤: 1. **初始化**: - 收集所有符号(例如字符串中的字符),并计算它们的频率(出现次数)。 - 将符号按照频率排序,放入一个列表中。 2. **构建...

    哈夫曼编码译码器

    8. **编程语言知识**:虽然没有明确指出使用哪种编程语言,但实现哈夫曼编码和译码通常涉及到C、C++、Java、Python等常见编程语言的基础知识,包括变量、条件语句、循环、函数等。 在实现这个项目的过程中,你需要...

    HaffmanCode.rar_java 哈夫曼_压缩 解压 java_哈夫曼 编码_哈夫曼压缩

    综上所述,"HaffmanCode.rar_java 哈夫曼_压缩 解压 java_哈夫曼 编码_哈夫曼压缩"是一个包含Java实现的哈夫曼编码压缩和解压工具。它涉及到了哈夫曼树的构建、编码生成、文件压缩和解压的算法,以及Java中处理二...

    java算法分析与设计之哈夫曼编码源代码

    java算法分析与设计之哈夫曼编码源代码 算法作为计算机专业学生的必修课,同时也是软件开发过程中必备的编程思想,对学习研究计算机专业意义重大;正因为这门课程难,所以除了相关方面的书籍,网络资源少的可怜,尤其...

Global site tag (gtag.js) - Google Analytics