【數據結構】哈夫曼樹和哈夫曼編碼

一、哈夫曼樹

1.1 哈夫曼樹的概念

給定一個序列,將序列中的所有元素作為葉子節點構建一棵二叉樹,并使這棵樹的帶權路徑長度最小,那么我們就得到了一棵哈夫曼樹(又稱最優二叉樹)

接下來是名詞解釋:

  • 權:節點的數值
  • 路徑長度:兩節點間路徑的邊數
  • 帶權路徑長度:節點的權值乘以該節點到根節點的路徑長度即為該節點的帶權路徑長度。哈夫曼樹的帶權路徑長度是樹中所有葉子節點的帶權路徑長度之和。

例如下面這棵哈夫曼樹:

通過觀察我們可以發現,所有父節點的權值都是自身的兩個子節點的權值之和。而為了要使樹的帶權路徑長度最小,我們要盡可能的讓權值小的節點離根節點遠,讓權值大的節點離根節點近

因此,我們引出哈夫曼樹的構造算法。

1.2 哈夫曼樹的構造算法

要將一個序列構造成一棵哈夫曼樹,我們首先需要對其進行升序排序

將排序好后的序列中的每個值看作一棵只有一個節點的樹,從中選出根節點權值最小的兩棵樹作為新樹的左右子樹,并將這兩棵樹從序列中刪除,而新樹的根節點的權值是這兩棵樹根節點的權值之和

哈夫曼樹沒有規定左右子樹的順序,因此下面的例子中將10和18的位置對調也是正確的

將新樹的根節點的權值放入序列中并重新進行升序排序,重復上述步驟

至此,就構建了一棵哈夫曼樹

因為哈夫曼樹沒有規定左右子樹的順序,因此一個序列可以構建出不同的哈夫曼樹

二、哈夫曼編碼

2.1 等長編碼

假設我們要對一個字符串ABAACDC進行二進制編碼

我們可以按順序給每個字符設置一個編碼,A為0,B為1,C為10,D為11

那么就可以將上面的字符串轉化為0100101110

但是在解碼的時候我們會發現,這一串二進制序列可以解碼為ACACDBA、ACABABDA等字符串,出現了歧義。

這是因為我們在對字符進行編碼的時候,出現了一個字符是另一個字符的前綴的情況,例如D可以用兩個B來表示。

為了避免歧義,我們可以采用等長編碼的方案,就是每個字符的編碼都一樣長,例如A為00,B為01,C為10,D為11,這樣就不會產生歧義了。

但是這種方案并不是一個最短的方案。

2.2 哈夫曼編碼

統計字符出現的次數,把字符定義成一個節點,節點的權值就是它出現的次數。

例如上面A出現了3次,B出現了1次,C出現了2次,D出現了1次

哈夫曼編碼的核心思想就是讓出現次數越多的字符編出來的碼越短,我們將全部節點構建成一棵哈夫曼樹,出現次數越少的字符對應的節點就越靠近樹的底層,編碼也就越長,出現次數越多的字符編碼就越短。

對二叉樹的邊標號,向左的邊標為0,向右的邊標為1,至此所有字符的編碼就是從根節點到該字符節點路徑上經過的標號,例如A為1,B為010,C為00,D為011,這種編碼方案就叫做哈夫曼編碼。

構建哈夫曼樹的時候,所有的字符節點都是葉子節點,不會出現一個字符出現在另一個字符的路徑上,也就不會出現一個字符是另一個字符的前綴這種造成歧義的情況

哈夫曼樹的編碼不是唯一的,節點放置的左右也會造成字符編碼的不同,但是生成的編碼長度一定都是一樣的。

完.

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

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

相關文章

VC++位移操作>>和<<以及邏輯驅動器插拔產生的掩碼dbv.dbcv_unitmask進行分析的相關代碼

VC位移操作>>和<<以及邏輯驅動器插拔產生的掩碼dbv.dbcv_unitmask進行分析的相關代碼 一、VC位移操作符<<和>>1、右位移操作符 >>&#xff1a;2、左位移操作符 <<&#xff1a; 二、邏輯驅動器插拔產生的掩碼 dbv.dbcv_unitmask 進行分析的…

如何使用Suno:免費的AI歌曲生成器

文章目錄 Suno AI 是什么&#xff1f;Suno AI 如何工作&#xff1f;選擇Suno AI的理由&#xff1a;核心優勢易于操作多樣化創作靈活的定價策略版權保障技術突破 如何使用Suno AI創作歌曲&#xff1f;第1步&#xff1a;注冊Suno AI賬戶第2步&#xff1a;輸入提示詞創建第 3 步&a…

作業-day-240522

思維導圖 使用IO多路復用實現并發 select實現TCP服務器端 #include <myhead.h>#define SER_IP "192.168.125.112" #define SER_PORT 8888int main(int argc, const char *argv[]) {int sfdsocket(AF_INET,SOCK_STREAM,0);if(sfd -1){perror("socket er…

脆皮之“字符函數與字符串函數”寶典

hello&#xff0c;大家好呀&#xff0c;感覺我之前有偷偷摸魚了&#xff0c;今天又開始學習啦。加油&#xff01;&#xff01;&#xff01; 文章目錄 1. 字符分類函數2. 字符轉換函數3. strlen的使用和模擬實現3.1 strlen 的使用3.1 strlen 的模擬1.計算器方法2.指針-指針的方…

Python的shutil模塊探索,文件操作的瑞士軍刀

hello&#xff0c;大家好&#xff0c;我是一點&#xff0c;專注于Python編程&#xff0c;如果你也對感Python感興趣&#xff0c;歡迎關注交流。 希望可以持續更新一些有意思的文章&#xff0c;如果覺得還不錯&#xff0c;歡迎點贊關注&#xff0c;有啥想說的&#xff0c;可以留…

每周刷題第三期

個人主頁&#xff1a;星紜-CSDN博客 系列文章專欄&#xff1a;Python 踏上取經路&#xff0c;比抵達靈山更重要&#xff01;一起努力一起進步&#xff01; 目錄 題目一&#xff1a;環形鏈表 題目二&#xff1a;刪除有序數組中的重復項 題目三&#xff1a;有效的括號 題…

從左上角到右下角的最小距離和

題目描述&#xff1a;給定一個二維數組matrix&#xff0c;一個人必須從左上角出發&#xff0c;最后到達右下角&#xff0c;沿途只可以向下或者向右走&#xff0c;沿途的數字都累加就是距離累加和&#xff0c;返回最小距離累加和。 way&#xff1a;無他&#xff0c;dp[i] [j]表…

《隊列》

描述 學校體操隊到操場集合&#xff0c;排成每行2人&#xff0c;最后多出1人;排成每行3人&#xff0c;也多出1人。分別排成每行4、5、6人&#xff0c;都多出1人。當排成每行7人時&#xff0c;正好不多,求校體操隊至少多少人。 輸入描述 無 輸出描述 滿足要求的人數 樣例輸入…

Python語法學習之 - 生成器表達式(Generator Expression)

第一次見這樣的語法 本人之前一直是Java工程師&#xff0c;最近接觸了一個Python項目&#xff0c;第一次看到如下的代碼&#xff1a; i sum(letter in target_arr for letter in source_arr)這條語句是計算source 與 target 數組中有幾個單詞是相同的。 當我第一眼看到這樣…

shell遍歷路徑所有文件并把列表寫成字符串遍歷

1. ls dir/* | tr ‘\n’ ’ ’ 換行替換成空格 你可以使用 ls 命令和 tr 命令來將文件列表根據空格拼接起來成一個字符串。以下是一個示例&#xff1a; ls dir/* | tr \n 解釋 ls dir/*&#xff1a;列出 dir 目錄下的所有文件。tr \n &#xff1a;將所有的換行符&#xf…

ChatGPT生成常見面試題【面試準備】

ChatGPT生成常見面試題【面試準備】 前言版權ChatGPT生成常見面試題【面試準備】MySQL面試問題與回答1. 數據庫連接與操作2. 索引和查詢優化3. 事務管理4. 索引是什么&#xff1f;為什么使用索引可以提高查詢性能&#xff1f;如何在MySQL中創建索引&#xff1f;5. SQL查詢優化有…

Varjo XR-4功能詳解:由凝視驅動的XR自動對焦相機系統

Varjo是XR市場中擁有領先技術的虛擬現實設備供應商&#xff0c;其將可變焦距攝像機直通系統帶入到虛擬和混合現實場景中。在本篇文章中&#xff0c;Varjo的技術工程師維爾蒂莫寧詳細介紹了這項在Varjo XR-4焦點版中投入應用的技術。 對可變焦距光學系統的需求 目前所有其他XR頭…

WPF之容器標簽之Canvas布局標簽

Canvas: 定義一個區域&#xff0c;可在其中使用相對于 Canvas 區域的坐標以顯式方式來定位子元素。 實例 可以在子標簽使用Canvas屬性設置定位 <Canvas Width"500" Height"300"><StackPanel Width"100" Height"100"Backgro…

網頁抓取之requests庫的使用

Python網絡數據采集利器 - Requests庫的使用指南 簡介 在Python網絡爬蟲領域,優秀的第三方庫Requests可謂是必學的重要工具。它提供了相當人性化的API,讓我們能夠用極其簡潔的代碼發送HTTP/HTTPS請求,并且自動處理cookies、headers、編碼等諸多繁瑣細節,大大減輕了網頁抓取的…

【pdb的使用方法】

提示&#xff1a;文章寫完后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 文章目錄 一、 pdb 是什么&#xff1f;二、基本用法1.啟動 PDB 調試器&#xff1a;2.單步執行代碼&#xff1a;3.查看變量值&#xff1a;4.退出調試器&#xff1a; 三、高級用…

指數分布的理解,推導與應用

指數分布的定義 在浙大版的教材中&#xff0c;指數分布的定義如下&#xff1a; 若連續型的隨機變量 X X X的概率密度為&#xff1a; f ( x ) { 1 θ e ? x θ , x>0 0 , 其他 f(x) \begin{cases} \frac{1}{\theta} e^{-\frac{x}{\theta}}, & \text{x>0}\\ 0, &a…

mvn編譯所有單元測試報錯OOM

org.mockito.exceptions.base.MockitoException: Cannot instantiate InjectMocks field named ‘productLogic’ of type ‘class .ProductLogic’. You haven’t provided the instance at field declaration so I tried to construct the instance. However the constructo…

Python正則表達式與Excel文件名批量匹配技術文章

目錄 引言 正則表達式基礎 Python中的re模塊 Excel文件名批量匹配案例 常見問題與解決方案 結論 引言 在現代辦公環境中&#xff0c;Excel文件幾乎成為了數據分析和處理的標配工具。由于Excel文件可能包含大量的數據和信息&#xff0c;因此&#xff0c;對Excel文件的命名…

在aspNetCore中 使用System.Text.Json的定制功能, 將定制化的json返回給前端

C# 默認大寫, 而大部分的前端默認小寫, 這時候可以如此配置: builder.Services.AddControllers().AddJsonOptions((opt) > {opt.JsonSerializerOptions.PropertyNamingPolicy System.Text.Json.JsonNamingPolicy.CamelCase;opt.JsonSerializerOptions.WriteIndented true…