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,算法,J#,asp.net,asp)