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對象支持排序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)霍夫曼樹及其編碼的資料請關(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)文章
微服務(wù)Redis-Session共享登錄狀態(tài)的過程詳解
這篇文章主要介紹了微服務(wù)Redis-Session共享登錄狀態(tài),本文采取Spring security做登錄校驗(yàn),用redis做session共享,實(shí)現(xiàn)單服務(wù)登錄可靠性,微服務(wù)之間調(diào)用的可靠性與通用性,需要的朋友可以參考下2023-12-12Java求10到100000之間的水仙花數(shù)算法示例
這篇文章主要介紹了Java求10到100000之間的水仙花數(shù)算法,結(jié)合實(shí)例形式分析了水仙花數(shù)的概念及相應(yīng)的java算法實(shí)現(xiàn)技巧,需要的朋友可以參考下2017-10-10RabbitMQ交換機(jī)與Springboot整合的簡單實(shí)現(xiàn)
這篇文章主要介紹了RabbitMQ交換機(jī)與Springboot整合的簡單實(shí)現(xiàn),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-07-07Tomcat正常啟動(dòng),訪問所有頁面均報(bào)404異常,404異??偨Y(jié)分析
今天遇到一個(gè)問題:Tomcat正常啟動(dòng),訪問所有頁面均報(bào)404異常,究竟該如何解決這個(gè)問題呢?下邊小編將為大家介紹一下解決方法,需要的朋友可以參考下2013-07-07Java實(shí)現(xiàn)導(dǎo)出Excel功能
通過java中Controller層,來接受請求,數(shù)據(jù)庫查詢到的數(shù)據(jù)進(jìn)行封裝,然后使用ExcelUtils進(jìn)行輸出,接下來通過本文給大家分享Java實(shí)現(xiàn)導(dǎo)出Excel功能的實(shí)例代碼,感興趣的朋友跟隨小編一起看看吧2021-11-11