数据结构题:根据所给权值设计相应的哈夫曼树,并设计哈夫曼编码
文章目錄
- 前言
- 一、涉及到的知識(shí)點(diǎn)
- 二、例題講解
- 1、例題1
- 2、例題2
- 總結(jié)
前言
在數(shù)據(jù)結(jié)構(gòu)樹的這章中,常常有題目,是這樣的“給定一組權(quán)值…,試設(shè)計(jì)相應(yīng)的哈夫曼樹”,有的還要求其帶權(quán)路徑長(zhǎng)度,還有的是給定字符以及其使用頻率,要求設(shè)計(jì)一個(gè)哈夫曼編碼,同時(shí)要求設(shè)計(jì)哈夫曼樹等等。
為此這種題的步驟解法,我將做詳細(xì)的講解,本文介紹兩種題型,分別是求哈夫曼樹以及設(shè)計(jì)哈夫曼編碼,希望對(duì)閱讀本博客以及有需要的小伙伴有用,如有錯(cuò)誤不當(dāng)之處,歡迎大佬們指正!
(😊😊😊)
提示:以下是本篇文章正文內(nèi)容,下面案例可供參考。
一、涉及到的知識(shí)點(diǎn)
哈夫曼樹:給定n個(gè)權(quán)值作為n個(gè)葉子結(jié)點(diǎn),構(gòu)造一棵二叉樹,若該樹的帶權(quán)路徑長(zhǎng)度達(dá)到最小,稱這樣的二叉樹為最優(yōu)二叉樹,也稱為哈夫曼樹,可以說,哈夫曼樹是一種特殊的二叉樹,這種樹的所有的葉子結(jié)點(diǎn)都有權(quán)值,從而構(gòu)造出帶權(quán)路徑長(zhǎng)度最短的二叉樹,其中權(quán)值較大的結(jié)點(diǎn)離根較近。
路徑長(zhǎng)度:樹中路徑上的分支數(shù)目。
樹的路徑長(zhǎng)度:根結(jié)點(diǎn)到樹中每個(gè)結(jié)點(diǎn)的路徑長(zhǎng)度之和。
葉子結(jié)點(diǎn)的權(quán)值:權(quán)值是人們根據(jù)需要為每個(gè)葉子結(jié)點(diǎn)賦予的一個(gè)數(shù)值。
葉子結(jié)點(diǎn)的帶權(quán)路徑長(zhǎng)度:樹根到一個(gè)葉子結(jié)點(diǎn)之間的路徑長(zhǎng)度與該結(jié)點(diǎn)權(quán)值的乘積。
樹的帶權(quán)路徑長(zhǎng)度:樹中所有葉子結(jié)點(diǎn)的權(quán)值乘以該結(jié)點(diǎn)的路徑長(zhǎng)度之和,公式如下:
其中,Wk為第k個(gè)葉子結(jié)點(diǎn)的權(quán)值,Lk是從根結(jié)點(diǎn)到第k個(gè)葉子結(jié)點(diǎn)的路徑長(zhǎng)度。
哈夫曼編碼:樹中從根到每個(gè)葉子都有一條路徑, 對(duì)路徑上的各分枝約定指向左子樹根的分枝表示“ 0 ” 碼, 指向右子樹的分枝表示“ 1 ” 碼, 取每條路徑上的“ 0 ” 或“ 1 ” 的序列作為和各個(gè)葉子對(duì)應(yīng)的字符的編碼, 這就是哈夫曼編碼。
好接下來,我們了解了基本知識(shí)后,來看看這兩道題簡(jiǎn)單的鞏固一下
e.g.
1、求下圖中二叉樹的帶權(quán)路徑長(zhǎng)度
解:結(jié)果如下:
WPL=2×2+3×2+4×2+6×2=30
2、寫出下圖哈夫曼樹中D和F的哈夫曼編碼(提示:哈夫曼樹的每個(gè)左分支設(shè)為0,右分支設(shè)為1)
解:D和F的哈夫曼編碼為
D:00
F:10
接下來,我們一起進(jìn)入正題部分,兩道例題了解一下😎
二、例題講解
1、例題1
給定權(quán)值{5,10,12,15,30,40},構(gòu)造相應(yīng)的哈夫曼樹(要求寫出構(gòu)造步驟),并求出該樹的帶權(quán)路徑長(zhǎng)度。(提示:哈夫曼樹的每個(gè)左分支設(shè)為0,右分支設(shè)為1,要求同層中葉子結(jié)點(diǎn)權(quán)值從左到右,從小到大)。
解:注:只要將最小的兩個(gè)權(quán)值合并, 合并后的值再入列中(最小的兩個(gè)出列), 直至列中只有一個(gè)值結(jié)束。
按權(quán)值大小排列后得: {5,10,12,15,30,40},
取5和10,得到5+10=15,
從{12,15,15,30,40}找兩個(gè)最小的12+15=27
{15,27,30,40}中取15+27=42
{30,40,42}中取30+40=70
{42,70}中取42+70=112
{112}停止。
因?yàn)橐笸瑢又腥~子結(jié)點(diǎn)權(quán)值從左到右,從小到大,即分別建立左右分支,不懂的小伙伴可以仔細(xì)看一下上述過程以及畫的圖,另題目要求在哈夫曼樹的每個(gè)左分支設(shè)為0,右分支設(shè)為1。
則哈夫曼樹如下:
帶權(quán)路徑長(zhǎng)度:
(5+10+12+15)×3+(30+40)×2=266
提示:哈夫曼樹中黃熒光筆標(biāo)記處,畫圖中不用標(biāo)出,為讀者方便理解特注,即算這些所標(biāo)記的葉子。
具體步驟圖例:
2、例題2
已知一個(gè)電文字符集中有8個(gè)字符{A,B,C,D,E,F,G,H},它們使用的頻率為{0.04,0.21,0.06,0.07,0.15,0.18,0.12,0.03},設(shè)計(jì)一個(gè)哈夫曼編碼。(提示:哈夫曼樹的每個(gè)分支左分支設(shè)為0,右分支設(shè)為1,要求同層中葉子結(jié)點(diǎn)權(quán)值從左到右,從小到大)。
解:將使用的頻率乘以100,得到它們的權(quán)值
乘以100,得:{4,21,6,7,15,18,12,3},
按大小排序后,{3,4,6,7,12,15,18,21}
取3和4,得3+4=7,
從{6,7,7,12,15,18,21}中取6+7=13
{7,12,13,15,18,21}中取7+12=19
{13,15,18,19,21}中取13+15=28
{18,19,21,28}中取18+19=37
{21,28,37}中取21+28=49
{37,49}中取37+49=86
{86}停止
則哈夫曼樹如下:
由哈夫曼樹得到哈夫曼編碼為(由上至下編碼):
A:0101
B: 10
C: 1100
D: 1101
E:111
F: 00
G:011
H:0100
總結(jié)
以上就是全部?jī)?nèi)容,本文簡(jiǎn)單介紹了哈夫曼樹的一些基本知識(shí)和如何求哈夫曼樹以及如何設(shè)計(jì)哈夫曼編碼的方法,希望能給讀者帶來幫助。碼字不易,希望小伙伴們給個(gè)一鍵三連👍👍👍,這是給本博主的最大動(dòng)力哦。
總結(jié)
以上是生活随笔為你收集整理的数据结构题:根据所给权值设计相应的哈夫曼树,并设计哈夫曼编码的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: VS2019正确创建C++步骤以及扩展插
- 下一篇: 数据结构题:克鲁斯卡尔(Kruscal)