霍夫曼樹
一、基本介紹

二、霍夫曼樹幾個重要概念和舉例說明

構成霍夫曼樹的步驟:

舉例:以arr = {1 3 6 7 8 13 29}

public class HuffmanTree {
public static void main(String[] args) {
int[] arr = { 13, 7, 8, 3, 29, 6, 1 };
Node root = createHuffmanTree(arr);
preOrder(root);
}
// 撰寫一個前序遍歷的方法
public static void preOrder(Node root) {
if (root != null) {
root.preOrder();
} else {
System.out.println("樹是空樹,無法遍歷~~");
}
}
// 創建赫夫曼樹的方法
/**
* @param arr 需要創建成霍夫曼樹的陣列
* @return 創建好后的霍夫曼樹的root節點
*/
public static Node createHuffmanTree(int[] arr) {
// 第一步為了操作方便
// 1.遍歷 arr 陣列
// 2.將 arr 的每個元素構成一個Node
// 3.將Node 放入到ArrayList中
List<Node> nodes = new ArrayList<Node>();
for (int value : arr) {
nodes.add(new Node(value));
}
while (nodes.size() > 1) {
// 排序從小到大
Collections.sort(nodes);
System.out.println("nodes = " + nodes);
// 取出根節點權值最小的兩顆二叉樹
//注意:如果是從大到小排列的:就應該取倒數第一個和倒數第二個
// (1) 取出權值最小的節點(二叉樹)
Node leftNode = nodes.get(0);
// (2) 取出權值第二小的節點(二叉樹)
Node rightNode = nodes.get(1);
// (3) 構建一顆新的二叉樹
Node parent = new Node(leftNode.value + rightNode.value);
parent.left = leftNode;
parent.right = rightNode;
// (4) 從ArrayList洗掉處理過的二叉樹
nodes.remove(leftNode);
nodes.remove(rightNode);
// (5) 將parent加入到nodes
nodes.add(parent);
}
// 回傳赫夫曼樹的root節點
return nodes.get(0);
}
}
//創建節點類
//為了讓Node物件支持排序Collections集合排序
//讓Node實作Comparable介面
class Node implements Comparable<Node> {
int value;// 節點權值
Node left;// 指向左子節點
Node right;// 指向右子節點
public Node(int value) {
this.value = value;
}
// 寫一個前序遍歷
public void preOrder() {
System.out.println(this);
if (this.left != null) {
this.left.preOrder();
}
if (this.right != null) {
this.right.preOrder();
}
}
@Override
public String toString() {
return "Node [value=" + value + "]";
}
@Override
public int compareTo(Node o) {
// 表示從小到大排列
return this.value - o.value;
}
}
霍夫曼編碼
一、基本介紹

二、原理剖析





6)說明:
原來長度是359,壓縮了(359 - 133) / 359 = 62.9%
此編碼滿足前綴編碼,即字符的編碼都不能是其他字符編碼的前綴,不會造成匹配的多義性;霍夫曼編碼是無損的壓縮處理方案
注意:

霍夫曼編碼壓縮檔案注意事項
1)如果檔案本身就是經過壓縮處理的,那么使用赫夫曼編碼在壓縮效率不會有明顯變化,比如視頻,ppt等等檔案
2)赫夫曼編碼是按位元組來處理的,因此可以處理所有的檔案(二進制檔案、文本檔案)
3)如果一個檔案中的內容,重復的資料不多,壓縮效果也不會很明顯,
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/317982.html
標籤:其他
上一篇:自動化快速上手--Python篇(3)--【操作運算子】--每天半小時
下一篇:一種基于瀏覽記錄的反反爬蟲方法
