數據結構:哈夫曼樹

1.概念

哈夫曼樹(Huffman Tree)是一種用于數據壓縮的二叉樹,由大衛·哈夫曼(David A. Huffman)于1952年提出。它通過構建最優二叉樹來實現數據的高效壓縮,廣泛應用于文件壓縮、圖像壓縮等領域。

哈夫曼樹的核心思想

哈夫曼樹的核心思想是用較短的編碼表示出現頻率較高的字符,用較長的編碼表示出現頻率較低的字符,從而減少整體的編碼長度。

2.構建哈夫曼樹的步驟

  1. 統計字符頻率

    • 統計待壓縮數據中每個字符出現的頻率。

  2. 創建節點

    • 為每個字符創建一個節點,節點的權重為字符的頻率。

  3. 構建優先隊列

    • 將所有節點放入一個優先隊列(最小堆),按權重從小到大排序。

  4. 合并節點

    • 從優先隊列中取出權重最小的兩個節點,合并成一個新節點,新節點的權重為這兩個節點的權重之和。

    • 將新節點放回優先隊列。

  5. 重復合并

    • 重復上述步驟,直到優先隊列中只剩一個節點,這個節點就是哈夫曼樹的根節點。

  6. 生成編碼

    • 從根節點開始,向左子樹走標記為0,向右子樹走標記為1,直到葉子節點,得到每個字符的哈夫曼編碼。

3.哈夫曼樹的特點

  • 最優前綴編碼:哈夫曼編碼是一種前綴編碼,沒有任何一個編碼是另一個編碼的前綴。

  • 最小加權路徑長度:哈夫曼樹的帶權路徑長度(WPL)最小,即壓縮效率最高。

示例

假設有以下字符及其頻率:

  • A: 5

  • B: 9

  • C: 12

  • D: 13

  • E: 16

  • F: 45

構建哈夫曼樹的過程:

  1. 將所有字符節點放入優先隊列。

  2. 取出A(5)和B(9),合并為新節點(14),放回隊列。

  3. 取出C(12)和D(13),合并為新節點(25),放回隊列。

  4. 取出E(16)和新節點(14),合并為新節點(30),放回隊列。

  5. 取出新節點(25)和F(45),合并為新節點(70),放回隊列。

  6. 取出新節點(30)和新節點(70),合并為根節點(100)。

根據哈夫曼樹的構建規則和正確的路徑長度過程:

        (100)/     \(30)    (70)/   \    /   \
(14)  E(16) (25) F(45)/  \      /  \
A(5) B(9) C(12) D(13)

? 路徑長度:

  1. A:根 → 30 → 14 → A,路徑長度?3

  2. B:根 → 30 → 14 → B,路徑長度?3

  3. C:根 → 70 → 25 → C,路徑長度 3

  4. D:根 → 70 → 25 → D,路徑長度 3

  5. E:根 → 30 → E,路徑長度?2

  6. F:根 → 70 → F,路徑長度?2


計算 WPL

字符權重(頻率)路徑長度權重 × 路徑長度
A535×3=15
B939×3=27
C12312×3=36
D13313×3=39
E16216×2=32
F45245×2=90

WPL 總和

15+27+36+39+32+90=239

總結

路徑長度是哈夫曼樹中一個重要的概念,它直接決定了每個字符的編碼長度。通過最小化帶權路徑長度(WPL),哈夫曼樹能夠實現數據的高效壓縮。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/895544.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/895544.shtml
英文地址,請注明出處:http://en.pswp.cn/news/895544.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

UE5.2后 Bake Out Materials失效

這個問題出現在5.3,5.4,5.5沒有測試 烘焙貼圖后會找不到貼圖位置, 這個是5.2的正常狀態 默認是生成在模型當前目錄里,包括新的材質 但是這個bug會讓材質和貼圖都消失,無法定位 暫時沒有辦法解決,等官方 …

ADC 的音頻實驗,無線收發模塊( nRF24L01)

nRF24L01 采用 QFN20 封裝,有 20 個引腳,以下是各引腳的詳細介紹: 1. 電源引腳 ? VDD:電源輸入端,一般接 3V 電源,為芯片提供工作電壓,供電電壓范圍為 1.9V~3.6V。 ? VSS&#xf…

基于HTML5 Canvas 和 JavaScript 實現的煙花動畫效果

以下是一個使用 HTML5 Canvas 和 JavaScript 實現的煙花動畫效果代碼盒子: <!DOCTYPE html> <html> <head><title>煙花效果

C++課程設計 運動會分數統計(含源碼)

C++課程設計 運動會分數統計 一、題目描述(一)問題描述(二)基本要求二、程序設計文檔1. 項目概述1.1 項目背景1.2 功能需求1.3 非功能需求2. 系統設計2.1 數據結構設計2.1.1 `School` 結構體2.1.2 `Project` 結構體2.2 功能模塊設計2.2.1 主菜單2.2.2 輸入/修改項目成績2.2…

【音視頻】RTSP拉流: RTP負載AAC詳解(三)

此文為系列文章&#xff0c;此系列主要講解RTSP客戶端的拉流及播放&#xff0c;文章持續更新&#xff0c;會從rtsp的基本協議講起&#xff0c;如何一步步實現音視頻的拉流過程&#xff0c;包括一系列涉及到的協議&#xff0c;rtsp&#xff0c;sdp&#xff0c; rtp&#xff08;本…

Dockerfiles 的 Top 10 常見 DevOps/SRE 面試問題及答案

1. RUN 和 CMD 之間有什么區別&#xff1f; RUN : 在鏡像構建過程中執行命令&#xff0c;創建一個新的層。通常用于安裝軟件包。 示例: RUN apt-get update && apt-get install -y curlCMD : 指定容器啟動時默認運行的命令。它在運行時執行&#xff0c;而不是在構建過程…

【ARM】JTAG接口介紹

1、 文檔目標 對 JTAG 接口有更多的認識&#xff0c;在遇到關于 JTAG 接口問題時有一些排查的思路。 2、 問題場景 在使用調試器過程時&#xff0c;免不了要接觸到 JTAG 接口&#xff0c;當出現連接不上時&#xff0c;就不知道從哪來進行排查。 3、軟硬件環境 1 軟件版本&am…

opencascade 獲取edge起始點 會出現終點與實際不同的情況

在使用 OpenCASCADE 獲取 TopoDS_Edge 的起始點和終點時&#xff0c;可能會出現終點與實際不一致的情況。這通常是由于以下原因導致的&#xff1a; 幾何曲線的方向問題&#xff1a;在某些情況下&#xff0c;幾何曲線的方向可能與拓撲邊的方向不一致&#xff0c;導致通過幾何曲線…

【電腦】u盤重裝win7

u盤必須8GB以上 1. CPU型號 首先查看CPU的型號看看到底能不能裝win7 2. 下載光盤映像文件 網址 看電腦是多少位的機器(32位下載x86 64位下載x64) 一共是這么多個版本按需下載對應的版本 電腦小白推薦無腦下載旗艦版 將鏈接復制到迅雷進行下載 3. 下載軟碟通 網址 下…

C++-AVL樹

一、AVL樹的概念 1.二叉搜索樹 二叉搜索樹&#xff08;BST&#xff0c;Binary Search Tree&#xff09;&#xff0c;也稱二叉排序樹或二叉查找樹。 二叉搜索樹&#xff1a;一棵二叉樹&#xff0c;可以為空&#xff1b;如果不為空&#xff0c;滿足以下性質&#xff1a; 非空左子…

【網絡安全 | 漏洞挖掘】后端接受非預期參數的故事

未經許可,不得轉載。 文章目錄 正文正文 在對某項目進行測試時,我遵循了一套系統化的方法論,以確保全面理解其安全性。 首先,我創建了一個賬戶,并從用戶的角度探索主域及其各項功能。此階段,我避免使用 Burp Suite 或其他工具,而是嘗試真正理解該應用的設計邏輯與交互…

01.01、判定字符是否唯一

01.01、[簡單] 判定字符是否唯一 1、題目描述 實現一個算法&#xff0c;確定一個字符串 s 的所有字符是否全都不同。 在這一題中&#xff0c;我們的任務是判斷一個字符串 s 中的所有字符是否全都不同。我們將討論兩種不同的方法來解決這個問題&#xff0c;并詳細解釋每種方法…

w208基于spring boot物流管理系統設計與實現

&#x1f64a;作者簡介&#xff1a;多年一線開發工作經驗&#xff0c;原創團隊&#xff0c;分享技術代碼幫助學生學習&#xff0c;獨立完成自己的網站項目。 代碼可以查看文章末尾??聯系方式獲取&#xff0c;記得注明來意哦~&#x1f339;贈送計算機畢業設計600個選題excel文…

《剛剛問世》系列初窺篇-Java+Playwright自動化測試-22- 操作鼠標拖拽 - 下篇(詳細教程)

1.簡介 上一篇中&#xff0c;宏哥說的宏哥在最后提到網站的反爬蟲機制&#xff0c;那么宏哥在自己本地做一個網頁&#xff0c;沒有那個反爬蟲的機制&#xff0c;谷歌瀏覽器是不是就可以驗證成功了&#xff0c;宏哥就想驗證一下自己想法&#xff0c;其次有人私信宏哥說是有那種…

神經網絡常見激活函數 8-SELU函數

SELU 縮放指數線性單元&#xff1a;SELU&#xff08;Scaled Exponential Linear Unit&#xff09; 函數導函數 SELU函數 S E L U ( x ) { λ x x > 0 λ α ( e x ? 1 ) x ≤ 0 \rm SELU(x) \left\{ \begin{array}{} \lambda x \quad & x > 0 \\ \lambda \alph…

【Elasticsearch】多字段查詢方式匯總

在 Elasticsearch 中&#xff0c;實現多字段查詢的常見方式有以下幾種&#xff0c;每種方式適用于不同的場景&#xff1a; --- ### 1. **multi_match 查詢** - **用途**&#xff1a;在多個字段中執行同一查詢&#xff0c;支持多種匹配策略。 - **關鍵參數**&#xff1a…

多線之旅:wait 與 notify

今天小編繼續來分享下多線程中的一些內容。 在多線程環境下&#xff0c;由于線程調度的不確定性&#xff0c;所以我們有時候無法很好的去保證其線程的執行順序。 但是呢&#xff0c;我們又要實現這個順序執行&#xff0c;所以我們可以使用到這兩個方法&#xff0c;wait 和 no…

批量修改mysql字符串字段子字符串

替換子字符串 使用 REPLACE 函數替換字段中的特定子字符串。 示例&#xff1a; 將 table_name 表中 column_name 字段的所有 old_value 替換為 new_value。 UPDATE table_name SET column_name REPLACE(column_name, old_value, new_value) WHERE column_name LIKE %old_val…

達夢:AWR 生成

目錄標題 AWR 性能診斷與報告生成1. 檢查 AWR 系統狀態2. 查看數據庫中的所有表空間3. 查看現有的 AWR 快照4. 設置 AWR 快照的時間間隔5. 創建 AWR 快照6. 查看最新的 AWR 快照7. 生成 AWR HTML 報告8. 將 AWR 報告保存到指定文件鏈接總結 自動工作集負載信息庫 AWR 報告解析指…

股票數據接口API實例代碼python、JAVA等多種語言演示免費獲取實時數據、歷史數據、CDMA、KDJ等指標數據配有API說明文檔

? 本文中所有接口均可直接在瀏覽器打開獲取數據&#xff0c;為了便于大家驗證有效性&#xff0c;已經做好了超鏈接&#xff0c;直接點擊即可&#xff01; 滬深兩市股票列表 API接口鏈接&#xff08;可點擊驗證&#xff09;&#xff1a;https://api.mairui.club/hslt/list/b…