[java]java實現哈夫曼編碼
二叉樹的結點類:該類中包含結點的基本資訊,在二叉樹中的位置資訊以及用flag表明該結點是否參加二叉樹構造
/**
* @author:zym
* @description:node of binary tree
* @date: 2017/4/6
*/
public class Node {
public String name;//節點符號
public int weight;//權重
public Node parent;
public Node leftChild;
public Node rightChild;
public boolean flag;
public StringBuffer code;
public Node(String n,int w){//不同包中的類對該方法的訪問許可權?
name = n;
weight = w;
flag = true;
code = new StringBuffer();
}
@Override
public String toString() {
return "Node [name=" + name + ", weight=" + weight + ", code=" + code + "]";
}
}
排序類:採用快速排序對結點權重逆序排序
/**
* @author:zym
* @description: include all kinds of sort method
* @date: 2017/4/6
*/
public class Sort {
public static void swap(List<Node> nodes,int i,int j){
Node temp = nodes.get(i);
nodes.set(i, nodes.get(j));
nodes.set(j, temp);
}
/**
* author:zym
* description: quickSort of List(reverse sequence)
* date:2017/4/6
*/
public static void quickSort(List<Node> nodes,int begin,int end){
if(begin<end){
Node key = nodes.get(begin);
int i = begin,j = end;
while(true){
while(i<end&&nodes.get(i).weight>=key.weight) i++;
while(j>begin&&nodes.get(j).weight<=key.weight) j--;
if(i<j) swap(nodes,i,j);
else break;
}
swap(nodes,begin,j);
quickSort(nodes,begin,j-1);
quickSort(nodes,j+1,end);
}
}
}
/**
* @author:zym
* @description: data structure of huffman binary tree
* @date:2017/4/6
*/
public class HuffmanCode {
public static void createTree(List<Node> nodes){
Node left = null,right = null;
int k = 0,//記錄下第一次遍歷的斷點
size = nodes.size();//記錄nodes的初始結點數
while(true){
Sort.quickSort(nodes, 0, nodes.size()-1);
for(int i=1;i<nodes.size();i++){
if(nodes.get(nodes.size()-i).flag){
left = nodes.get(nodes.size()-i);
k = i;
break;
}
left = null;
}
for(int j=k+1;j<nodes.size();j++){
if(nodes.get(nodes.size()-j).flag){
right = nodes.get(nodes.size()-j);
break;
}
right = null;
}
if(left!=null&&right!=null){
Node parent = new Node(null,left.weight+right.weight);
parent.leftChild = left;
parent.rightChild = right;
left.parent = parent;
right.parent = parent;
left.flag = false;
right.flag = false;
nodes.add(parent);
}
if(nodes.size()==2*size-1){
Sort.quickSort(nodes, 0, nodes.size()-1);
break;
}
}
}
/**
* author:zym
* description: code for huffman binary tree
* date:
*/
public static void codeTree(List<Node> nodes){
for(int i=1;i<nodes.size();i++){
if(nodes.get(nodes.size()-i).name!=null){//查詢到所有葉子結點
Node temp = nodes.get(nodes.size()-i),//暫存葉子結點
temp1 = null,//暫存待編碼結點
parent = null;
while(true){
if(temp1 == null) temp1 = temp;
if(temp1.parent!=null){
parent = temp1.parent;
}
else break;
if(parent.leftChild == temp1) temp.code.append("0");
else temp.code.append("1");
temp1 = parent;
}
//temp = nodes.get(nodes.size()-i);
temp.code = temp.code.reverse();
}
}
}
}
Test類:
public class TestHuffmanCode {
public static void main(String[] args){
List<Node> nodes = new ArrayList<Node>();
nodes.add(new Node("a",4));
nodes.add(new Node("b",6));
nodes.add(new Node("c",5));
nodes.add(new Node("d",12));
nodes.add(new Node("e",3));
HuffmanCode.createTree(nodes);
HuffmanCode.codeTree(nodes);
for(Node node:nodes){
if(node.name!=null) System.out.println(node.toString());
}
}
}
輸出結果:
相關文章
- Java 樹結構實際應用 二(哈夫曼樹和哈夫曼編碼)Java
- 哈夫曼編碼 —— Lisp 與 Python 實現LispPython
- 樹和二叉樹的基本運算實現-哈夫曼樹/哈夫曼編碼二叉樹
- 【資料結構X.11】程式碼實現 哈夫曼樹的建立,建立,構造,實現哈夫曼編碼資料結構
- 最優二叉樹(哈夫曼樹)Java實現二叉樹Java
- 高階資料結構---赫(哈)夫曼樹及java程式碼實現資料結構Java
- 【筆記】哈夫曼樹筆記
- 資料結構-哈夫曼樹(python實現)資料結構Python
- 哈夫曼二叉樹原始碼 (轉)二叉樹原始碼
- 6.6 哈夫曼樹及其應用
- 資料結構與演算法——赫夫曼樹(哈夫曼樹)資料結構演算法
- 哈夫曼實現檔案壓縮解壓縮(c語言)C語言
- 重學資料結構之哈夫曼樹資料結構
- 哈夫曼樹及其應用(檔案壓縮)
- 合併果子(優先佇列 +或者+哈夫曼)佇列
- 資料結構與演算法:哈夫曼樹資料結構演算法
- POJ 3253Fence Repair(哈夫曼&優先佇列)AI佇列
- 【資料結構】哈夫曼樹的建立與基礎應用資料結構
- POJ 3253-Fence Repair(哈夫曼樹-最小值優先佇列)AI佇列
- 面試題—Java遞迴實現約瑟夫環面試題Java遞迴
- 一本正經的聊資料結構(7):哈弗曼編碼資料結構
- Unicode編碼和中文互轉(JAVA實現)UnicodeJava
- [原始碼和文件分享]基於JAVA實現的農夫過河問題原始碼Java
- java Java與編碼Java
- java實現編輯器(一)Java
- JAVA實現編寫平臺程式碼生成器Java
- java編碼Java
- 一本正經的聊資料結構(6):最優二叉樹 —— 哈夫曼樹資料結構二叉樹
- 資料結構之哈弗曼樹資料結構
- Java實現BCD編碼與十進位制轉換Java
- java實現驗證碼Java
- JAVA與編碼Java
- java實現url轉碼、解碼Java
- 樹(4)--赫夫曼樹及其應用
- java實現二維碼生成Java
- Java java.util.HashMap實現原理原始碼分析JavaHashMap原始碼
- Java編碼測試Java
- 【字元編碼】Java編碼格式探祕字元Java