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

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


?構(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);
}
// 編寫一個(gè)前序遍歷的方法
public static void preOrder(Node root) {
if (root != null) {
root.preOrder();
} else {
System.out.println("樹是空樹,無法遍歷~~");
}
}
// 創(chuàng)建赫夫曼樹的方法
/**
* @param arr 需要?jiǎng)?chuàng)建成霍夫曼樹的數(shù)組
* @return 創(chuàng)建好后的霍夫曼樹的root節(jié)點(diǎn)
*/
public static Node createHuffmanTree(int[] arr) {
// 第一步為了操作方便
// 1.遍歷 arr 數(shù)組
// 2.將 arr 的每個(gè)元素構(gòu)成一個(gè)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ù)第一個(gè)和倒數(shù)第二個(gè)
// (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對(duì)象支持排序Collections集合排序
//讓Node實(shí)現(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;
}
// 寫一個(gè)前序遍歷
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%
此編碼滿足前綴編碼,即字符的編碼都不能是其他字符編碼的前綴。不會(huì)造成匹配的多義性;
霍夫曼編碼是無損的壓縮處理方案
注意:




霍夫曼編碼壓縮文件注意事項(xiàng)
1)如果文件本身就是經(jīng)過壓縮處理的,那么使用赫夫曼編碼在壓縮效率不會(huì)有明顯變化,比如視頻,ppt等等文件
2)赫夫曼編碼是按字節(jié)來處理的,因此可以處理所有的文件(二進(jìn)制文件、文本文件)
3)如果一個(gè)文件中的內(nèi)容,重復(fù)的數(shù)據(jù)不多,壓縮效果也不會(huì)很明顯。
以上就是java數(shù)據(jù)結(jié)構(gòu)圖論霍夫曼樹及其編碼示例詳解的詳細(xì)內(nèi)容,更多關(guān)于圖論數(shù)據(jù)結(jié)構(gòu)霍夫曼樹及其編碼的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- Java?C++?算法題解leetcode145商品折扣后最終價(jià)格單調(diào)棧
- Java算法真題詳解運(yùn)用單調(diào)棧
- Java 數(shù)據(jù)結(jié)構(gòu)算法Collection接口迭代器示例詳解
- java數(shù)據(jù)結(jié)構(gòu)循環(huán)隊(duì)列的空滿判斷及長度計(jì)算
- java數(shù)據(jù)結(jié)構(gòu)與算法數(shù)組模擬隊(duì)列示例詳解
- java數(shù)據(jù)結(jié)構(gòu)算法稀疏數(shù)組示例詳解
- 特殊數(shù)據(jù)結(jié)構(gòu)之使用Java實(shí)現(xiàn)單調(diào)棧示例
相關(guān)文章
Java List移除相應(yīng)元素的超簡(jiǎn)潔寫法分享
這篇文章主要介紹了Java List移除相應(yīng)元素的超簡(jiǎn)潔寫法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-11-11
SpringCloud集成Eureka并實(shí)現(xiàn)負(fù)載均衡的過程詳解
這篇文章主要給大家詳細(xì)介紹了SpringCloud集成Eureka并實(shí)現(xiàn)負(fù)載均衡的過程,文章通過代碼示例和圖文講解的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的參考價(jià)值,需要的朋友可以參考下2023-11-11
在Spring Boot項(xiàng)目中引入本地JAR包的步驟和配置
本文探討了在Spring Boot項(xiàng)目中引入本地JAR包的步驟和必要的配置,通過使用Maven的system作用域,開發(fā)者可以將自定義的本地庫或功能集成到Spring Boot應(yīng)用程序中,,需要的朋友可以參考下2023-10-10
springboot定時(shí)任務(wù)不起作用問題及解決
文章主要介紹了Spring Boot中延遲加載bean的概念,并討論了如何解決定時(shí)任務(wù)不執(zhí)行的問題,通過設(shè)置`@Lazy(false)`注解,可以指定某些類不使用延遲加載,從而解決定時(shí)任務(wù)無法執(zhí)行的問題2024-11-11
將Arthas整合到Java業(yè)務(wù)鏡像中的流程步驟
在現(xiàn)代Java應(yīng)用開發(fā)中,診斷和調(diào)試是一個(gè)不可或缺的環(huán)節(jié),Arthas,作為阿里巴巴開源的一款Java診斷工具,提供了一種在不修改代碼的情況下,實(shí)時(shí)監(jiān)控、診斷和調(diào)試Java應(yīng)用程序的解決方案,本文將詳細(xì)介紹Arthas的基本概念,并逐步指導(dǎo)如何將其整合到Java業(yè)務(wù)鏡像中2025-02-02
JAVA加密算法數(shù)字簽名實(shí)現(xiàn)原理詳解
這篇文章主要介紹了JAVA加密算法數(shù)字簽名實(shí)現(xiàn)原理詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-10-10

