1. 程式人生 > >郝夫曼(Huffman)樹及其應用

郝夫曼(Huffman)樹及其應用

1. 基本概念

路徑長度:樹中一個結點到另一個結點路徑上的分支數目。
樹的路徑長度:從樹根到每一結點的路徑長度之和。
帶權路徑長度:結點到樹根之間的路徑長度與結點上權的乘積。
樹的帶權路徑長度(WPL):樹中所有葉子結點的帶權路徑長度之和。
郝夫曼樹(最優二叉樹):對於一棵有n個葉子結點的二叉樹,帶權路徑長度最小的二叉樹。
這裡寫圖片描述
第一棵樹 WPL=7*2+5*2+2*2+4*2=36
第二棵樹 WPL=7*3+5*3+2*1+4*2=46
第三棵樹 WPL=7*1+5*2+2*3+4*3=35
上述二叉樹中,第三棵樹帶權路徑長度最小,可以驗證,第三棵樹恰為郝夫曼樹。

2.郝夫曼樹的構造方法

假如現有4個權值,分別為a=7, b=5, c=2, d=4
1. 先把有權值的葉子結點按照權值從小到大排列成一個有序序列。即c, d, b, a。
2. 取頭兩個最小的權值的結點作為一個新節點N1的兩個子節點,其中權值較小的為左孩子,權值較大的為右孩子,新節點的權值為兩孩子結點的權值之和,即N1=c+d=2+4=6。
3. 用N1替換c和d,插入有序序列中,保持從小到大排列。
4. 重複步驟2,直到序列中只存在一個結點,該結點即為根結點。

3.郝夫曼編碼

例如有一段文字內容“BADCADFEED”,用相應的二進位制資料表示:
A:000, B:001,C:010,D:001,E:100,F:101

編碼後的資料為“001000011010000011101100100011”,很長的一段碼

但是在實際中,有的字母用的頻率很高,例如“a”,而有些字母則不常用,例如“x”
假設六個字母的平均使用頻率為 A 27%,B 8%,C 15%,D 15%,E 30%,F 5%,可以將其作為權值,構造一顆郝夫曼樹,並將左分支改為0,右分支改為1
這裡寫圖片描述
根據每個字母所經過的路徑重新編碼後,六個字母為 A:01,B:1001,C:101,D:00,E:11,F:1000。我們可以看到,重新編碼後,使用頻率較高的字母編碼長度變小了,而使用頻率較低的字母,編碼則加長了

原來的文字內容 “BADCADFEED”重新編碼為“1001010010101001000111100”,比原來少了5個字元,節約了約17%的傳輸成本。

相關推薦

Huffman及其應用

1. 基本概念 路徑長度:樹中一個結點到另一個結點路徑上的分支數目。 樹的路徑長度:從樹根到每一結點的路徑長度之和。 帶權路徑長度:結點到樹根之間的路徑長度與結點上權的乘積。 樹的帶權路徑長度(WPL):樹中所有葉子結點的帶權路徑長度之和。 郝夫曼樹(

Huffman構建方法,編碼方法

哈夫曼樹是構建哈夫曼編碼的一種方法,構造方式如下: 如有佇列 {a, b, c, d, e, f, g} 其權值為 {05, 24, 08, 17, 34, 04,13} 求對應a~g的Huffman編碼。 注意一點的是,在構建的時

java實現資料壓縮的哈Huffman演算法

package edu.princeton.cs.algs4; /** * The <tt>Huffman</tt> class provides static methods for compressing * and expanding

Huffman)和哈編碼

選擇 其中 有一個 只有一個 bsp nbsp 例子 left style 一、哈夫曼(Huffman)樹和哈夫曼編碼 1.哈夫曼樹(Huffman)又稱最優二叉樹,是一類帶權路徑長度最短的樹, 常用於信息檢測。 定義: 結點間的路徑長度:樹中一個結點到另一個結點之間分

訊號相關及其應用

在訊號處理中,經常要研究兩個訊號的相似性,或者一個訊號經過一段時間延遲後自身的相似性,以便實現訊號檢測、識別與提取等。 可用於研究訊號相似性的方法稱為相關,該方法的核心概念是相關函式和互相關函式。 1 相關函式定義 無限能量訊號,訊號x(n)與y(n)的互相關函式定義為

資料結構與演算法 (七) 哈Huffman與哈編碼

1.演算法思想          哈夫曼樹又稱最優二叉樹,是一種帶權路徑長度最短的二叉樹。所謂樹的帶權路徑長度,就是樹中所有的葉結點的權值乘上其到根結點的路徑長度(若根結點為0層,葉結點到根結點的路徑長度為葉結點的層數)。樹的路徑長度是從樹根到每

#資料結構與演算法學習筆記#PTA17:哈與哈編碼 Huffman Tree & Huffman CodeC/C++

2018.5.16 最近一段時間忙於實驗室各種專案和輔導員的各種雜活,間隔了半周沒有耐下心學習。導師最近接了一個要PK京東方的專案讓我來做總負責,確實是很驚喜了。責任心告訴我不能把工作做水了,但是還是嘗試把實權移交給師兄們比較好。 這道題可以說是樹這塊的壓軸題了,無論是程

、最優樹、赫編碼

赫夫曼樹,別名“哈夫曼樹”、“最優樹”以及“最優二叉樹”。學習哈夫曼樹之前,首先要了解幾個名詞。 哈夫曼樹相關的幾個名詞 路徑:在一棵樹中,一個結點到另一個結點之間的通路,稱為路徑。圖 1 中,從根結點到結點 a 之間的通路就是一條路徑。 路徑長度:在一條路徑中,每經過一個結點,路徑長度都要

Matlab 影象處理-哈編碼huffman

哈夫曼編碼是一種可變長無損編碼,應用範圍廣。這裡介紹利用matalb實現哈夫曼編碼方法。matalb中帶有相關函,下面一一介紹: ENCO = huffmanenco(SIG, DICT) : 哈夫曼

資料結構之二叉應用及哈編碼實現C++

一、哈夫曼樹1.書上用的是靜態連結串列實現,本文中的哈夫曼樹用 排序連結串列 實現;2.實現了從 字元頻率統計、構建權值集合、建立哈夫曼樹、生成哈夫曼編碼,最後對 給定字串的編碼、解碼功能。3.使用到的 “SortedList.h”標頭檔案,在上篇博文:資料結構之排序單鏈表。

資料結構————檔案壓縮利用哈編碼實現

檔案壓縮原理: 首先檔案壓縮是通過HuffmaCode實現的、整體思路通過讀取檔案獲取字元出現頻率,通過字元出現頻率可以構建HuffmanTree,每個檔案中出現的字元通過HuffmanTree獲取HuffmanCode,從而將檔案中的字元同過HuffmanTree獲取相應編碼,並寫入壓

及其應用c語言實現資料結構複習最全筆記

樹 一.樹的基本概念     二.二叉樹 1.二叉樹的定義 2.二叉樹的性質  此外在這裡在介紹下完美二叉樹的概念及重要性質  完全二叉樹是效率很高的資料結構,完全二叉樹是由滿二叉樹而引出來的。對於深度為K的,有n個結點的二叉樹,當

搜尋及其應用不定期更新

承接之前的『樹』,本文將目標特別鎖定在『查詢樹』;這裡整理出我遇到的各種形式的查詢樹,以後可能會不定期更新,以儘可能多的囊括所有種類的查詢樹;雖然標題為“搜尋樹”,但是我還是習慣叫“查詢樹”,以下

資料結構與演算法13-哈及其應用

赫夫曼樹及其應用 最基本的壓縮編碼方法----赫夫曼編碼 定義與原理 我們先把這兩棵二叉樹簡化成葉子結點帶權的二叉樹(注:樹結點間的邊相差的數叫做權Weight) 從樹中一個結點到另一個結點之間的分支構成兩個結點之間的路徑,路徑上的分支數目稱做路徑長度。 如:二叉樹a中,根結點到

資料結構課程設計-哈及其應用

題目:假設用於通訊的電文由字符集{a,b,c,d,e,f,g,h,}中的字母構成,這8個字母在電文中出現的 頻率分別為: {0.19, 0.21, 0.02, 0.03, 0.06, 0.07, 0.1, 0.32}. 要求:畫出哈夫曼樹。 我從課本上面摘抄了一個題

資料結構 - 赫及其應用

赫夫曼樹及其應用 赫夫曼(Huffman)樹又稱最優樹,是一類帶權路徑長度最短的樹,有著廣泛的應用。 1 基本概念 ① 結點路徑:從樹中一個結點到另一個結點的之間的分支構成這兩個結點之間的路徑。 ② 路徑長度:結點路徑上的分支數目稱為路徑長度。

5.8哈及其應用

哈夫曼樹的基本概念: 路徑和路徑的長度: 在一棵樹中,從一個結點往下可以達到的孩子或子孫結點之間的通路,稱為路徑。通路中分支的數目稱為路徑長度。 若規定根結點的層數為1,則從根結點到第L層結點的路徑長

及其應用

哈夫曼樹樹,也稱最優二叉樹,是指對於一組帶有確定權值的葉結點,構造的具有最小帶權路徑長度的二叉樹。 二叉樹的路徑長度是指由根結點到所有葉結點的路徑之和。設二叉樹具有n個帶權值的葉結點,那麼從根結點到各個葉結點的路徑長度和相應結點權值的乘積之和叫做二叉樹的帶權路勁長度。記

講解2——的輸入,重心,直徑

str 樹的直徑 names n) ostream push main define span one.樹的輸入 1.輸入每個節點父親節點的編號 #include<vector> #include<stdio.h> #include<

編碼(Huffman coding)的那些事,(編碼技術介紹和程序實現)

信號 truct 依次 while 交換 需要 .text 示例 system 前言   哈夫曼編碼(Huffman coding)是一種可變長的前綴碼。哈夫曼編碼使用的算法是David A. Huffman還是在MIT的學生時提出的,並且在1952年發表了名為《