java數(shù)據(jù)結(jié)構(gòu)圖論霍夫曼樹及其編碼示例詳解
霍夫曼樹
一、基本介紹

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


?構(gòu)成霍夫曼樹的步驟

舉例:以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("樹是空樹,無法遍歷~~");
}
}
// 創(chuàng)建赫夫曼樹的方法
/**
* @param arr 需要創(chuàng)建成霍夫曼樹的數(shù)組
* @return 創(chuàng)建好后的霍夫曼樹的root節(jié)點(diǎn)
*/
public static Node createHuffmanTree(int[] arr) {
// 第一步為了操作方便
// 1.遍歷 arr 數(shù)組
// 2.將 arr 的每個元素構(gòu)成一個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);
// 取出根節(jié)點(diǎn)權(quán)值最小的兩顆二叉樹
//注意:如果是從大到小排列的:就應(yīng)該取倒數(shù)第一個和倒數(shù)第二個
// (1) 取出權(quán)值最小的節(jié)點(diǎn)(二叉樹)
Node leftNode = nodes.get(0);
// (2) 取出權(quán)值第二小的節(jié)點(diǎn)(二叉樹)
Node rightNode = nodes.get(1);
// (3) 構(gòu)建一顆新的二叉樹
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節(jié)點(diǎn)
return nodes.get(0);
}
}
//創(chuàng)建節(jié)點(diǎn)類
//為了讓Node對象支持排序Collections集合排序
//讓Node實現(xiàn)Comparable接口
class Node implements Comparable<Node> {
int value;// 節(jié)點(diǎn)權(quán)值
Node left;// 指向左子節(jié)點(diǎn)
Node right;// 指向右子節(jié)點(diǎn)
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)如果文件本身就是經(jīng)過壓縮處理的,那么使用赫夫曼編碼在壓縮效率不會有明顯變化,比如視頻,ppt等等文件
2)赫夫曼編碼是按字節(jié)來處理的,因此可以處理所有的文件(二進(jìn)制文件、文本文件)
3)如果一個文件中的內(nèi)容,重復(fù)的數(shù)據(jù)不多,壓縮效果也不會很明顯。
以上就是java數(shù)據(jù)結(jié)構(gòu)圖論霍夫曼樹及其編碼示例詳解的詳細(xì)內(nèi)容,更多關(guān)于圖論數(shù)據(jù)結(jié)構(gòu)霍夫曼樹及其編碼的資料請關(guān)注腳本之家其它相關(guān)文章!
- Java?C++?算法題解leetcode145商品折扣后最終價格單調(diào)棧
- Java算法真題詳解運(yùn)用單調(diào)棧
- Java 數(shù)據(jù)結(jié)構(gòu)算法Collection接口迭代器示例詳解
- java數(shù)據(jù)結(jié)構(gòu)循環(huán)隊列的空滿判斷及長度計算
- java數(shù)據(jù)結(jié)構(gòu)與算法數(shù)組模擬隊列示例詳解
- java數(shù)據(jù)結(jié)構(gòu)算法稀疏數(shù)組示例詳解
- 特殊數(shù)據(jù)結(jié)構(gòu)之使用Java實現(xiàn)單調(diào)棧示例
相關(guān)文章
SpringCloud集成Eureka并實現(xiàn)負(fù)載均衡的過程詳解
這篇文章主要給大家詳細(xì)介紹了SpringCloud集成Eureka并實現(xiàn)負(fù)載均衡的過程,文章通過代碼示例和圖文講解的非常詳細(xì),對大家的學(xué)習(xí)或工作有一定的參考價值,需要的朋友可以參考下2023-11-11
將Arthas整合到Java業(yè)務(wù)鏡像中的流程步驟
在現(xiàn)代Java應(yīng)用開發(fā)中,診斷和調(diào)試是一個不可或缺的環(huán)節(jié),Arthas,作為阿里巴巴開源的一款Java診斷工具,提供了一種在不修改代碼的情況下,實時監(jiān)控、診斷和調(diào)試Java應(yīng)用程序的解決方案,本文將詳細(xì)介紹Arthas的基本概念,并逐步指導(dǎo)如何將其整合到Java業(yè)務(wù)鏡像中2025-02-02

