`
猫不吃的鱼
  • 浏览: 159314 次
  • 性别: Icon_minigender_1
  • 来自: 芜湖市
社区版块
存档分类
最新评论

霍夫曼树,霍夫曼编码 的java实现

阅读更多
霍夫曼树的定义
在数据结构与算法中,人们把最小带权路径长度的二叉树称为霍夫曼树或者最优二叉树。
通俗的说就是各叶子节点的值和节点的路径长度相乘的值的和。最小的那种类型的二叉树就是霍夫曼树。

霍夫曼树的构造思想是,先将权值集合看作只有一个节点的树的集合,每次选最小的两个权值的树构造一颗新树,新树根节点的权值是左右子树的权值和,在权值集合中删除这两颗权值最小的树,将新生成的树放入权值集合中。如此重复下去,直到权值集合中只有一个元素,这就是最后整棵树的根节点了。

左子树路径看做0,右子树路径看做1的话,一个叶子节点的路径就可以通过01表示。这就是霍夫曼编码,每个节点的霍夫曼编码是不会相同的。

package com.tree;

import java.util.*;

/**
 * yuyong 2012-11-2
 */
public class HuffmanTree {

    Node treeRoot=null;
    HuffCode huff=new HuffCode();

    public HuffmanTree(SortedList<Node> values){

        while(true){
            Node first=values.get(0);
            values.remove(0);
            Node root=first;
            if(values.size()<=0){
                treeRoot=root;
                break;
            }
            Node two=values.get(0);
            if(two!=null){
                values.remove(0);
                root=new Node(null,first.weight+two.weight);
                root.left=first;
                root.right=two;
                values.insertItem(root);
            }

        }
    }



    public static void main(String args[]) throws Exception{
        long start=new Date().getTime();
        SortedList<Node> list=new SortedList<Node>(SortedList.ASC);
        for(int i=0;i<5;i++){
            int value=(int)(Math.random()*100);
            list.insertItem(new Node(value, value));
        }

        long end=new Date().getTime();
        System.out.println("共耗时:"+(end-start));
        System.out.println(list);
        HuffmanTree ht=new HuffmanTree(list);
        System.out.println("霍夫曼编码");
        ht.show(ht.treeRoot,0);


    }

    void show(Node node,int c){
        if(node.left!=null){
            huff.put(c,0);
            show(node.left, c + 1);
        }

        if(node.value!=null)
          System.out.println("权重:"+node.weight+"  霍夫曼编码值:"+huff.toString().substring(0,c));

        if(node.right!=null){
            huff.put(c,1);
            show(node.right, c + 1);
        }
    }




}

class Node{
    Object value;
    int weight;
    Node left;
    Node right;

    public Node(Object value,int weight){
        this.value=value;
        this.weight=weight;
    }

    public boolean equals(Object obj){
        Node node=(Node) obj;
        if(node.weight==this.weight&&node.value==this.value)
            return true;
        return false;
    }
}

class SortedList<T extends Node> extends LinkedList<T> {
    public static String DESC="desc";
    public static String ASC="asc";

    public String sort;

    public SortedList(String sort) throws Exception{
        if(sort.equals(DESC))
            this.sort=DESC;
        else if(sort.equals(ASC))
            this.sort=ASC;
        else
            throw new Exception("no support sort");
    }

    public void insertItem(T value){
           int index=0;
           if(this.size()>0){
               int start=0;
               int end=this.size()-1;
               int step=0;
               if(start!=end)
                   while((end-start)!=1){
                        step=(end-start)/2;
                        if(this.get(start+step).weight>value.weight){
                            end=end-step;
                        }else if(this.get(start+step).weight<value.weight){
                            start=start+step;
                        }else{
                            this.add(start+step,value);
                            return;
                        }
                   }

               if(value.weight>=this.get(end).weight){
                   index=end+1;
               }else if(value.weight<=this.get(start).weight){
                   index=start;
               }else
                   index=end;
           }

           this.add(index,value);

    }

    public String toString(){
        String str="[";
        for(int j=0;j<this.size();j++){
            str+=this.get(j).weight+",";
        }
        str=str.substring(0, str.length()-1);
        str+="]";
        return str;
    }




}

class HuffCode extends HashMap{

    public String toString(){
        String str="";
        for(int i=0;i<this.size();i++){
            str+=this.get(i);
        }
        return str;
    }

}




共耗时:0
[25,40,45,55,67]
霍夫曼编码
权重:45  霍夫曼编码值:00
权重:55  霍夫曼编码值:01
权重:25  霍夫曼编码值:100
权重:40  霍夫曼编码值:101
权重:67  霍夫曼编码值:11

分享到:
评论

相关推荐

    Huffman 霍夫曼 无损压缩 算法实现 java

    总的来说,通过Java实现的霍夫曼无损压缩算法,可以有效地压缩文本数据,减少存储空间。配合`binview`这样的工具,可以方便地查看和分析压缩后的数据。在实际应用中,霍夫曼编码常与其他压缩算法结合使用,如LZ77或...

    用JAVA实现霍夫曼编码

    基于java实现的霍夫曼编码 随意输入数字 实现编码 并可以计算码长

    用c++实现霍夫曼编码——多媒体实验内容

    "用c++实现霍夫曼编码——多媒体实验内容" 霍夫曼编码是一种变长编码技术,用于数据压缩。它的主要思想是根据符号出现的频率,将高频符号赋予短代码,低频符号赋予长代码,从而实现数据压缩。 在霍夫曼编码中,...

    java数据结构课设霍夫曼树与编码

    利用已建好的哈夫曼树(如不在内存,则从文件 hfmtree 中读入),对文件 tobetrans 中的正文进行编码,然后将结果存入文件 codefile 中。 (3)D:解码(Decoding)。利用已建好的哈夫曼树将文件 codefile 中的代码进行...

    霍夫曼编码与解码的Java实现

    huffman的java实现 码表生成程序 可对任意“.txt”文件进行概率统计,显示字符及其概率对照表; 依概率编制Huffman码表,显示字符、对应概率及码字对照表。 编码程序 使用码表,对任意“.txt”进行Huffman编码; ...

    java实现霍夫曼树压缩文本文件和解压

    总结来说,通过Java实现霍夫曼编码不仅可以加深对数据结构和算法的理解,还能够实际应用到文件压缩和解压缩的场景中。这个过程涉及到文件操作、数据结构(二叉树和优先队列)、编码和解码等多方面的知识,对于提升...

    霍夫曼编码与解码

    在实际编程中,可以使用各种编程语言实现霍夫曼编码,如Python、Java、C++等。这些语言都有相应的数据结构(如队列和二叉树)和算法库支持,可以帮助我们便捷地构建和操作霍夫曼树。同时,理解霍夫曼编码不仅可以...

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

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

    对操作码进行霍夫曼编码

    总结来说,"对操作码进行霍夫曼编码"是一项利用Java编程实现的数据压缩技术,它涉及到字符频率统计、霍夫曼树构建、编码生成和最短编码长度计算等多个关键环节。通过这样的编码,可以有效节省存储空间,提高数据传输...

    霍夫曼树java演示程序报告.doc

    总结来说,这个霍夫曼树的Java演示程序通过面向对象的方式实现了霍夫曼编码的过程,包括构建霍夫曼树、存储节点信息以及遍历输出树结构等功能。程序的核心是`BinTreeNode`类,它提供了构建和操作霍夫曼树的基本操作...

    游程编码 JAVA 代码

    在Java中实现哈夫曼编码,需要创建一个哈夫曼树类,包含节点的权值、左子节点和右子节点,以及构造哈夫曼树的方法。同时,需要一个优先队列来辅助构建过程。完成哈夫曼树后,可以通过遍历树生成每个像素值的编码,...

    java实现信息论与编码(香农码费诺码霍夫曼码).rar

    Java中实现霍夫曼编码需要构建霍夫曼树,然后根据树结构生成编码表,最后进行编码和解码。同时,可能还需要提供一个界面,展示编码过程和结果,方便用户理解。 在"CAS5.12"这个文件中,很可能包含了实现这些编码...

    信息论课程设计基于Java Swing霍夫曼香农费诺编码器源代码,基于Java的霍夫曼费诺香农编码器GUI

    信息论课程设计基于Java Swing霍夫曼香农费诺...霍夫曼编码 实现Q符号的N重序列的R进制编码 费诺编码 实现Q符号的编码 香农编码 实现Q符号的编码 设计Windows下的可视化操作界面,不同的编码类型用不同的菜单加以分割

    Adaptive-Huffman-coding:自适应霍夫曼编码(也称为动态霍夫曼编码)是一种基于霍夫曼编码的自适应编码技术。 它允许在传输符号时构建代码,没有源分布的初始知识,允许一次性编码和适应数据中不断变化的条件

    在Java编程语言中实现自适应霍夫曼编码,通常需要以下几个关键步骤: 1. 初始化:创建一个空的霍夫曼树,每个符号对应一个单节点。同时,需要一个数据结构(如优先队列)来存储这些节点,以便于按频率排序。 2. ...

    霍夫曼课程设计(全)

    - **程序实现**:展示如何用编程语言(如C++、Java或Python)实现霍夫曼编码的算法,包括霍夫曼树的构建和编码解码过程。 - **实验结果**:通过具体实例演示霍夫曼编码的压缩效果,对比未压缩前后的文件大小。 最后...

    基于C语言实现霍夫曼编码、费诺编码、霍夫曼压缩、LZ77压缩(源码).rar

    资源内容:基于霍夫曼编码、费诺编码、霍夫曼压缩、LZ77压缩C仿真(完整代码+说明文档+数据).rar 代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 适用对象:工科生、数学专业、算法等方向...

    Adaptive-Huffman:自适应霍夫曼编码的Java实现

    自适应霍夫曼使用Vitter算法在Java中实现自适应霍夫曼编码。如何运行编码器使用javac进行编译$ java adaptiveHuffman.encoder.Encoder InputFile OutputFile`其中InputFile是要压缩的一些文本或其他文件,而Output...

    huffman-coding:霍夫曼编码的另一种 Java 实现

    在Java实现中,可以使用`PriorityQueue`来实现最小堆,`HashMap`或`TreeMap`来存储字符及其频率和霍夫曼编码。在`huffman-coding-master`这个项目中,可能包含了以下文件: - `HuffmanNode.java`: 定义霍夫曼树节点...

    HuffmanEncoding:Java中的霍夫曼编码解码算法

    5. **Java实现细节**: - 在Java中,可以使用`PriorityQueue`作为堆的实现,`Node`类来表示霍夫曼树的节点,包含字符、频率以及指向左右子节点的引用。 - `HuffmanEncoder`和`HuffmanDecoder`类分别负责编码和解码...

Global site tag (gtag.js) - Google Analytics