資料結構之哈夫曼樹(java實現)-(五)

來源:互聯網
上載者:User

標籤:

    所謂哈夫曼樹就是要求最小加權路徑長度,這是什麼意思呢?簡而言之,就是要所有的節點對應的路徑長度(高度-1)乘以該節點的權值,然後保證這些結果之和最小。

   哈夫曼樹最常執行的 App就是解決編碼問題。一般我們用的ASCII是固定長度的編碼,對於那些常用的字元,使用很長的長度就顯得略為浪費空間了。

  下面以一個執行個體來構建一顆哈夫曼編碼樹。

   設字元集S={A,B,C,D,E,F},字元出現的頻率W={2,3,5,7,9,12},對字元集進行哈夫曼編碼

   (1)以頻率為樹的節點值,構建6個樹節點,儲存在一個資料集合T中

     (2)選擇頻率集W中最小的兩個頻率,然後相加,將結果作為樹的節點值,構建新的樹節點,將這兩個最小值對應的樹節點,分別作為新的節點的左右孩子。從T重刪除這兩個最小值對應的節點,最後將新節點放到T中。

   (3)重複第2步,直到T中只剩下一個節點,那麼該節點就是所需要的哈夫曼樹

 其實說的容易,實現起來也有一點小麻煩,下面用java實現:

     樹節點:

              

public class TreeNode<T>{        public TreeNode<T> leftNode;        public TreeNode<T> rightNode;        public T data;public TreeNode(T data){this.data=data;}}
   構建哈夫曼樹:

public class TestTree{/* * 設S={A,B,C,D,E,F},W={2,3,5,7,9,12} */static HashMap<Character, Integer> map;public TestTree(){// TODO Auto-generated constructor stub}public static void main(String[] args){Character[] character = { 'A', 'B', 'C', 'D', 'E', 'F' };int[] weight = { 2, 3, 5, 7, 9, 12 };// 有序或者無序都一樣map=new HashMap<Character, Integer>();for(int i=0;i<weight.length;i++)map.put(character[i], weight[i]);ArrayList<TreeNode<Integer>> nodes = new ArrayList<TreeNode<Integer>>();for (int i = 0; i < weight.length; i++){nodes.add(new TreeNode<Integer>(weight[i]));}while (true){if (nodes.size() <= 1)break;// 找兩個最小的TreeNode<Integer> minNode = nodes.get(0);TreeNode<Integer> sminNode = nodes.get(1);for (int i = 1; i < nodes.size(); i++){TreeNode<Integer> tempNode = nodes.get(i);if (minNode.data >=tempNode.data){sminNode = minNode;minNode = tempNode;}}nodes.remove(minNode);nodes.remove(sminNode);TreeNode<Integer> newNode = new TreeNode<Integer>(minNode.data + sminNode.data);newNode.leftNode = minNode;newNode.rightNode = sminNode;nodes.add(newNode);}TreeNode<Integer>hafmanTreeNode=nodes.get(0);getHalmanCode(hafmanTreeNode," ");} public static void getHalmanCode(TreeNode<Integer>hafmanTreeNode,String blank) { if(hafmanTreeNode==null) return; if(hafmanTreeNode.leftNode==null&&hafmanTreeNode.rightNode==null) {   System.out.println("->"+getCharacter(hafmanTreeNode.data)); } else  { System.out.print("0"); getHalmanCode(hafmanTreeNode.leftNode,blank+" "); System.out.print(blank+"1"); getHalmanCode(hafmanTreeNode.rightNode,blank+" "); } } //得到某一個字元的編碼 public static void getHalmanCode(TreeNode<Integer>hafmanTreeNode,Character character) { if(hafmanTreeNode==null) return; if(hafmanTreeNode.leftNode==null&&hafmanTreeNode.rightNode==null) { if (getCharacter(hafmanTreeNode.data)==character){System.out.print("");} } }                //得到權值對應的字元 public static Character getCharacter(int weight) { Set<Map.Entry<Character, Integer>>set=map.entrySet(); for(Iterator<Map.Entry<Character, Integer>> iterator=set.iterator();iterator.hasNext();) { Map.Entry<Character, Integer>entry=iterator.next(); if(entry.getValue()==weight) { map.remove(entry.getKey()); return entry.getKey(); } } return null; }}
  結果:

       

 D:00

 E:01

 A:1000

 B:1001

 C:101

 F:11

資料結構之哈夫曼樹(java實現)-(五)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.