`
128kj
  • 浏览: 600395 次
  • 来自: ...
社区版块
存档分类
最新评论

哈夫曼树及哈夫曼编码的实现(java)

阅读更多
若将树中结点赋给一个有着某种含义的数值,则这个数值称为该结点的权.
哈夫曼树的构造:

假设有n个权值,则构造出的哈夫曼树有n个叶子结点。 n个权值分别设为 w1、w2、…、wn,则哈夫曼树的构造规则为: 
        (1) 将w1、w2、…,wn看成是有n 棵树的森林(每棵树仅有一个结点);  
        (2) 在森林中选出两个根结点的权值最小的树合并,作为一棵新树的左、右子树,且新树的根结点权值为其左、右子树根结点权值之和;  
        (3)从森林中删除选取的两棵树,并将新树加入森林;  
        (4)重复(2)、(3)步,直到森林中只剩一棵树为止,该树即为所求得的哈夫曼树

import java.util.ArrayDeque;  
import java.util.ArrayList;  
import java.util.Collections;  
import java.util.List;  
import java.util.Queue;  
  
public class HuffmanTree<T> {  
   //构造哈夫曼树
    public static <T> Node<T> createTree(List<Node<T>> nodes){  
        while(nodes.size() > 1){  
            Collections.sort(nodes);  
            Node<T> left = nodes.get(nodes.size()-1);  
            Node<T> right = nodes.get(nodes.size()-2);  
            Node<T> parent = new Node<T>(null, left.getWeight()+right.getWeight());  
            parent.setLeft(left);  
            parent.setRight(right);  
            nodes.remove(left);  
            nodes.remove(right);  
            nodes.add(parent);  
        }  
        return nodes.get(0);  
    }  

    //递归生成Huffman编码
     public  static<T> void generateHuffmanCode(Node<T> root){
	if (root==null) return;
        if(root.getLeft()!=null) 
            root.getLeft().setCoding(root.getCoding()+"0");
        if(root.getRight()!=null) 
           root.getRight().setCoding(root.getCoding()+"1");
                
        generateHuffmanCode(root.getLeft());
	generateHuffmanCode(root.getRight());
     }
	
      
    public static <T> List<Node<T>> breadth(Node<T> root){  //广度优先遍历哈夫曼树
        List<Node<T>> list = new ArrayList<Node<T>>();  
        Queue<Node<T>> queue = new ArrayDeque<Node<T>>();  
          
        if(root != null){  
            queue.offer(root);  
        }  
          
        while(!queue.isEmpty()){  
            list.add(queue.peek());  
            Node<T> node = queue.poll();  
              
            if(node.getLeft() != null){  
                queue.offer(node.getLeft());  
            }  
              
            if(node.getRight() != null){  
                queue.offer(node.getRight());  
            }  
        }  
        return list;  
    }  
} 

//哈夫曼树节点
public class Node<T> implements Comparable<Node<T>> {  
    private T data;  
    private double weight;  
    private String coding = "";	//哈夫曼编码
    private Node<T> left;  
    private Node<T> right;  
      
    public Node(T data, double weight){  
        this.data = data;  
        this.weight = weight;  
    }  
      
    public T getData() {  
        return data;  
    }  
  
    public void setData(T data) {  
        this.data = data;  
    }  
  
    public double getWeight() {  
        return weight;  
    }  
  
    public void setWeight(double weight) {  
        this.weight = weight;  
    }  
  
    public Node<T> getLeft() {  
        return left;  
    }  
  
    public void setLeft(Node<T> left) {  
        this.left = left;  
    }  
  
    public Node<T> getRight() {  
        return right;  
    }  
  
    public void setRight(Node<T> right) {  
        this.right = right;  
    }  

    public String getCoding(){ return coding;}
    public void setCoding(String coding){ this.coding = coding;}	
  
    @Override  
    public String toString(){  
        return "data:"+this.data+";weight:"+this.weight+";Coding:"+this.coding;  
    }  
  
    @Override  
    public int compareTo(Node<T> other) {  
        if(other.getWeight() > this.getWeight()){  
            return 1;  
        }  
        if(other.getWeight() < this.getWeight()){  
            return -1;  
        }  
          
        return 0;  
    }  
}  
 


例:
假设一个文本文件中只包含7个字符{A,B,C,D,E,F,G},这7个字符在文本中出现的次数为{5,24,7,17,34,5,13},求这些字符的哈夫曼编码。



//上图的测试:
import java.util.ArrayList;  
import java.util.List;  
  
public class Test {  
    public static void main(String[] args) {  
        int a[]={5,24,7,17,34,5,13};
        String s[]={"A","B","C","D","E","F","G"};
        List<Node<String>> list1 = new ArrayList<Node<String>>();  
        for(int i=0;i<a.length;i++)
              list1.add(new Node<String>(s[i],a[i]));
         root = HuffmanTree.createTree(list1);  
        HuffmanTree.generateHuffmanCode(root);
        List<Node<String>> list2=HuffmanTree.breadth(root);
        for(Node<String> node: list2)
           System.out.println(node);
      
    }  
}  


运行结果:
data:null;weight:105.0;Coding:
data:null;weight:41.0;Coding:0
data:null;weight:64.0;Coding:1
data:D;weight:17.0;Coding:00
data:B;weight:24.0;Coding:01
data:null;weight:30.0;Coding:10
data:E;weight:34.0;Coding:11
data:G;weight:13.0;Coding:100
data:null;weight:17.0;Coding:101
data:C;weight:7.0;Coding:1010
data:null;weight:10.0;Coding:1011
data:F;weight:5.0;Coding:10110
data:A;weight:5.0;Coding:10111

下载源码:
  • 大小: 3.4 KB
分享到:
评论

相关推荐

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

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

    java 哈夫曼树及哈夫曼树的应用

    在Java中实现哈夫曼树,我们可以分为以下几个步骤: 1. **哈夫曼编码**:哈夫曼编码是哈夫曼树的基础,它是为每个字符分配一个唯一的二进制码,使得字符出现频率越高,其编码越短。哈夫曼编码的过程是通过构造...

    java 数据结构 哈夫曼树

    在Java语言中,实现哈夫曼树可以帮助我们理解和掌握数据结构与算法的核心概念。 哈夫曼树的基本思想是基于贪心策略,通过构建最小带权路径长度(Minimum Weighted Path Length, MWPL)的二叉树来达到数据编码的最...

    哈夫曼树Java

    在本项目中,使用Java窗体设计来实现哈夫曼树的可视化操作,用户可以直观地看到哈夫曼树的构建过程和编码结果。 首先,我们需要理解哈夫曼树的构造过程。哈夫曼树的构建通常包括以下几个步骤: 1. 统计字符频率:...

    精选_毕业设计_基于JAVA实现的Huffman哈夫曼树编码与解码_完整源码

    本项目“精选_毕业设计_基于JAVA实现的Huffman哈夫曼树编码与解码_完整源码”是用Java语言实现的,它涵盖了哈夫曼编码的构建、编码和解码过程。下面我们将深入探讨哈夫曼编码的基本原理以及如何用Java进行实现。 ...

    数据结构课程设计 哈夫曼树编码解码 java javafx

    从终端读入字符集大小 n,及 n 个字符和 m 个权值,建立哈夫曼树,并将它存于文件 hfmtree 中。 (2)C:编码 (Coding)。利用已建好的哈夫曼树(如不在内存,则从文件 hfmtree 中读入),对文件 tobetrans 中的正文进行...

    哈夫曼树编码与译码

    1. **编码过程**:遍历文本,统计每个字符的出现频率,构建哈夫曼树并生成哈夫曼编码。使用生成的编码对原文本进行编码,得到压缩后的数据。 2. **译码过程**:读取编码文件,利用构建的哈夫曼树,从根节点开始,...

    自适应哈弗曼编码的完整Java实现,内有可执行文件和源代码,还有说明

    在Java中实现自适应哈弗曼编码,你需要创建一个哈弗曼节点类,表示树的结构;接着是哈弗曼树类,用于构建和维护编码树;还需要一个编码器类,用于根据字符频率构建哈弗曼树并生成编码;最后,解码器类用于解析已...

    哈夫曼编码、哈夫曼树构建、哈夫曼树Java实现.docx

    在Java中实现哈夫曼树,可以创建一个Node类,包含节点的值、左子节点和右子节点。通过比较节点的值,可以构建最小堆,然后按照上述哈夫曼树的构建算法进行操作。具体实现涉及队列或堆的数据结构,以及递归或迭代的...

    java哈夫曼树的编码解码.zip

    在Java中实现哈夫曼树的编码和解码过程涉及以下几个主要步骤和概念: 1. **哈夫曼树构建**: - **哈夫曼节点**:每个节点代表一个字符,包含字符及其频率信息。 - **最小堆**:用于存储哈夫曼节点,每次取出频率...

    Huffman编码,哈夫曼树的实现

    在《严蔚敏奶奶数据结构》一书中,第六章关于树的部分详细介绍了哈夫曼编码的原理和实现。首先,我们理解哈夫曼树的基本概念:这是一棵带权路径长度最短的二叉树,其中权值较小的节点通常位于较深的层次,权重较大的...

    哈夫曼树实现的压缩工具Java源代码

    在Java中实现哈夫曼树的压缩工具,首先要理解以下几个关键步骤: 1. **字符频率统计**:首先,需要统计输入文本中各个字符的出现频率。这可以通过遍历文本并使用哈希表记录每个字符及其出现次数来完成。 2. **构建...

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

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

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

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

    数据结构哈夫曼树编码解码

    代码可能包括定义哈夫曼树节点结构、优先队列(最小堆)的实现、哈夫曼树的构建函数、编码和解码函数等。由于没有提供具体代码,我们无法详细分析每个函数的功能,但可以肯定的是,这个程序能够读取字符频率,构建...

    哈夫曼树压缩解压_压缩解压;哈夫曼树_

    在8.3版本的压缩包中,可能包含了一个实现哈夫曼树压缩和解压缩的程序。这个程序可能包括了对文件进行读取、频率统计、哈夫曼树构建、编码生成、编码文件写入、解码以及哈夫曼树重建等功能。通过学习和理解这个程序...

    java实现哈夫曼算法

    总的来说,哈夫曼编码在Java中的实现主要涉及数据结构(如二叉树)和算法(如快速排序)的应用,通过构建和遍历哈夫曼树来实现对字符的高效编码。在实际应用中,哈夫曼编码常用于文本、图像等数据的压缩,以减少存储...

    从文件读取字符串建立哈夫曼树并进行哈夫曼编码

    总之,哈夫曼编码是数据压缩的重要工具,通过从文件中读取字符串构建哈夫曼树,我们可以实现高效的文本压缩。在实际应用中,哈夫曼编码常与其他压缩技术结合,如LZ77、LZ78等,以进一步提升压缩效率。掌握哈夫曼编码...

Global site tag (gtag.js) - Google Analytics