26考研——樹與二叉樹_樹與二叉樹的應用(5)

408答疑


文章目錄

  • 三、樹與二叉樹的應用
    • 哈夫曼樹和哈夫曼編碼
      • 哈夫曼樹的定義
        • 概念
        • 帶權路徑長度(WPL)計算
        • 示例分析
      • 哈夫曼樹的構造
        • 算法描述
        • 哈夫曼樹的性質
        • 示例
      • 哈夫曼編碼
        • Huffman樹的編碼規則
          • Huffman樹的構建過程
          • 前綴編碼
            • 前綴編碼的分析及應用
        • Huffman樹的構造及相關的分析
          • 壓縮原理
          • 示例分析
      • 注意事項
    • 并查集(略)
  • 四、參考資料
    • 鮑魚科技課件
    • 26王道考研書


三、樹與二叉樹的應用

哈夫曼樹和哈夫曼編碼

哈夫曼樹的定義

概念
  • 哈夫曼樹是帶權路徑長度(WPL)?最小的二叉樹,又稱最優二叉樹。
  • ?權值:樹中結點被賦予的表示特定意義的數值。
  • ?葉結點的帶權路徑長度:葉結點到根結點的路徑長度與該結點權值的乘積。
  • ?樹的帶權路徑長度(WPL)?:樹中所有葉結點的帶權路徑長度之和,計算公式為:
    W P L = ∑ i = 1 n w i l i WPL = \sum_{i=1}^{n} w_i l_i WPL=i=1n?wi?li?
    其中, w i w_i wi? 為第 i i i 個葉結點的權值, l i l_i li? 為該葉結點到根結點的路徑長度。
帶權路徑長度(WPL)計算
  • 目標:構造 WPL 最小的二叉樹(哈夫曼樹)。
  • ?路徑長度:從根到某結點的路徑上的邊數(層數減1)。
示例分析

以下為三棵含4個葉結點(權值分別為7, 5, 2, 4)的二叉樹及其 WPL 計算:

  • ?二叉樹(1)

    • 葉結點路徑長度均為2
    • W P L = 7 × 2 + 5 × 2 + 2 × 2 + 4 × 2 = 36 WPL = 7 \times 2 + 5 \times 2 + 2 \times 2 + 4 \times 2 = 36 WPL=7×2+5×2+2×2+4×2=36
  • ?二叉樹(2)

    • 葉結點路徑長度分別為2, 3, 3, 1
    • W P L = 4 × 2 + 7 × 3 + 5 × 3 + 2 × 1 = 46 WPL = 4 \times 2 + 7 \times 3 + 5 \times 3 + 2 \times 1 = 46 WPL=4×2+7×3+5×3+2×1=46
  • ?二叉樹(3)(哈夫曼樹)

    • 葉結點路徑長度分別為1, 2, 3, 3
    • W P L = 7 × 1 + 5 × 2 + 2 × 3 + 4 × 3 = 35 WPL = 7 \times 1 + 5 \times 2 + 2 \times 3 + 4 \times 3 = 35 WPL=7×1+5×2+2×3+4×3=35

結論:二叉樹(3)的 WPL 最小,符合哈夫曼樹的定義。

在這里插入圖片描述

哈夫曼樹的構造

算法描述

給定 n n n 個權值分別為 w 1 , w 2 , … , w n w_1, w_2, \ldots, w_n w1?,w2?,,wn? 的結點,構造Huffman樹的算法描述如下:

  1. 將這 n n n 個結點分別作為 n n n 棵僅含一個結點的二叉樹,構成森林 F F F
  2. 構造一個新結點,從 F F F 中選取兩棵根結點權值最小的樹作為新結點的左、右子樹,并且將新結點的權值置為左、右子樹上根結點的權值之和。
  3. F F F 中刪除剛才選出的兩棵樹,同時將新得到的樹加入 F F F 中。
  4. 重復步驟 2 和 3,直至 F F F 中只剩下一棵樹為止。
哈夫曼樹的性質

從上述構造過程中可以看出哈夫曼樹具有如下特點:

  1. 每個初始結點最終都成為葉結點,且權值越小的結點到根結點的路徑長度越大。
  2. 構造過程中共新建了 n ? 1 n-1 n?1 個結點(雙分支結點),因此哈夫曼樹的結點總數為 2 n ? 1 2n-1 2n?1
  3. 每次構造都選擇 2 棵樹作為新結點的孩子,因此哈夫曼樹中不存在度為 1 的結點。
示例

例如,權值 { 7 , 5 , 2 , 4 } \{7, 5, 2, 4\} {7,5,2,4} 的哈夫曼樹的構造過程如下圖所示:

  • (1) 初始狀態,權值分別為 7, 5, 2, 4。
  • (2) 第一次合并,將權值 2 和 4 的結點合并,新結點權值為 6。
  • (3) 第二次合并,將權值 5 和 6 的結點合并,新結點權值為 11。
  • (4) 最終態,最終哈夫曼樹的權值為 18。

通過這個過程,可以驗證下圖(4)樹的帶權路徑長度 (WPL) 最小,因此它恰好為哈夫曼樹。

在這里插入圖片描述

哈夫曼編碼

Huffman樹的編碼規則
  • Huffman樹的左樹編碼為0,右樹編碼為1,則每一個葉子結點將得到唯一的編碼,即為Huffman編碼。
Huffman樹的構建過程
  1. 先以字符串中每個字符出現的次數為權值構建Huffman樹。
  2. 從根結點開始對分支進行編碼,左分支為0,右分支為1。
  3. 所有權值結點都在葉子結點位置,遍歷從根到葉子結點的每條路徑,將獲得對應字符的Huffman編碼。
前綴編碼
  • 若沒有一個編碼是另一個編碼的前綴,則稱這樣的編碼為前綴編碼。
  • 對前綴編碼的解碼很簡單,因為沒有一個編碼是其他編碼的前綴。所以識別出第一個編碼,將它翻譯為原字符,再對剩余的碼串執行同樣的解碼操作。
  • 例如,碼串 0010110 可被唯一地翻譯為 A, A, B 和 C。另舉反例:若再將字符 D 的編碼設計為 11,此時 11 是 110 的前綴,則上述碼串的后三位就無法唯一翻譯。
前綴編碼的分析及應用
  • Huffman編碼可以利用二叉樹來設計二進制前綴編碼。假設為 A, B, C, D 四個字符設計前綴編碼,可以用下圖所示的二叉樹來表示,4 個葉結點分別表示 4 個字符,且約定左分支表示 0,右分支表示 1,從根到葉結點的路徑上用分支標記組成的序列作為該葉結點字符的編碼,可以證明如此得到的必為前綴編碼。由下圖得到字符 A, B, C, D 的前綴編碼分別為 0, 10, 110, 111。

在這里插入圖片描述

Huffman樹的構造及相關的分析
壓縮原理
  • 在未壓縮之前一個字符占一個字節,現在對字符進行二進制編碼之后,一個字節8個比特位列現在可以表示多個字符,所以說一次壓縮,就會節省很多字節,也就起到了壓縮的作用。
  • Huffman編碼是一種非常有效的數據壓縮編碼。由Huffman樹得到Huffman編碼是很自然的過程。首先,將每個字符當作一個獨立的結點,其權值為它出現的頻度(或次數),構造出對應的Huffman樹。然后,將從根到葉結點的路徑上分支標記的字符串作為該字符的編碼。
示例分析
  • 例如,下圖所示為一個由Huffman樹構造Huffman編碼的示例,矩形方塊表示字符及其出現的次數。這棵哈夫曼樹的 WPL 為 W P L = 1 × 45 + 3 × ( 13 + 12 + 16 ) + 4 × ( 5 + 9 ) = 224 WPL = 1 \times 45 + 3 \times (13 + 12 + 16) + 4 \times (5 + 9) = 224 WPL=1×45+3×(13+12+16)+4×(5+9)=224。此處的 WPL 可視為最終編碼得到二進制編碼的長度,共 224 位。若采用 3 位固定長度編碼,則得到的二進制編碼長度為 300 位,因此 Huffman編碼共壓縮了 25% 的數據。利用 Huffman樹可以設計出總長度最短的二進制前綴編碼。

在這里插入圖片描述

注意事項

  • 左分支和右分支究竟是表示 0 還是表示 1 沒有明確規定,因此構造出的哈夫曼樹并不唯一,但各哈夫曼樹的帶權路徑長度 WPL 相同且為最優。此外,如有若干權值相同的結點,則構造出的哈夫曼樹更可能不同,但 WPL 必然相同且為最優。

并查集(略)

四、參考資料

鮑魚科技課件

b站免費王道課后題講解:
在這里插入圖片描述

網課全程班:
在這里插入圖片描述

26王道考研書

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

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

相關文章

【VUE】day06 動態組件 插槽 自定義指令 ESlint

【VUE】day06 動態組件 & 插槽 & 自定義指令 1. 動態組件1.1 通過不同的按鈕展示不同的組件1.1.1回顧click 1.2 keep-alive的使用1.3 keep-alive對應的生命周期函數1.3.1 keep-alive的include屬性1.3.2 exclude 1.4 組件注冊名稱和組件聲明時name的區別1.4.1 組件聲明時…

nodejs-原型污染鏈

還是老規矩,邊寫邊學,先分享兩篇文章 深入理解 JavaScript Prototype 污染攻擊 | 離別歌 《JavaScript百煉成仙》 全書知識點整理-CSDN博客 Ctfshow web入門 nodejs篇 web334-web344_web334 ctfshow-CSDN博客 334-js審計 var express require(expr…

Oracle 數據庫通過exp/imp工具遷移指定數據表

項目需求:從prod數據庫遷移和復制2個表(BANK_STATE,HBS)的數據到uat數據庫環境。 數據庫版本:Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 遷移工具:客戶端exp/imp工具 -- 執行命令 從Prod數據庫導出數據exp us…

企業級基于SpringBoot的MQTT的構建和使用

基于SpringBoot的MQTT配置及使用 首先要使用EMQX搭建一個MQTT服務器&#xff0c;參考文檔&#xff1a;EMQX快速開始 本著開源分享的觀點&#xff0c;閑話不多說&#xff0c;直接上代碼 導入Maven <dependency><groupId>org.springframework.integration</gro…

26考研——圖_圖的代碼實操(6)

408答疑 文章目錄 五、圖的代碼實操圖的存儲鄰接矩陣結構定義初始化插入頂點獲取頂點位置在頂點 v1 和 v2 之間插入邊獲取第一個鄰接頂點獲取下一個鄰接頂點顯示圖 鄰接表結構定義初始化圖插入頂點獲取頂點位置在頂點 v1 和 v2 之間插入邊獲取第一個鄰接頂點獲取下一個鄰接頂點…

開源webmail郵箱客戶端rainloop的分支版本SnappyMail 設置發件人允許多重身份

RainLoop已多年未更新&#xff0c;SnappyMail 是 RainLoop 的分支&#xff0c;由社區維護。SnappyMail 不僅修復了漏洞&#xff0c;還增加了更多功能和優化。對 IMAP 支持更好&#xff0c;移動端體驗也比 RainLoop 更細致。 安裝過程和設置跟RainLoop一樣&#xff1a; 以寶塔面…

海量數據場景題--查找兩個大文件的URL

查找兩個大文件共同的URL 給定 a、b 兩個文件&#xff0c;各存放 50 億個 URL&#xff0c;每個 URL 各占 64B&#xff0c;找出 a、b 兩個文件共同的 URL。內存限制是 4G。 操作邏輯&#xff1a; 使用哈希函數 hash(URL) % 1000? 將每個URL映射到0-999的編號 文件A切割為a0, a1…

簡單ELK框架搭建

簡介 ELK 框架是一套開源的日志管理和分析工具&#xff0c;由 Elasticsearch、Logstash 和 Kibana 三個主要組件組成&#xff0c;現在新增了Filebeat組件&#xff0c;可以更高效的收集數據。 Elasticsearch&#xff1a;是一個分布式、高可擴展的開源搜索引擎&#xff0c;能快速…

VS Code 中 .history`文件的來源與 .gitignore`的正確使用

引言 在使用 VS Code 進行 Git 版本控制時&#xff0c;有時會發現項目中多出一個 .history 目錄&#xff0c;并被 Git 識別為未跟蹤文件。本文將解釋 .history 的來源&#xff0c;并提供 .gitignore 的正確配置方法&#xff0c;確保開發環境的整潔性。 1. .history 文件的來源…

網絡之數據鏈路層

數據鏈路層 數據鏈路層目標 TCP/IP提供了一種能力, 將數據可靠的從 B 跨網絡送到 C 主機, 這期間是由無數次局域網轉發構成的, 比如 主機B 到 路由器F 就是一次局域網通信的問題, 而數據鏈路層就是研究數據是如何在局域網內部轉發的. 也就是說, 應用層是進行數據的處理, 傳輸…

A Brief History: from GPT-1 to GPT-3

This is my reading notes of 《Developing Apps with GPT-4 and ChatGPT》. In this section, we will introduce the evolution of the OpenAI GPT medels from GPT-1 to GPT-4. GPT-1 In mid-2018, OpenAI published a paper titled “Improving Language Understanding …

基于大數據的各品牌手機銷量數據可視化分析系統(源碼+lw+部署文檔+講解),源碼可白嫖!

摘要 時代在飛速進步&#xff0c;每個行業都在努力發展現在先進技術&#xff0c;通過這些先進的技術來提高自己的水平和優勢&#xff0c;各品牌手機銷量數據可視化分析系統當然不能排除在外。基于大數據的各品牌手機銷量數據可視化分析系統是在實際應用和軟件工程的開發原理之…

人工智能-群暉Docker部署DB-GPT

人工智能-群暉Docker部署DB-GPT 0 環境及說明1 獲取dbgpt的docker鏡像2 下載向量模型3 下載配置文件4 修改配置文件5 創建dbgpt容器并運行6 訪問dbgpt0 環境及說明 環境項說明DSM版本DSM 7.2.1-69057 update 3Container Manager版本24.0.2-1535當前 hub.docker.com 鏡像倉庫中的…

Netty——TCP 粘包/拆包問題

文章目錄 1. 什么是 粘包/拆包 問題&#xff1f;2. 原因2.1 Nagle 算法2.2 滑動窗口2.3 MSS 限制2.4 粘包的原因2.5 拆包的原因 3. 解決方案3.1 固定長度消息3.2 分隔符標識3.3 長度前綴協議3.3.1 案例一3.3.2 案例二3.3.3 案例三 4. 總結 1. 什么是 粘包/拆包 問題&#xff1f…

JavaScript Fetch API

簡介 fetch() API 是用于發送 HTTP 請求的現代異步方法&#xff0c;它基于 Promise&#xff0c;比傳統的 XMLHttpRequest 更加簡潔、強大 示例 基本語法 fetch(url, options).then(response > response.json()).then(data > console.log(data)).catch(error > con…

UMI-OCR Docker 部署

額外補充 Docker 0.前置條件 部署前&#xff0c;請檢查主機的CPU是否具有AVX指令集 lscpu | grep avx 輸出如下即可繼續部署 Flags: ... avx ... avx2 ... 1.下載dockerfile wget https://raw.githubusercontent.com/hiroi-sora/Umi-OCR_runtime_linux/main/Do…

C++ --- 二叉搜索樹

1 二叉搜索樹的概念 ?叉搜索樹?稱?叉排序樹&#xff0c;它或者是?棵空樹&#xff0c;或者是具有以下性質的?叉樹: 1 若它的左?樹不為空&#xff0c;則左?樹上所有結點的值都?于等于根結點的值 2 若它的右?樹不為空&#xff0c;則右?樹上所有結點的值都?于等于根結點…

跨語言語言模型預訓練

摘要 最近的研究表明&#xff0c;生成式預訓練在英語自然語言理解任務中表現出較高的效率。在本研究中&#xff0c;我們將這一方法擴展到多種語言&#xff0c;并展示跨語言預訓練的有效性。我們提出了兩種學習跨語言語言模型&#xff08;XLM&#xff09;的方法&#xff1a;一種…

文件描述符,它在哪里存的,exec()后還存在嗎

學過計系肯定了解 寄存器、程序計數器、堆棧這些 程序運行需要的資源。 這些是進程地址空間。 而操作系統分配一個進程資源時&#xff0c;分配的是 PCB 進程控制塊。 所以進程控制塊還維護其他資源——程序與外部交互的資源——文件、管道、套接字。 文章目錄 文件描述符進程管…

Slidev使用(一)安裝

文章目錄 1. **安裝位置**2. **使用方式**3. **適用場景**4. **管理和維護** 全局安裝1. **檢查 Node.js 和 npm 是否已安裝**2. **全局安裝 Slidev CLI**3. **驗證安裝是否成功**4. **創建幻燈片文件**5. **啟動 Slidev**6. **實時編輯和預覽**7. **構建和導出&#xff08;可選…