强奸久久久久久久|草草浮力在线影院|手机成人无码av|亚洲精品狼友视频|国产国模精品一区|久久成人中文字幕|超碰在线视屏免费|玖玖欧洲一区二区|欧美精品无码一区|日韩无遮一区二区

首頁 > 產(chǎn)品 > 知識 > huffman,Huffman編碼的算法

huffman,Huffman編碼的算法

來源:整理 時間:2023-08-31 02:20:30 編輯:智能門戶 手機(jī)版

本文目錄一覽

1,Huffman編碼的算法

a:11 b:10 c:110 d:011 e:111

Huffman編碼的算法

2,Huffman是什么來的

人名:哈夫曼
我記得在《數(shù)據(jù)結(jié)構(gòu)》里看到過,huffman編碼。是利用人名huffman叫的。
哈夫曼 在百度查 它是人名 也是 一種事物 和 一種理論方法 請采納 謝謝 祝:家庭健康 包括你

Huffman是什么來的

3,什么是霍夫曼編碼

霍夫曼(Huffman)編碼原理 霍夫曼(Huffman)編碼是1952年為文本文件而建立,是一種統(tǒng)計編碼。屬于無損壓縮編碼。 霍夫曼編碼的碼長是變化的,對于出現(xiàn)頻率高的信息,編碼的長度較短;而對于出現(xiàn)頻率低的信息,編碼長度較長。這樣,處理全部信息的總碼長一定小于實際信息的符號長度。 步驟進(jìn)行:l)將信號源的符號按照出現(xiàn)概率遞減的順序排列。2)將兩個最小出現(xiàn)概率進(jìn)行合并相加,得到的結(jié)果作為新符號的出現(xiàn)概率。 3)重復(fù)進(jìn)行步驟1和2直到概率相加的結(jié)果等于1為止。4)在合并運(yùn)算時,概率大的符號用編碼0表示,概率小的符號用編碼1表示。5)記錄下概率為1處到當(dāng)前信號源符號之間的0,l序列,從而得到每個符號的編碼。例:設(shè)信號源為 s={s1, s2, s3, s4, s5}對應(yīng)的概率為p={0.25,0.22,0.20, 0.18,0.15}。根據(jù)字符出現(xiàn)的概率來構(gòu)造平均長度最短的異字頭碼字?;粑绰幋a通常采用兩次掃描的辦法,第一次掃描得到統(tǒng)計結(jié)果,第二次掃描進(jìn)行編碼?;舴蚵幋a具有一些明顯的特點:1) 編出來的碼都是異字頭碼,保證了碼的唯一可譯性。2) 由于編碼長度可變。因此譯碼時間較長,使得霍夫曼編碼的壓縮與還原相當(dāng)費(fèi)時。3) 編碼長度不統(tǒng)一,硬件實現(xiàn)有難度。4) 對不同信號源的編碼效率不同,當(dāng)信號源的符號概率為2的負(fù)冪次方時,達(dá)到100%的編碼效率;若信號源符號的概率相等,則編碼效率最低。5) 由于"0"與"1"的指定是任意的,故由上述過程編出的最佳碼不是唯一的,但其平均碼長是一樣的,故不影響編碼效率與數(shù)據(jù)壓縮性能。

什么是霍夫曼編碼

4,Huffman樹的應(yīng)用

哈夫曼樹 在一般的數(shù)據(jù)結(jié)構(gòu)的書中,樹的那章后面,著者一般都會介紹一下哈夫曼(HUFFMAN)樹和哈夫曼編碼。哈夫曼編碼是哈夫曼樹的一個應(yīng)用。哈夫曼編碼應(yīng)用廣泛,如JPEG中就應(yīng)用了哈夫曼編碼。 首先介紹什么是哈夫曼樹。哈夫曼樹又稱最優(yōu)二叉樹,是一種帶權(quán)路徑長度最短的二叉樹。所謂樹的帶權(quán)路徑長度,就是樹中所有的葉結(jié)點的權(quán)值乘上其到根結(jié)點的路徑長度(若根結(jié)點為0層,葉結(jié)點到根結(jié)點的路徑長度為葉結(jié)點的層數(shù))。樹的帶權(quán)路徑長度記為WPL=(W1*L1+W2*L2+W3*L3+...+Wn*Ln),N個權(quán)值Wi(i=1,2,...n)構(gòu)成一棵有N個葉結(jié)點的二叉樹,相應(yīng)的葉結(jié)點的路徑長度為Li(i=1,2,...n)??梢宰C明哈夫曼樹的WPL是最小的。 哈夫曼在上世紀(jì)五十年代初就提出這種編碼時,根據(jù)字符出現(xiàn)的概率來構(gòu)造平均長度最短的編碼。它是一種變長的編碼。在編碼中,若各碼字長度嚴(yán)格按照碼字所對應(yīng)符號出現(xiàn)概率的大小的逆序排列,則編碼的平均長度是最小的。(注:碼字即為符號經(jīng)哈夫曼編碼后得到的編碼,其長度是因符號出現(xiàn)的概率而不同,所以說哈夫曼編碼是變長的編碼。) 然而怎樣構(gòu)造一棵哈夫曼樹呢?最具有一般規(guī)律的構(gòu)造方法就是哈夫曼算法。一般的數(shù)據(jù)結(jié)構(gòu)的書中都可以找到其描述: 一、對給定的n個權(quán)值 二、在F中選取兩棵根結(jié)點權(quán)值最小的樹作為新構(gòu)造的二叉樹的左右子樹,新二叉樹的根結(jié)點的權(quán)值為其左右子樹的根結(jié)點的權(quán)值之和。 三、從F中刪除這兩棵樹,并把這棵新的二叉樹同樣以升序排列加入到集合F中。 四、重復(fù)二和三兩步,直到集合F中只有一棵二叉樹為止。 用C語言實現(xiàn)上述算法,可用靜態(tài)的二叉樹或動態(tài)的二叉樹。若用動態(tài)的二叉樹可用以下數(shù)據(jù)結(jié)構(gòu): struct tree float weight; /*權(quán)值*/ union char leaf; /*葉結(jié)點信息字符*/ struct tree *left; /*樹的左結(jié)點*/ }; struct tree *right; /*樹的右結(jié)點*/ }; struct forest struct tree *ti; /* F中的樹*/ struct forest *next; /* 下一個結(jié)點*/ }; 例:若字母A,B,Z,C出現(xiàn)的概率為:0.75,0.54,0.28,0.43;則相應(yīng)的權(quán)值為:75,54,28,43。 構(gòu)造好哈夫曼樹后,就可根據(jù)哈夫曼樹進(jìn)行編碼。例如:上面的字符根據(jù)其出現(xiàn)的概率作為權(quán)值構(gòu)造一棵哈夫曼樹后,經(jīng)哈夫曼編碼得到的對應(yīng)的碼值。只要使用同一棵哈夫曼樹,就可把編碼還原成原來那組字符。顯然哈夫曼編碼是前綴編碼,即任一個字符的編碼都不是另一個字符的編碼的前綴,否則,編碼就不能進(jìn)行翻譯。例如:a,b,c,d的編碼為:0,10,101,11,對于編碼串:1010就可翻譯為bb或ca,因為b的編碼是c的編碼的前綴。剛才進(jìn)行哈夫曼編碼的規(guī)則是從根結(jié)點到葉結(jié)點(包含原信息)的路徑,向左孩子前進(jìn)編碼為0,向右孩子前進(jìn)編碼為1,當(dāng)然你也可以反過來規(guī)定。 這種編碼方法是靜態(tài)的哈夫曼編碼,它對需要編碼的數(shù)據(jù)進(jìn)行兩遍掃描:第一遍統(tǒng)計原數(shù)據(jù)中各字符出現(xiàn)的頻率,利用得到的頻率值創(chuàng)建哈夫曼樹,并必須把樹的信息保存起來,即把字符0-255(2^8=256)的頻率值以2-4BYTES的長度順序存儲起來,(用4Bytes的長度存儲頻率值,頻率值的表示范圍為0--2^32-1,這已足夠表示大文件中字符出現(xiàn)的頻率了)以便解壓時創(chuàng)建同樣的哈夫曼樹進(jìn)行解壓;第二遍則根據(jù)第一遍掃描得到的哈夫曼樹進(jìn)行編碼,并把編碼后得到的碼字存儲起來。 靜態(tài)哈夫曼編碼方法有一些缺點:一、對于過短的文件進(jìn)行編碼的意義不大,因為光以4BYTES的長度存儲哈夫曼樹的信息就需1024Bytes的存儲空間;二、進(jìn)行哈夫曼編碼,存儲編碼信息時,若用與通訊網(wǎng)絡(luò),就會引起較大的延時;三、對較大的文件進(jìn)行編碼時,頻繁的磁盤讀寫訪問會降低數(shù)據(jù)編碼的速度。 因此,后來有人提出了一種動態(tài)的哈夫曼編碼方法。動態(tài)哈夫曼編碼使用一棵動態(tài)變化的哈夫曼樹,對第t+1個字符的編碼是根據(jù)原始數(shù)據(jù)中前t個字符得到的哈夫曼樹來進(jìn)行的,編碼和解碼使用相同的初始哈夫曼樹,每處理完一個字符,編碼和解碼使用相同的方法修改哈夫曼樹,所以沒有必要為解碼而保存哈夫曼樹的信息。編碼和解碼一個字符所需的時間與該字符的編碼長度成正比,所以動態(tài)哈夫曼編碼可實時進(jìn)行。動態(tài)哈夫曼編碼比靜態(tài)哈夫曼編碼復(fù)雜的多,有興趣的讀者可參考有關(guān)數(shù)據(jù)結(jié)構(gòu)與算法的書籍。 前面提到的JPEG中用到了哈夫曼編碼,并不是說JPEG就只用哈夫曼編碼就可以了,而是一幅圖片經(jīng)過多個步驟后得到它的一列數(shù)值,對這些數(shù)值進(jìn)行哈夫曼編碼,以便存儲或傳輸。哈夫曼編碼方法比較易懂,大家可以根據(jù)它的編碼方法,自己編寫哈夫曼編碼和解碼的程序。

5,什么是哈夫曼算法

題目的闡述:     以n進(jìn)制編碼方式對一個英文字串中的字符進(jìn)行編碼,每個不同的字符其編碼不同.使得由新的編碼替代原串后總碼長最小,且輸入0,1,2,...,n-1構(gòu)成的數(shù)字串后,依照該編碼方式可以正確的對譯出唯一的英文原串.   如:?。睿剑场∮⑽脑疄椤。幔猓猓悖猓幔洌洌幔悖?   其對應(yīng)的一種編碼方式為  ?。幔海埃?  ?。猓海埃?   c:020  ?。洌海埃玻?   e:022   原串對譯后的編碼為000101020010002102100020022   其碼長為27   若輸入編碼串   ?。埃保埃玻埃埃玻玻埃?   則對應(yīng)的英文原串為 bcea 分 析:   假設(shè)英文原串中的字符存放于字符集s中,‖s‖=?。?,每個字符在字串中出現(xiàn)的概率為w[i],l[i]為字符i的編碼長.   依題意得,對s集合中的不同字符進(jìn)行n進(jìn)制編碼后要求     1)新字串的碼長最短          ?。鳎穑欤健疲鳎郏椋荩欤郏椋? (i∈1..x)         使得在wpl是所有編碼方式中的最小值     2)編碼無二義性         任意一字符編碼都不為其它字符編碼的前綴   此題以哈夫曼樹來解答是非常適宜的.n為此哈夫曼樹的分叉數(shù),s字符集里的元素即為此   n叉哈夫曼樹的葉子,概率w[i]即為葉子結(jié)點的權(quán)重,從根結(jié)點到各葉子結(jié)點的路徑長即為該葉子結(jié)點的編碼長l[i].由哈夫曼樹的思想可以知道哈夫曼樹的建立是一步到位的貪心法,即權(quán)重越大的結(jié)點越靠近該樹的根,這樣,出現(xiàn)頻率越大的字符其編碼就越短.      但具體應(yīng)該怎樣建立起此n叉哈夫曼樹呢?我們首先以n=2為例 :  ?。螅剑幔?,c,d}  ?。鳎剑郏?,1,2,1]     首先從w中選出兩個最小權(quán),1,1,將其刪去,并以2(即1+1)替代    ?。鳎剑郏常?,2];   再從新的w中取出兩個最小權(quán),2,2,將其刪去,并以4(即2+2)替代    ?。鳎剑郏?,4];   依此類推,直到w中只一個值時合并結(jié)束,此時 w=[7]   以上兩兩合并的過程即為二叉哈夫曼樹的建立過程,每一次的合并即是將兩棵子樹歸于一個根結(jié)點下,于是可以建立二叉樹如下:                         m                       0?  ?1                       m   m                     ?。帷 。?  ?1                        m    m                       ?。恪 。?  ?1                                               m     m                         ?。狻     。洹? ?。恚椋睿鳎穑欤剑常保保常玻玻保常剑保?  從某一根結(jié)點出發(fā)走向其左子樹標(biāo)記為0,走向其右子樹標(biāo)記為1,則可以得到以下編碼  a,b,c,d對應(yīng)的編碼為   ?。幔海?   ?。猓海保保?   ?。悖海保?   ?。洌海保保? ?。睿剑硶r又是怎樣一種情況呢?   設(shè)?。螅剑?,b,c,d,e}    ?。鳎剑郏?,4,2,5,3}   則按權(quán)重排序可得    ?。螅剑?,b,e,c,a}          w=[7,5,4,3,2]   那么此哈夫曼樹的樹形應(yīng)為怎樣呢?  是以下的左圖,還是右圖,或是兩者均不是            m                   m         ?  a   ?               ? ?        m   m   l              l  m       ? ?  ? ? ?。恪              。帷? ?              l  l l  l                  l  m     ?。帷 。洹。狻 。濉                 。洹? ?                 l   m                                ?。狻 ? ?                                    l l                                   ?。濉。?  顯然,要帶權(quán)路徑長wpl最短,那么,此樹的高度就應(yīng)盡可能的小,由此可知將此樹建成 豐滿n叉樹是最合理的,于是我們盡量使樹每一層都為n個分枝.   對于這道題的情況,我們具體來分析.   按照哈夫曼樹的思想,首先從w中取出權(quán)最小的三個值,即2,3,4,并以9(2+3+4)來代替,得到新的w=[9,7,5];再將這三個值合并成9+7+5=21這個結(jié)點.于是得到三叉哈夫曼樹如下:                            m            ?  a  ?           l   l   m          ?。洹  。狻? a ?                 l l l                ?。濉。恪。?   wpl=1*7+1*5+2*2+2*3+2*4=30   以0..n-1依次標(biāo)記每個根結(jié)點的n個分枝,則可以得到每個字符相對應(yīng)的編碼:    ?。幔海玻?    ?。猓海?    ?。悖海玻?    ?。洌海?     e:20   我們發(fā)現(xiàn)對于這種情況恰巧每層均為n個分枝,但事實上并非所有的n叉哈夫曼樹都可得到每層n個分枝.例于當(dāng)n=3,‖s‖=6時就不可能構(gòu)成一棵每層都為三個分枝的三叉樹.如何來處理這種情況呢?   最簡單的處理方式就是添加若干出現(xiàn)概率為0的空字符填補(bǔ)在n叉樹的最下一層,這些權(quán)為0的虛結(jié)點并無實際意義但卻非常方全便于這棵n叉樹的建立.空字符的添加個數(shù)add的計算如下:  ?。健蟆。恚铮洹。ǎ睿保?  ?。幔洌洌剑啊  。ǎ剑保  ?  ?。幔洌洌剑薄  。ǎ剑埃?  ?。幔洌洌剑睿。ǎ荆保 ?   虛結(jié)點的加入使得權(quán)重最小的n-add個字符構(gòu)成了距根結(jié)點最遠(yuǎn)的分枝,使其它字符構(gòu)成的n叉樹保持了豐滿的n叉結(jié)構(gòu).   例: n=3      ?。螅剑?,b,c,d,e,f}     ?。鳎剑郏保?,3,4,5,6}   則?。海剑丁。恚铮洹。ǎ常保剑?    ?。幔洌洌剑?   于是構(gòu)成n叉樹如下: -為虛結(jié)點                 ?               ?  a  ?             l   l    m            ?。妗  。濉?  a  ?                   l  l   m                   d ?。恪? a ?                        b?。帷?  ?。鳎穑欤剑保叮保担玻矗玻常常玻常保常埃剑常?   對應(yīng)編碼為:    ?。幔海玻玻?     b:220    ?。悖海玻?     d:20    ?。澹海?    ?。妫海?/section>

6,到底什么是哈夫曼樹啊求例子

哈夫曼樹是給定n個權(quán)值作為n個葉子結(jié)點,構(gòu)造一棵二叉樹,若該樹的帶權(quán)路徑長度達(dá)到最小,稱這樣的二叉樹為最優(yōu)二叉樹,也稱為哈夫曼樹(Huffman Tree)。哈夫曼樹是帶權(quán)路徑長度最短的樹,權(quán)值較大的結(jié)點離根較近。例子:1、將w1、w2、…,wn看成是有n 棵樹的森林(每棵樹僅有一個結(jié)點);2、 在森林中選出兩個根結(jié)點的權(quán)值最小的樹合并,作為一棵新樹的左、右子樹,且新樹的根結(jié)點權(quán)值為其左、右子樹根結(jié)點權(quán)值之和;3、從森林中刪除選取的兩棵樹,并將新樹加入森林;4、重復(fù)(2)、(3)步,直到森林中只剩一棵樹為止,該樹即為所求得的哈夫曼樹。擴(kuò)展資料:按照哈夫曼編碼構(gòu)思程序流程:1、切割的順序是從上往下,直至數(shù)組中的元素全部出現(xiàn)在葉節(jié)點;2、我們思路正好相反,從數(shù)組中找出最小的兩個元素作為最下面的葉節(jié)點,在向備選數(shù)組中存入這兩個葉節(jié)點的和(這個新的和加入累加運(yùn)算,這個和也就是所求的最小值的一部分,原因如上圖)。3、以本題為例,備選數(shù)組中現(xiàn)有元素為4、上述2.3布重復(fù)執(zhí)行直至備選數(shù)組中只有一個元素,此時累加結(jié)束,返回累加值即可5、求數(shù)組中的最小值,可以用小根堆進(jìn)行提取最為方便;此題用到了貪心的思路,即用相同的策略重復(fù)執(zhí)行,直至我們得到所需的結(jié)果。參考資料來源:搜狗百科——哈夫曼樹
我們先看一個應(yīng)用例子:假如你跟別人聊天,輸入了“AFTER DATA EAR ARE ART AREA”,要發(fā)給對方,在電腦的世界里,最終都是要將相關(guān)的字符轉(zhuǎn)換為0 1來表示的二進(jìn)制來傳輸,這里用到的字符集為“A,E,R,T,F(xiàn),D”,各字母出現(xiàn)的次數(shù)為為了獲得傳送報文的最短長度,可用字符集中的每個字符作為葉子結(jié)點生成一棵編碼二叉樹,可將每個字符的出現(xiàn)頻率作為字符結(jié)點的權(quán)值賦予該結(jié)點上,顯然字使用頻率越小權(quán)值越小,權(quán)值越小葉子就越靠下。于是我們構(gòu)造這顆二叉樹的時候,應(yīng)該先選擇最小權(quán)值的點來構(gòu)造樹,新樹的權(quán)值為左右子樹的權(quán)值之和,然后新的權(quán)值放回到原來的權(quán)值序列中,再次選擇兩個權(quán)值最小的點來構(gòu)造樹,如此循環(huán)最后只剩下一棵樹為止。我們以字符集為“A,E,R,T,F(xiàn),D”,各字母出現(xiàn)的次數(shù)為首先選取兩個最小權(quán)值的點構(gòu)造樹,新的權(quán)值放回到序列中,變?yōu)? / \1 1再次選擇兩個權(quán)值最小的點構(gòu)造樹,序列變?yōu)槿缦拢? / \ 2 3 / \ 1 1按照上面的規(guī)則直到只有一顆樹為止 / \ / \ 2 3 4 5 / \1 1------------------------ / \ / \ 4 5 5 8 / \ 2 3 / \ 1 1------------------------ 22 / \ 9 13 / \ / \E4 R5 5 A8 / \ 2 T3 / \ F1 D1上面的的樹便是哈夫曼樹了(給定n個權(quán)值作為n的葉子結(jié)點,構(gòu)造一棵二叉樹,若帶權(quán)路徑長度達(dá)到最小,稱這樣的二叉樹為最優(yōu)二叉樹,也稱為哈夫曼樹)這顆樹每一個“/” 默認(rèn)為0, “\”為1,就可以得到葉子結(jié)點的編碼:如上面F:1000 D:1001 A:11
這么明確的算法,肯定唯一,數(shù)如下: 1.00 / \ /0 \1 0.44 0.56 / \ / \ /0 \1 /0 \1 0.21 0.23 0.27 0.29 / \ /0 \1 0.13 0.16 / \ /0 \1 0.07 0.09編碼:0.07:11100.09:11110.13:1100.21:000.23:010.27:10沒有誰是誰的前綴,ok. 針對補(bǔ)充問題:不行,生成哈夫曼樹時總是取最小的兩個權(quán)值作為葉子。。 針對補(bǔ)充問題002:上面那棵樹,從下往上看,所有權(quán)值中最小的兩個是0.07跟0.09,相加等0.16;原來的權(quán)值表成了:0.13,0.16(代替了0.07跟0.09),0.21,0.23,0.27;現(xiàn)在最小的兩個是0.13,0.16,相加得到0.29;之前的權(quán)值表又成了:0.21,0.23,0.27,0.29(代替了0.13跟0.16);現(xiàn)在最小的兩個是0.21,0.23,相加得到0.44;之前的權(quán)值表又成了:0.27,0.29,0.44;接下來是一樣的。
一、哈夫曼樹的介紹Huffman Tree,中文名是哈夫曼樹或霍夫曼樹,它是最優(yōu)二叉樹。定義:給定n個權(quán)值作為n個葉子結(jié)點,構(gòu)造一棵二叉樹,若樹的帶權(quán)路徑長度達(dá)到最小,則這棵樹被稱為哈夫曼樹。 這個定義里面涉及到了幾個陌生的概念,下面就是一顆哈夫曼樹,我們來看圖解答。(1) 路徑和路徑長度定義:在一棵樹中,從一個結(jié)點往下可以達(dá)到的孩子或?qū)O子結(jié)點之間的通路,稱為路徑。通路中分支的數(shù)目稱為路徑長度。若規(guī)定根結(jié)點的層數(shù)為1,則從根結(jié)點到第L層結(jié)點的路徑長度為L-1。 例子:100和80的路徑長度是1,50和30的路徑長度是2,20和10的路徑長度是3。(2) 結(jié)點的權(quán)及帶權(quán)路徑長度定義:若將樹中結(jié)點賦給一個有著某種含義的數(shù)值,則這個數(shù)值稱為該結(jié)點的權(quán)。結(jié)點的帶權(quán)路徑長度為:從根結(jié)點到該結(jié)點之間的路徑長度與該結(jié)點的權(quán)的乘積。 例子:節(jié)點20的路徑長度是3,它的帶權(quán)路徑長度= 路徑長度 * 權(quán) = 3 * 20 = 60。(3) 樹的帶權(quán)路徑長度定義:樹的帶權(quán)路徑長度規(guī)定為所有葉子結(jié)點的帶權(quán)路徑長度之和,記為WPL。 例子:示例中,樹的WPL= 1*100 + 2*50 + 3*20 + 3*10 = 100 + 100 + 60 + 30 = 290。比較下面兩棵樹上面的兩棵樹都是以左邊的樹WPL=2*10 + 2*20 + 2*50 + 2*100 = 360 右邊的樹WPL=290左邊的樹WPL > 右邊的樹的WPL。你也可以計算除上面兩種示例之外的情況,但實際上右邊的樹就是二、哈夫曼樹的圖文解析假設(shè)有n個權(quán)值,則構(gòu)造出的哈夫曼樹有n個葉子結(jié)點。 n個權(quán)值分別設(shè)為 w1、w2、…、wn,哈夫曼樹的構(gòu)造規(guī)則為:1. 將w1、w2、…,wn看成是有n 棵樹的森林(每棵樹僅有一個結(jié)點); 2. 在森林中選出根結(jié)點的權(quán)值最小的兩棵樹進(jìn)行合并,作為一棵新樹的左、右子樹,且新樹的根結(jié)點權(quán)值為其左、右子樹根結(jié)點權(quán)值之和; 3. 從森林中刪除選取的兩棵樹,并將新樹加入森林; 4. 重復(fù)(02)、(03)步,直到森林中只剩一棵樹為止,該樹即為所求得的哈夫曼樹。以第1步:創(chuàng)建森林,森林包括5棵樹,這5棵樹的權(quán)值分別是5,6,7,8,15。 第2步:在森林中,選擇根節(jié)點權(quán)值最小的兩棵樹(5和6)來進(jìn)行合并,將它們作為一顆新樹的左右孩子(誰左誰右無關(guān)緊要,這里,我們選擇較小的作為左孩子),并且新樹的權(quán)值是左右孩子的權(quán)值之和。即,新樹的權(quán)值是11。 然后,將"樹5"和"樹6"從森林中刪除,并將新的樹(樹11)添加到森林中。 第3步:在森林中,選擇根節(jié)點權(quán)值最小的兩棵樹(7和8)來進(jìn)行合并。得到的新樹的權(quán)值是15。 然后,將"樹7"和"樹8"從森林中刪除,并將新的樹(樹15)添加到森林中。 第4步:在森林中,選擇根節(jié)點權(quán)值最小的兩棵樹(11和15)來進(jìn)行合并。得到的新樹的權(quán)值是26。 然后,將"樹11"和"樹15"從森林中刪除,并將新的樹(樹26)添加到森林中。 第5步:在森林中,選擇根節(jié)點權(quán)值最小的兩棵樹(15和26)來進(jìn)行合并。得到的新樹的權(quán)值是41。 然后,將"樹15"和"樹26"從森林中刪除,并將新的樹(樹41)添加到森林中。 此時,森林中只有一棵樹(樹41)。這棵樹就是我們需要的哈夫曼樹!三、哈夫曼樹的基本操作哈夫曼樹的重點是如何構(gòu)造哈夫曼樹。本文構(gòu)造哈夫曼時,用到了以前介紹過的"(二叉堆)最小堆"。下面對哈夫曼樹進(jìn)行講解。1. 基本定義[html]view plaincopyprintHuffmanNode是哈夫曼樹的節(jié)點類。[html]view plaincopyprintHuffman是哈夫曼樹對應(yīng)的類,它包含了哈夫曼樹的根節(jié)點和哈夫曼樹的相關(guān)操作。2. 構(gòu)造哈夫曼樹[html]view plaincopyprint首先創(chuàng)建最小堆,然后進(jìn)入for循環(huán)。每次循環(huán)時:(1) 首先,將最小堆中的最小節(jié)點拷貝一份并賦值給left,然后重塑最小堆(將最小節(jié)點和后面的節(jié)點交換位置,接著將"交換位置后的最小節(jié)點"之前的全部元素重新構(gòu)造成最小堆); (2) 接著,再將最小堆中的最小節(jié)點拷貝一份并將其賦值right,然后再次重塑最小堆; (3) 然后,新建節(jié)點parent,并將它作為left和right的父節(jié)點; (4) 接著,將parent的數(shù)據(jù)復(fù)制給最小堆中的指定節(jié)點。四、哈夫曼樹的完整源碼1. 哈夫曼樹的節(jié)點類(HuffmanNode.java)[html]view plaincopyprint2. 哈夫曼樹的實現(xiàn)文件(Huffman.java)[html]view plaincopyprint3. 哈夫曼樹對應(yīng)的最小堆(MinHeap.java)[html]view plaincopyprint4. 哈夫曼樹的測試程序(HuffmanTest.java)[html]view plaincopyprint五個字符:a,b,c,d,e,它們出現(xiàn)的的頻率為8,14,10,4,18構(gòu)造相應(yīng)的哈夫曼樹,求出每個字符的哈夫曼編碼:哈夫曼樹:54/ \22 32/ \ / \c10 12 b14 e18/ \d4 a8哈夫曼編碼:a:011 b:10 c:00 d:010 e:11今天做題的時候,遇到了一個關(guān)于哈夫曼樹的題,由于一直不是很明白哈夫曼樹的構(gòu)造過程,所以找了很多資料都不是特別清楚的,直到我遇到了這篇文章,哈哈,在此分享給大家哦!注意:哈夫曼樹并不唯一,但帶權(quán)路徑長度一定是相同的。(1)8個結(jié)點的權(quán)值大小如下:(2)從19,21,2,3,6,7,10,32中選擇兩個權(quán)小結(jié)點。選中2,3。同時算出這兩個結(jié)點的和5。(3)從19,21,6,7,10,32,5中選出兩個權(quán)小結(jié)點。選中5,6。同時計算出它們的和11。(4)從19,21,7,10,32,11中選出兩個權(quán)小結(jié)點。選中7,10。同時計算出它們的和17。 (BTW:這時選出的兩個數(shù)字都不是已經(jīng)構(gòu)造好的二叉樹里面的結(jié)點,所以要另外開一棵二叉樹;或者說,如果兩個數(shù)的和正好是下一步的兩個最小數(shù)的其中的一個,那么這個樹直接往上生長就可以了,如果這兩個數(shù)的和比較大,不是下一步的兩個最小數(shù)的其中一個,那么就并列生長。)(4)從19,21,7,10,32,11中選出兩個權(quán)小結(jié)點。選中7,10。同時計算出它們的和17。(BTW:這時選出的兩個數(shù)字都不是已經(jīng)構(gòu)造好的二叉樹里面的結(jié)點,所以要另外開一棵二叉樹;或者說,如果兩個數(shù)的和正好是下一步的兩個最小數(shù)的其中的一個,那么這個樹直接往上生長就可以了,如果這兩個數(shù)的和比較大,不是下一步的兩個最小數(shù)的其中一個,那么就并列生長。)(4)從19,21,7,10,32,11中選出兩個權(quán)小結(jié)點。選中7,10。同時計算出它們的和17。 (BTW:這時選出的兩個數(shù)字都不是已經(jīng)構(gòu)造好的二叉樹里面的結(jié)點,所以要另外開一棵二叉樹;或者說,如果兩個數(shù)的和正好是下一步的兩個最小數(shù)的其中的一個,那么這個樹直接往上生長就可以了,如果這兩個數(shù)的和比較大,不是下一步的兩個最小數(shù)的其中一個,那么就并列生長。)(5)從19,21,32,11,17中選出兩個權(quán)小結(jié)點。選中11,17。同時計算出它們的和28。(6)從19,21,32,28中選出兩個權(quán)小結(jié)點。選中19,21。同時計算出它們的和40。另起一顆二叉樹。(7)從32,28, 40中選出兩個權(quán)小結(jié)點。選中28,32。同時計算出它們的和60。(8)從 40, 60中選出兩個權(quán)小結(jié)點。選中40,60。同時計算出它們的和100。 好了,此時哈夫曼樹已經(jīng)構(gòu)建好了。這是原作者的鏈接哦,我覺得還不錯呢,大家可以去看看的!注意:哈夫曼樹并不唯一,但帶權(quán)路徑長度一定是相同的。(1)8個結(jié)點的權(quán)值大小如下:(2)從19,21,2,3,6,7,10,32中選擇兩個權(quán)小結(jié)點。選中2,3。同時算出這兩個結(jié)點的和5。(3)從19,21,6,7,10,32,5中選出兩個權(quán)小結(jié)點。選中5,6。同時計算出它們的和11。(4)從19,21,7,10,32,11中選出兩個權(quán)小結(jié)點。選中7,10。同時計算出它們的和17。 (BTW:這時選出的兩個數(shù)字都不是已經(jīng)構(gòu)造好的二叉樹里面的結(jié)點,所以要另外開一棵二叉樹;或者說,如果兩個數(shù)的和正好是下一步的兩個最小數(shù)的其中的一個,那么這個樹直接往上生長就可以了,如果這兩個數(shù)的和比較大,不是下一步的兩個最小數(shù)的其中一個,那么就并列生長。)(4)從19,21,7,10,32,11中選出兩個權(quán)小結(jié)點。選中7,10。同時計算出它們的和17。(BTW:這時選出的兩個數(shù)字都不是已經(jīng)構(gòu)造好的二叉樹里面的結(jié)點,所以要另外開一棵二叉樹;或者說,如果兩個數(shù)的和正好是下一步的兩個最小數(shù)的其中的一個,那么這個樹直接往上生長就可以了,如果這兩個數(shù)的和比較大,不是下一步的兩個最小數(shù)的其中一個,那么就并列生長。)(4)從19,21,7,10,32,11中選出兩個權(quán)小結(jié)點。選中7,10。同時計算出它們的和17。 (BTW:這時選出的兩個數(shù)字都不是已經(jīng)構(gòu)造好的二叉樹里面的結(jié)點,所以要另外開一棵二叉樹;或者說,如果兩個數(shù)的和正好是下一步的兩個最小數(shù)的其中的一個,那么這個樹直接往上生長就可以了,如果這兩個數(shù)的和比較大,不是下一步的兩個最小數(shù)的其中一個,那么就并列生長。)(5)從19,21,32,11,17中選出兩個權(quán)小結(jié)點。選中11,17。同時計算出它們的和28。(6)從19,21,32,28中選出兩個權(quán)小結(jié)點。選中19,21。同時計算出它們的和40。另起一顆二叉樹。(7)從32,28, 40中選出兩個權(quán)小結(jié)點。選中28,32。同時計算出它們的和60。(8)從 40, 60中選出兩個權(quán)小結(jié)點。選中40,60。同時計算出它們的和100。 好了,此時哈夫曼樹已經(jīng)構(gòu)建好了。
文章TAG:huffmanHuffman編碼的算法

最近更新

  • 網(wǎng)易游戲 數(shù)據(jù)挖掘網(wǎng)易游戲 數(shù)據(jù)挖掘

    即便如此網(wǎng)易游戲能追到騰訊游戲?如何評價網(wǎng)易和騰訊的游戲?為什么網(wǎng)易每年生產(chǎn)這么多手機(jī)游戲,而網(wǎng)易游戲營收仍然在總營收中占有很高的比重。從兩家公司的游戲的財務(wù)指標(biāo)來看,騰訊肯定大.....

    知識 日期:2023-08-31

  • 深信服 數(shù)據(jù)中心深信服 數(shù)據(jù)中心

    沈信服可以找深圳沈信服的生產(chǎn)廠家。沈信服的優(yōu)缺點,沈信服有哪些產(chǎn)品?Deep信服桌面云可以在家里用嗎?Deep信服桌面云可以在家里使用,Deep信服遷移到vmwareDeep信服遷移到vmware虛擬化平臺.....

    知識 日期:2023-08-31

  • 學(xué)習(xí)大數(shù)據(jù)能找什么工作學(xué)習(xí)大數(shù)據(jù)能找什么工作

    學(xué)大數(shù)據(jù)能找到什么工作?學(xué)大數(shù)據(jù)你會有什么工作?大數(shù)據(jù)專業(yè)能找到什么工作數(shù)據(jù)專業(yè)能找到的工作第一是大數(shù)據(jù)應(yīng)用,第二是大數(shù)據(jù)系統(tǒng)。學(xué)習(xí)Da數(shù)據(jù)你可能從事一個大數(shù)據(jù)行業(yè),但不會學(xué)習(xí)Da數(shù).....

    知識 日期:2023-08-31

  • 整流器,什么叫整流器有哪些類別整流器,什么叫整流器有哪些類別

    什么叫整流器有哪些類別2,整流器是什么東西3,什么是整流器4,什么是整流器整流器的作用是什么5,整流器是什么東西6,整流器的原理是什么逆變的原理是什么1,什么叫整流器有哪些類別把交流電變成.....

    知識 日期:2023-08-31

  • 單位脈沖響應(yīng),何為MATLAB單位脈沖響應(yīng)單位脈沖響應(yīng),何為MATLAB單位脈沖響應(yīng)

    何為MATLAB單位脈沖響應(yīng)2,單位脈沖響應(yīng)和系統(tǒng)的輸入輸出之間有什么關(guān)系請寫出表達(dá)式3,單位脈沖響應(yīng)有大小么4,脈沖響應(yīng)指的是什么5,信號與系統(tǒng)離散時間單位脈沖響應(yīng)6,何為MATLAB單位脈沖響.....

    知識 日期:2023-08-31

  • 鈦備份備份游戲數(shù)據(jù),類似鈦備份可以備份軟件的數(shù)據(jù)的鈦備份備份游戲數(shù)據(jù),類似鈦備份可以備份軟件的數(shù)據(jù)的

    使用鈦備份Open備份-2/選擇回收。本地下載APPtitanium備份Yes備份游戲和數(shù)據(jù),下載APP拇指玩by游戲-,然后點擊鈦備份和酷跑,備份,如何備份游戲和游戲在手機(jī)數(shù)據(jù)在豌豆莢和豌豆莢試試電腦備.....

    知識 日期:2023-08-31

  • d610自動包圍設(shè)定d610自動包圍設(shè)定

    尼康d610如何為景物設(shè)置色溫尼康D610為景物設(shè)置色溫其實就是設(shè)置白平衡。尼康d610如何開啟和關(guān)閉對焦輔助燈?打開相機(jī),按菜單鍵進(jìn)入菜單,然后選擇自定義設(shè)定Menu自動對焦選項,只需使用內(nèi)置.....

    知識 日期:2023-08-31

  • 直流電流,何為直流電流直流電流,何為直流電流

    何為直流電流2,什么是直流電流什么是交流電流3,什么是交流電流直流電流定義4,什么是直流電流5,什么是直流電流6,什么叫直電流和交電流1,何為直流電流直流電就是點六部隨著時間的改變而變化大.....

    知識 日期:2023-08-31