`

huffman算法JAVA

阅读更多

 

java 代码

 

  1.   
  2. //Huffman.java   
  3. package huffman.xmu;   
  4. import java.util.LinkedHashMap;   
  5. import java.util.ArrayList;   
  6. import java.util.Set;   
  7. import java.util.Iterator;   
  8. public class Huffman {   
  9.   
  10.   public Huffman(LinkedHashMap<Character,Integer> map){   
  11.     
  12.   charTable = map;   
  13.   charset = map.keySet();   
  14.   creatHuffmanTree();   
  15.   creatHuffmanCode();   
  16.      
  17.      
  18.  }   
  19.     
  20.     
  21.  //encode the input string   
  22.  public String enCodeString(String inString){   
  23.     
  24.    StringBuffer temp = new StringBuffer();   
  25.    for(int i=0;i<inString.length();i++){   
  26.         
  27.      int ch = inString.charAt(i);   
  28.      int j=1;   
  29.     for( ;huffmanTree.get(j).charTag!=ch&&j<charset.size()+1;j++){   
  30.        
  31.     }   
  32.     if(j<=charset.size()){   
  33.         
  34.       temp.append(huffmanCode.get(j));   
  35.     } else {   
  36.        
  37.      temp.append(ch);   
  38.     }   
  39.        
  40.    }   
  41.       
  42.    return temp.toString();   
  43.       
  44.       
  45.  }   
  46.     
  47.  //decode the string   
  48.  public String deCodeString(String inString){   
  49.     
  50.    StringBuffer temp = new StringBuffer();   
  51.    int root = charset.size()*2-1;   
  52.    for(int i=0;i<inString.length();i++){   
  53.     char ch=inString.charAt(i);   
  54.        
  55.     if(ch=='0'){   
  56.        
  57.      root=huffmanTree.get(root).lChild;   
  58.     }else if(ch=='1'){   
  59.        
  60.      root=huffmanTree.get(root).rChild;   
  61.     }else {   
  62.        
  63.      temp.append(ch);   
  64.     }   
  65.        
  66.     if(root<=charset.size()){   
  67.        
  68.      temp.append(huffmanTree.get(root).charTag);   
  69.      root=charset.size()*2-1;   
  70.     }   
  71.       
  72.    }   
  73.    return temp.toString();   
  74.     
  75.  }   
  76.     
  77.     
  78.  //creat the huffman tree   
  79.  private void creatHuffmanTree(){   
  80.       
  81.    initTree();   
  82.    int min_child1;   
  83.    int min_child2;   
  84.       
  85.       
  86.    for(int i=charset.size()+1;i<2*charset.size();i++){   
  87.         
  88.      min_child1=0;   
  89.      min_child2=0;   
  90.         
  91.      for(int j=1;j<i;j++){   
  92.           
  93.      
  94.       if(huffmanTree.get(j).parent==0){   
  95.          
  96.        if(huffmanTree.get(j).weight<huffmanTree.get(min_child1).weight||   
  97.           huffmanTree.get(j).weight<huffmanTree.get(min_child2).weight ) {   
  98.             
  99.          if (huffmanTree.get(min_child1).weight < huffmanTree.get(min_child2).weight) {   
  100.                 min_child2 = j;   
  101.             }  else {   
  102.                 min_child1= j;   
  103.             }                         
  104.           }   
  105.       }   
  106.      }   
  107.         
  108.         
  109.      huffmanTree.get(min_child1).parent=i;   
  110.      huffmanTree.get(min_child2).parent=i;   
  111.         
  112.      if(min_child1<min_child2){   
  113.        huffmanTree.get(i).lChild=min_child1;   
  114.        huffmanTree.get(i).rChild=min_child2;   
  115.      } else{   
  116.        huffmanTree.get(i).rChild=min_child1;   
  117.        huffmanTree.get(i).lChild=min_child2;   
  118.      }   
  119.         
  120.      huffmanTree.get(i).weight=huffmanTree.get(i).weight+huffmanTree.get(i).weight;   
  121.         
  122.        
  123.    }   
  124.     
  125.  }   
  126.     
  127.  private void creatHuffmanCode(){   
  128.      
  129.   huffmanCode = new ArrayList<String>(charset.size()+1);   
  130.   huffmanCode.add(0,null);   
  131.   char [] tempChars = new char[charset.size()+1];    
  132.      
  133.   for(int i=1;i<charset.size()+1;i++){   
  134.       
  135.    int startIndex=charset.size();   
  136.    int parent = huffmanTree.get(i).parent;   
  137.    int ch=i;   
  138.    while(parent!=0){   
  139.       
  140.     if(huffmanTree.get(parent).lChild== ch){   
  141.        
  142.      tempChars[startIndex]='0';   
  143.       
  144.         
  145.     }else {   
  146.        
  147.      tempChars[startIndex]='1';   
  148.       
  149.     }    
  150.        
  151.     startIndex--;   
  152.     ch=parent;   
  153.     parent=huffmanTree.get(parent).parent;   
  154.         
  155.          
  156.    }   
  157.       
  158.    System.out.println(String.valueOf(tempChars,startIndex+1,charset.size()-startIndex));   
  159.    huffmanCode.add(i, String.valueOf(tempChars,startIndex+1,charset.size()-startIndex));   
  160.       
  161.       
  162.   }//end for   
  163.      
  164.     
  165.      
  166.  }//end method   
  167.   
  168.     
  169.  private void initTree(){   
  170.       
  171.    huffmanTree = new ArrayList<Node>();   
  172.       
  173.    Iterator<Character>  charIter = charset.iterator();   
  174.       
  175.    int i=1;   
  176.       
  177.       
  178.    huffmanTree.add(0,new Node((char0, Integer.MAX_VALUE, 000));   
  179.   while(charIter.hasNext()){   
  180.        
  181.     Character ch=charIter.next();   
  182.    huffmanTree.add(i,new Node(ch,charTable.get(ch),0,0,0));   
  183.       
  184.      
  185.    i++;   
  186.      
  187.   }   
  188.      
  189.      
  190.   for(int j=charset.size()+1;j<2*charset.size();j++){   
  191.      
  192.    huffmanTree.add(j,new Node((char)0,0,0,0,0));   
  193.   }   
  194.      
  195.      
  196.  }   
  197.     
  198.  //character table with the frequency of each character   
  199.  private LinkedHashMap<Character,Integer>  charTable;   
  200.     
  201.  private Set<Character >  charset;   
  202.     
  203.  //store the huffman tree with the ArrayList   
  204.  private ArrayList<Node> huffmanTree ;   
  205.     
  206.  //store the huffman code with the ArrayList   
  207.  private ArrayList<String> huffmanCode;   
  208.     
  209.     
  210.  class Node{   
  211.     
  212.   char charTag;   
  213.   int weight;   
  214.   int parent;   
  215.   int lChild;   
  216.   int rChild;   
  217.      
  218.   public Node(char c,int w, int p,int l, int r){   
  219.      
  220.    charTag = c;   
  221.    weight = w;   
  222.    lChild = l;   
  223.    rChild = r;   
  224.   }   
  225.      
  226.  }//end Node   
  227.     
  228.     
  229.     
  230.  public static void main(String [] args){   
  231.     
  232.   LinkedHashMap<Character,Integer> hasmap = new LinkedHashMap<Character,Integer>();   
  233.   hasmap.put('a',4);   
  234.   hasmap.put('b',5);   
  235.   hasmap.put('c',8);   
  236.   hasmap.put('d',10);   
  237.      
  238.   Huffman huffman = new Huffman(hasmap);   
  239.   String temp = huffman.enCodeString("abcd");   
  240.   System.out.println(temp);   
  241.   System.out.println(huffman.deCodeString(temp));   
  242.      
  243.      
  244.  }   
  245.     
  246. }   
分享到:
评论

相关推荐

    java实现huffman算法

    java实现huffman算法 ~可以在控制台输入字符串编码~

    Huffman编码的java实现

    Huffman编码是一种高效的数据压缩算法,它基于字符出现频率构建最优前缀树,进而为每个字符分配唯一的二进制编码。在Java环境下实现Huffman编码,我们需要理解以下几个关键概念: 1. **字符频率统计**:首先,我们...

    huffman编码java实现

    在这个Java程序中,`huffman()`函数负责构建哈夫曼树,而`code()`函数则负责分配编码。`main()`函数是整个流程的入口,初始化权重数组,创建并填充优先级队列,然后调用`huffman()`和`code()`函数完成编码过程,并...

    Huffman编码的JAVA实现算法(源代码)

    在这个Java实现中,我们将探讨如何利用Java编程语言构建Huffman树并进行编码和解码。 首先,我们需要理解Huffman树的构建过程。这通常涉及以下几个步骤: 1. 计算字符频率:统计输入文本中每个字符出现的次数,这些...

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

    霍夫曼编码(Huffman Coding)是一种数据压缩算法,由美国计算机科学家大卫·霍夫曼在1952年提出,常用于文本压缩。它的基本原理是基于字符出现频率进行编码,频繁出现的字符用较短的编码,不常见的字符用较长的编码...

    第8章贪心算法-Huffman算法

    Huffman算法是贪心算法的一个经典应用,主要用于数据压缩,通过构建Huffman树来实现。Huffman编码是一种可变长度的前缀编码,它使得频繁出现的字符拥有较短的编码,不常出现的字符则拥有较长的编码,以此达到压缩...

    HuffmanCoding-Java

    哈夫曼编码(Huffman Coding)是一种数据压缩算法,它基于字符出现频率构建最优的前缀树(也称为哈夫曼树),以实现高效的编码和解码过程。在这个名为"HuffmanCoding-Java"的项目中,开发者使用Java语言实现了哈夫曼...

    HuffmanCode_huffman编码java_huffman_

    哈夫曼编码(Huffman Coding)是一种用于无损数据压缩的算法,由大卫·艾伦·哈夫曼在1952年提出。这个算法基于字符出现频率构建一棵特殊的二叉树,称为哈夫曼树,进而为每个字符生成唯一的二进制编码,即哈夫曼编码...

    huffman压缩算法实现

    哈夫曼编码(Huffman Coding)是一种数据压缩算法,由美国计算机科学家大卫·艾尔文·哈夫曼在1952年提出。这个算法基于字符出现频率进行编码,经常出现的字符会得到较短的编码,而较少出现的字符则获得较长的编码,...

    Huffman压缩解压java实现

    在Java中实现Huffman编码,需要理解其基本原理并运用数据结构和算法。 一、Huffman编码原理 1. 频率统计:首先,对输入文本中的每个字符出现的次数进行统计,得到一个字符频率表。 2. 构建Huffman树:通过一个...

    HuffmanCode_java.rar_HuffmanCode_java_huffman java_huffman 文本_hu

    哈夫曼编码(Huffman Coding)是一种高效的数据压缩算法,尤其适用于文本压缩。它基于字符出现频率,构建最优的二叉树结构,使得高频字符的编码较短,低频字符的编码较长,从而实现数据的高效压缩。在Java编程语言中...

    文件的压缩与解压huffman算法功能实现.pdf

    【文件的压缩与解压Huffman算法功能实现】 在信息技术领域,文件的压缩与解压是至关重要的技术,尤其在互联网环境中,面对大量的多媒体信息,有效地压缩数据不仅可以节省存储空间,还能提高数据传输效率。Huffman...

    基于Huffman编码压缩软件(java实现)

    《基于Huffman编码的Java压缩软件详解》 在信息技术领域,数据压缩技术是不可或缺的一部分,尤其是在存储和传输大量数据时。Huffman编码是一种常见的无损数据压缩算法,它利用字符出现频率的不同,构建最优的二叉树...

    HaffmanCode.rar_huffman_huffman编码java

    哈夫曼编码(Huffman Coding)是一种用于无损数据压缩的算法,由大卫·艾尔·哈夫曼在1952年提出。这个算法基于一种特殊的二叉树——哈夫曼树,通过构建这棵树来为每个字符生成唯一的前缀编码,从而达到高效的数据...

    HuffmanCompress-java.rar_compression in java_huffman in java_huf

    本文将深入探讨Java中使用霍夫曼编码(Huffman Coding)进行数据压缩的原理和实践。霍夫曼编码是一种无损数据压缩算法,它基于字符的频率来构建优化的二叉树结构,从而实现高效的数据压缩。 首先,我们来看一下...

    HuffmanCode_Java_SourceCode.rar_code_huffman_huffman java code_h

    哈夫曼编码(Huffman Coding)是一种用于数据压缩的高效算法,由大卫·艾尔文·哈夫曼在1952年提出。这个压缩方法是基于字符出现频率的,通过对字符进行编码来减少数据存储空间。在Java编程语言中实现哈夫曼编码涉及...

    hafuman.rar_huffman java_huffman java code_java 哈夫曼_哈夫曼树的

    在Java编程中,理解和实现哈夫曼编码是数据结构和算法学习的重要一环。本教程将详细介绍哈夫曼树的构建过程以及其在Java中的实现。 哈夫曼编码的基本原理是通过赋予频率较高的字符较短的编码,频率较低的字符较长的...

    Huffman的Java实现

    哈夫曼编码(Huffman Coding)是一种用于数据压缩的高效算法,由大卫·艾伦·哈夫曼在1952年提出。它是基于字符频率的变长编码方法,能够根据字符出现的频繁程度来分配更短的编码,从而达到更高的压缩效率。哈夫曼...

    JDBC与Java数据库程序设计_0.rar_JAVA数据库_java huffman_java 数据库_jdbc_数据库程序

    Java Huffman,虽然在提供的标签中出现,但它实际上是指Huffman编码,一种数据压缩算法。在Java中,我们可以使用BitSet类或者自定义的数据结构实现Huffman编码。这种编码方法主要用于文本数据的压缩,通过构建一棵...

Global site tag (gtag.js) - Google Analytics