哈夫曼編碼以其高壓縮比和壓縮性能方面的優勢一直在通信、數據壓縮等領域佔有重要的位置。
要實現哈夫曼編碼必須先構造一棵哈夫曼樹,下面就通過java進行簡單的實現,通過圖形化的方式展現生成哈夫曼樹的全過程。
import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.geom.Ellipse2D; import java.awt.geom.Line2D; import java.util.ArrayList; import java.util.Collections; import java.util.List; import javax.swing.JFrame; import javax.swing.JPanel; public class HalfmanTree { private List<Node> collections = new ArrayList<Node>(); static private boolean stop = true; public Node getRoot(){ return collections.get(0); } public void add(int frequence){ collections.add(new Node(frequence)); } public void buildHalfmanTree(HMPanel p) throws InterruptedException{ while(collections.size() > 1){ Collections.sort(collections); //可以換更快速的排序方式 Node m1 = collections.remove(0); //獲取最小的兩個元素 Node m2 = collections.remove(0); Node n = new Node(m1.getFrequnce() + m2.getFrequnce()); System.out.println(m1.frequnce + "+"+ m2.frequnce + "=>"+ n.frequnce); n.setLeft(m1); n.setRight(m2); m1.setParent(n); m2.setParent(n); collections.add(n); p.setRoot(n); p.repaint(); while(stop) Thread.sleep(1000); stop = true; } } class Node implements Comparable<Node>{ int frequnce; Node left,right,parent; public Node(int frequnce) { super(); this.frequnce = frequnce; } public Node getLeft() { return left; } public void setLeft(Node left) { this.left = left; } public Node getRight() { return right; } public void setRight(Node right) { this.right = right; } public Node getParent() { return parent; } public void setParent(Node parent) { this.parent = parent; } public int getFrequnce() { return frequnce; } @Override public int compareTo(Node o) { // TODO Auto-generated method stub return frequnce - o.frequnce; } private float x,y; public void Paint(Graphics2D g,float x,float y){ g.draw(new Ellipse2D.Double(x,y,15,15)); g.drawString(""+frequnce, x, y); this.x = x; this.y = y ; if(parent != null){ g.draw(new Line2D.Float(x,y,parent.x, parent.y)); } if(left !=null ){ left.Paint(g, x - 50, y + 30); } if(left !=null ){ right.Paint(g, x + 50, y + 30); } } } /** * @param args * @throws InterruptedException */ public static void main(String[] args) throws InterruptedException { HalfmanTree t = new HalfmanTree(); int[] nodes={ 2,5,6,7,8,9,20,40,18,13,54}; for(int n:nodes){ t.add(n); } JFrame jframe = new JFrame(); jframe.setBounds(100, 100, 800, 600); HMPanel p = new HMPanel(); jframe.add(p); jframe.setVisible(true); t.buildHalfmanTree(p); } static class HMPanel extends JPanel{ private Node root; private int startX = 400 ,startY =10; public HMPanel(){ addMouseListener(new MouseAdapter(){ @Override public void mouseClicked(MouseEvent e) { stop = false; } }); } @Override public void paint(Graphics g) { super.paint(g); if(root !=null) root.Paint((Graphics2D)g, startX, startY); } @Override public void update(Graphics g) { paint(g); } public void setRoot(Node root){ this.root = root; } } }
前端面試題 - null是原始類型,但爲什麼typeof null的結果是object? 造成這個結果的原因是null的內存地址是以000開頭,而js會將000開頭的內存地址視爲object。 通過isNull()來判斷一個值是不是null
DHTMLX Suite UI 組件庫允許您更快地構建跨平臺、跨瀏覽器 Web 和移動應用程序。它包括一組豐富的即用式 HTML5 組件,這些組件可以輕鬆組合到單個應用程序界面中。 DHTMLX Gantt是用於跨瀏覽器和跨平臺應用程序的功
本文分享自華爲雲社區《GaussDB(DWS)向量化執行引擎詳解》,作者: yd_212508532。 前言 適用版本:【基線功能】 傳統的行執行引擎大多采用一次一元組的執行模式,這樣在執行過程中CPU大部分時間並沒有用來處理數據,更
SpringBoot如何優雅的進行參數校驗 一.爲什麼要進行參數校驗 在日常的開發過程中,我們常常需要對傳入的參數進行校驗,比如在web前後端分離項目中,參數校驗有兩個方面: 前端進行參數校驗 後端進行參數校驗 那這兩種
結構特點 List 和 Set 是存儲單列數據的集合,Map 是存儲鍵和值這樣的雙列數據的集合;List 中存儲的數據是有順序,並且允許重複;Map 中存儲的數據是沒有順序的,其鍵是不能重複的,它的值是可以有重複的,Set 中存儲的數據
好不容易寫好了一篇博客,現在想要把它發佈到各個平臺上供大家一起欣賞? 然後一個網站一個網站打開要發佈的博客站點,手動點創建文章,然後拷貝粘貼寫的markdown文件。 甚至有些網站還不支持markdown格式,你還需要對格式進行轉換。 每次
隨着大數據技術的快速發展,很多企業開始將Flink引入到生產環境中,以滿足日益複雜的數據處理需求。而作爲一款企業級的數據調度平臺,Apache DolphinScheduler也跟上了時代步伐,推出了對Flink任務類型的支持。 Flink
HarmonyOS實戰課程“2024鴻蒙零基礎快速實戰-仿抖音App開發(ArkTS版)”已經於今日上線至慕課網(https://coding.imooc.com/class/843.html),有致力於鴻蒙生態開發的同學們可以關注一下。
前端面試題 - 說一下原型和原型鏈? JavaScript 中,萬物皆對象,對象分爲普通對象和函數對象。 所有的函數都是函數對象(typeof f === 'function'),其他都是普通對象(typeof o === 'object'
protected function getNode(){ //$CONTROLLER_NAME = $this->_CI->router->fetch_class(); //$ACTION_NAME = $this->_
前言:授人以魚不如授人以漁.先學會用,在學原理,在學創造,可能一輩子用不到這種能力,但是不能不具備這種能力。這篇文章主要是介紹算法入門Helloword之手寫圖片識別模型java中如何實現以及部分解釋。目前大家對於人工智能-機器學習-神經網
在SqlSugar開發框架的WPF應用中,有時候需要在按鈕或者其他界面元素上使用一些圖標,框架中我們可以使用 lepoco/wpfui 項目的圖標庫,也可以使用Font-Awesome-WPF 圖標庫,另外如果喜歡阿里矢量圖標庫的,也可以通
前端面試題 - NodeJS能用ES6模塊嗎?CommonJS 和 ES6模塊的區別是什麼? JS能寫前端web,也能寫NodeJS。 Node.js 後端應用由模塊組成,其模塊系統採用 CommonJS 規範,它並不是 JavaScri
Xmake 是一個基於 Lua 的輕量級跨平臺構建工具。 它非常的輕量,沒有任何依賴,因爲它內置了 Lua 運行時。 它使用 xmake.lua 維護項目構建,相比 makefile/CMakeLists.txt,配置語法更加簡潔直觀,
現狀分析: 首屏速度是用戶體驗的最關鍵一環,而首屏速度最大的決定性因素就是資源的加載速度,資源加載速度等於資源大小 + 網速,老的前端項目隨着不斷增長,代碼可能會變得混亂,冗餘難以理解,不斷的做加法,久而久之,前端性能上就會受到影響,