5.5.3哈夫曼树和哈夫曼编码
太棒了小哥哥講的 (?? ? 3?)哈哈哈棒棒噠
?
大家好,本節(jié)后我們一起來(lái)學(xué)習(xí),二產(chǎn)數(shù)應(yīng)用的最后一個(gè)考點(diǎn)就是哈弗曼數(shù),畢竟在哈佛邁出之前,我們先來(lái)了解一個(gè)知識(shí)點(diǎn),就是什么是帶全路徑長(zhǎng)度,我們之前學(xué)習(xí)過(guò)路徑長(zhǎng)度我們一起來(lái)回憶一下路徑長(zhǎng)度指路徑上所經(jīng)歷邊的個(gè)數(shù),這要強(qiáng)調(diào)一下是邊的個(gè)數(shù),而債權(quán)的意思則是節(jié)點(diǎn)被賦予了某些特定的數(shù)值表示了一些特定的含義,比如說(shuō)它可以代表這個(gè)節(jié)點(diǎn)的使用次數(shù),或者是這個(gè)節(jié)點(diǎn)的重要性,還有知道了帶全部一些長(zhǎng)度之后,我們?cè)賮?lái)看什么是豎的帶圈路徑長(zhǎng)度豎的帶圈路徑長(zhǎng)度簡(jiǎn)稱為wpl,它是豎中所有業(yè)界點(diǎn)的帶全路徑長(zhǎng)度之和,這個(gè)也強(qiáng)調(diào)一下是業(yè)界點(diǎn)好,我們把它記為wpl=wI×lI求和,那么這里wI表示第n個(gè)節(jié)點(diǎn)的權(quán)重,mI表示df節(jié)點(diǎn)的路徑長(zhǎng)度我們將所有。 MI表示df節(jié)點(diǎn)的路徑長(zhǎng)度,我們將所有節(jié)點(diǎn)求和就可以得到數(shù)的代傳路徑長(zhǎng)度了,好,接下來(lái)我們來(lái)計(jì)算幾個(gè)數(shù)的代差工具,長(zhǎng)度我們來(lái)練習(xí)一下,這是一個(gè)。哈菲曼殊的定義函數(shù)也稱為最優(yōu)的二叉樹(shù),它是含有帶全葉子節(jié)點(diǎn)帶權(quán)路徑長(zhǎng)度最小的二手書(shū),那么我們?cè)倥e的兩個(gè)字當(dāng)中,第2個(gè)例子就是一個(gè)哈弗曼樹(shù),我們?cè)撊绾闻袛嘁豢脴?shù)為哈夫曼樹(shù)或者說(shuō)給出我們這樣三個(gè)節(jié)點(diǎn)以及它們的權(quán)重該如何構(gòu)造出他們的哈弗曼樹(shù)呢?接下來(lái)我們就來(lái)學(xué)習(xí)哈弗曼樹(shù)的構(gòu)造方法,它的第1步是將n個(gè)節(jié)點(diǎn)作為n棵,僅含有一個(gè)根節(jié)點(diǎn)的二叉樹(shù),構(gòu)成了一個(gè)cnf,接上第2步生成一個(gè)新的節(jié)點(diǎn),并從f中找出根節(jié)點(diǎn),全指最小的兩個(gè)數(shù)作為它的左右子數(shù),大家要注意一下,這里的左右指數(shù)是沒(méi)有順序的要求的,哪一棵樹(shù)作為左子樹(shù),哪一棵樹(shù)作為柚子樹(shù)都可以好,接下來(lái)最后我們就要將新節(jié)點(diǎn)的全職第二部。跟節(jié)點(diǎn)到全職之和后,這就是第2步,接下來(lái)第3步從f中刪除這兩個(gè)數(shù),并將新生成的數(shù)加入到f當(dāng)中,最后我們只需要重復(fù)2三步驟,直到f只剩下一棵樹(shù)為止,這樣我們就可以得出哈弗曼樹(shù)了,接下來(lái)我們就來(lái)看剛剛那個(gè)例子,我們有這樣三個(gè)業(yè)績(jī)點(diǎn)abc,他們的權(quán)重是723,如果構(gòu)造出剛好那一刻哈弗曼。這個(gè)大家需要注意的點(diǎn)是,開(kāi)封半數(shù)并沒(méi)有強(qiáng)調(diào)哪一棵樹(shù)要作為左子樹(shù),哪一棵樹(shù)要作為柚子樹(shù),所以哈弗曼樹(shù)是不唯一的方法,接下來(lái)我們來(lái)學(xué)習(xí)哈弗曼說(shuō)的一些重要性質(zhì),當(dāng)然這些性質(zhì)是因?yàn)楣_曼說(shuō)的特殊操作方法而產(chǎn)生的,首先第1個(gè)性質(zhì)是每個(gè)初始節(jié)點(diǎn)都會(huì)成為業(yè)界點(diǎn),生日節(jié)點(diǎn),都為新生成的經(jīng)典經(jīng)典,因?yàn)槲覀冎涝谶^(guò)錯(cuò)過(guò)程當(dāng)中,只有新上上的節(jié)點(diǎn)才會(huì)有左右子數(shù),而我們初始的業(yè)績(jī)點(diǎn)是沒(méi)有左右子數(shù)的,所以我們會(huì)有這樣的性質(zhì)好,第2種性質(zhì)是權(quán)勢(shì)越大,離跟節(jié)點(diǎn)越近,反之權(quán)勢(shì)越小會(huì)更節(jié)點(diǎn)越遠(yuǎn),這也是因?yàn)槲覀冊(cè)跇?gòu)造的過(guò)程當(dāng)中,我們會(huì)優(yōu)先選擇跟圈是最小的兩個(gè)數(shù),最后一個(gè)星星點(diǎn)到左子處出來(lái)的那些樹(shù)月月后選擇出了那些年所以會(huì)有這樣的。只會(huì)跟這個(gè)點(diǎn)越遠(yuǎn)我越喝水,根結(jié)點(diǎn)越近,所以會(huì)有這樣的性質(zhì),二接著第3條性質(zhì)是哈弗曼樹(shù)中我們有幾點(diǎn)的杜維一,這是因?yàn)槲覀冊(cè)诠ぷ鬟^(guò)程當(dāng)中我們會(huì)選擇兩個(gè)數(shù),作為一個(gè)新節(jié)點(diǎn)的子樹(shù),永遠(yuǎn)都是選擇兩個(gè)數(shù),所以所有的新節(jié)點(diǎn),所有的雙十節(jié)點(diǎn)都會(huì)有兩個(gè)手術(shù)在哈分?jǐn)?shù)當(dāng)中沒(méi)有度為一的只有度為2的新節(jié)點(diǎn),以嫉妒為領(lǐng)到的意思,結(jié)點(diǎn)也就是那些初始節(jié)點(diǎn)好,最后一個(gè)性質(zhì)則是n個(gè)葉子積淀的哈弗曼樹(shù)的節(jié)點(diǎn),總數(shù)為r減1,其中度為2的節(jié)點(diǎn)數(shù)為n-1,這個(gè)性質(zhì)也適用于沒(méi)有節(jié)點(diǎn)度為1的2查數(shù)當(dāng)中,這個(gè)性質(zhì)我們之前就提到過(guò),利用的則是我們之前一直使用的那一個(gè)等式,也就是左邊是三種度的節(jié)儉手術(shù),右邊是孩子結(jié)點(diǎn)總數(shù)以及加上根節(jié)點(diǎn)學(xué)習(xí)。他學(xué)習(xí)一個(gè)游玩哈弗曼數(shù)的重要的應(yīng)用就是解決編碼問(wèn)題,首先我們來(lái)看什么是編碼編碼,即使對(duì)于一個(gè)字符串序列用對(duì)應(yīng)的二進(jìn)制數(shù)來(lái)表示每一個(gè)字符,因?yàn)槲覀冎涝谟?jì)算機(jī)底層是沒(méi)有所謂的abc,這樣的字符的所有字符都要用01這樣的拉近數(shù)來(lái)表示,他知道什么是編碼之后我們來(lái)看,那么根據(jù)不同的編碼方式,我們分為了兩種編碼,第1種是固定長(zhǎng)度編碼,其實(shí)每一個(gè)字符對(duì)應(yīng)的二進(jìn)制數(shù)序列的長(zhǎng)度是相同的,我們來(lái)看這樣的例子,首先給出大家一個(gè)字符串序列,hello,world我們對(duì)應(yīng)著實(shí)現(xiàn)它的固定長(zhǎng)度編碼,我們可以用了三位,二定數(shù)來(lái)表示了每一個(gè)字母,其中00代表大寫(xiě)的h01代表了e,以此類推這樣的對(duì)應(yīng)關(guān)系就可以得出我們都出了這樣的啊。表示我們得出了這樣的二級(jí)數(shù)表示,還有這就是固定長(zhǎng)度編碼,大家可能會(huì)有兩點(diǎn)疑慮,第1點(diǎn)是我們?yōu)槭裁床挥瞄L(zhǎng)度較短的而且書(shū)編碼來(lái)表示每一個(gè)字母呢,比如說(shuō)我們用兩位0.5代表帶來(lái)一次不可以嗎?接下來(lái)第2個(gè)一個(gè)就是這個(gè)月我們發(fā)現(xiàn)自由式序列當(dāng)中l(wèi)的出現(xiàn)次數(shù)非常多,那么這些出現(xiàn)字?jǐn)?shù)非常多的字母,我們用較短的編碼來(lái)表示,是不是就可以得到一個(gè)較短的,而且是數(shù)pv啊,那么我們根據(jù)這樣的要求去演出了,第2種編碼方式就是可變長(zhǎng)度編碼,也就是每一個(gè)字母的編碼,它的長(zhǎng)度是不同的,是可變的它會(huì)依舊來(lái)看hello world這樣一個(gè)例子,我們根據(jù)房屋的要求實(shí)現(xiàn)了這樣的對(duì)應(yīng)關(guān)系,我們用語(yǔ)音應(yīng)用代表了大寫(xiě)的h,其中我們發(fā)現(xiàn)因?yàn)閘它出現(xiàn)的次數(shù)非常多,所以我們有一個(gè)編碼,一個(gè)給了一個(gè)這就是我們依舊用他。好,這就是對(duì)應(yīng)表,其實(shí)我們依舊用對(duì)應(yīng)表來(lái)實(shí)現(xiàn)它的二級(jí)指數(shù)序列,這就是對(duì)應(yīng)的二級(jí)指數(shù)序列,我們發(fā)現(xiàn)這樣序列是不是比之前序列要短很多呀?但是這樣的序列是不可以應(yīng)用的,為什么呢?我們來(lái)看,如果我們現(xiàn)在此時(shí)想要把一個(gè)二次函數(shù)序列轉(zhuǎn)換成它對(duì)應(yīng)的字母,對(duì)應(yīng)的字符串應(yīng)該怎樣轉(zhuǎn)換呢?在固定程度當(dāng)中我們可以由對(duì)應(yīng)關(guān)系以及每三位代表著一個(gè)字母來(lái)這樣依次的進(jìn)行轉(zhuǎn)換,就可以將二進(jìn)制數(shù)序列轉(zhuǎn)換上我們對(duì)應(yīng)的字符串了,那么在可變長(zhǎng)的編碼會(huì)出現(xiàn)這樣的問(wèn)題,比如說(shuō)我們來(lái)看我們從左到右依次轉(zhuǎn)換,我們首先遇到了玲玲,這樣兩個(gè)二進(jìn)制數(shù)那么00,這樣兩個(gè)禁術(shù)他有兩種轉(zhuǎn)換方法,第1種是轉(zhuǎn)換成也就是兩個(gè)這樣是不是就出現(xiàn)企業(yè)了所以這樣的不可用的。我們不可以轉(zhuǎn)化為對(duì)應(yīng)的字符串序列了,所以這樣的可變成編碼其實(shí)是不可用的,那么什么樣的是可用的呢?是我們接下來(lái)要學(xué)習(xí)的前置編碼,也就是沒(méi)有一個(gè)編碼是另一個(gè)編碼的前綴,那么按照這樣方法,我們就不會(huì)產(chǎn)生歧義,就不會(huì)產(chǎn)生我們剛才所出現(xiàn)的錯(cuò)誤了,那么我們來(lái)修改一下我們的對(duì)應(yīng)表,我們將對(duì)應(yīng)秒修改的這樣的情況,這里我們用一一來(lái)代表l,它縮減了對(duì)應(yīng)的長(zhǎng)度,而且沒(méi)有任意一個(gè)編碼是對(duì)應(yīng)另外一個(gè)編碼的前綴,什么意思啊?比如說(shuō)我們來(lái)看一第一不會(huì)出現(xiàn)在任何一個(gè)字母對(duì)應(yīng)編碼的前綴當(dāng)中,也就是前兩位,這樣我們?cè)诜g的時(shí)候就不會(huì)出現(xiàn)錯(cuò)誤,比如說(shuō)00它的前兩位是00,并不是11 101前兩位也不是11,然后后面的所有的字母它的前綴都不是一,這樣我們?cè)趯?shí)現(xiàn)翻譯的過(guò)程當(dāng)中就不會(huì)產(chǎn)生錯(cuò)誤,那么它實(shí)現(xiàn)的二進(jìn)制序列就是這樣的。這不會(huì)產(chǎn)生錯(cuò)誤,那么它實(shí)現(xiàn)的二進(jìn)制序列就是這樣的,它也比之前我們所實(shí)現(xiàn)的固定成的編碼要短,而且我們可以實(shí)現(xiàn)e過(guò)程也就是運(yùn)用二鍵數(shù)序列來(lái)得到對(duì)應(yīng)的字符串,還有這就是潛水編碼,那么這樣的潛射編碼應(yīng)該怎樣編寫(xiě)呢?應(yīng)該怎樣得到呢?我們就用了哈夫曼樹(shù)這樣一個(gè)特殊的二叉樹(shù),所以這樣來(lái)看一個(gè)例子大家就明白了,這給我們有5個(gè)字母,也就是abcde以及對(duì)應(yīng)的它出現(xiàn)的次數(shù)a出現(xiàn)了兩次b出現(xiàn)了三次,以此類推怎樣得到對(duì)應(yīng)的解除編碼呢?我們利用了哈夫曼樹(shù)這樣一個(gè)構(gòu)造方法,首先我們將每一個(gè)字母升上一個(gè)節(jié)點(diǎn),并且它的權(quán)重就是他的出現(xiàn)色素,所以說(shuō)我們利用函數(shù)的構(gòu)造過(guò)程構(gòu)造出了這樣一個(gè)哈夫曼樹(shù)。倒過(guò)多少構(gòu)造,出了這樣一套哈弗曼數(shù)。包括到時(shí)候漢服賣出之后,我們只需要將所有的邊賦予01就可以了,什么意思呢?我們將左邊的邊賦予為0,右邊的邊賦予為1,然后我們利用從根基點(diǎn)到某一個(gè)節(jié)點(diǎn)到邊就可以得到出它對(duì)應(yīng)的前置編碼了,比如說(shuō)從根結(jié)點(diǎn)到d節(jié)點(diǎn)的邊有00兩條邊,那么它的前置編碼就是00,我們按照這樣的關(guān)系就可以得出所有字母的前置編碼,大家有沒(méi)有發(fā)現(xiàn)沒(méi)有任何一個(gè)編碼它是另一個(gè)編碼的前綴啊,所以說(shuō)它是前置編碼,而且我們發(fā)現(xiàn)對(duì)應(yīng)次數(shù)出現(xiàn)較多的節(jié)點(diǎn),它會(huì)更靠近跟節(jié)點(diǎn),它的編碼長(zhǎng)度會(huì)更短,而次數(shù)出現(xiàn)較少的節(jié)點(diǎn)才會(huì)更遠(yuǎn)的節(jié)點(diǎn),他們的編碼長(zhǎng)度會(huì)更長(zhǎng)好,這樣我們是不是也達(dá)到了,為了縮減我們對(duì)應(yīng)的而且是序列的要求啊為什么我們可以用這樣的選擇。那么為什么我們可以用函數(shù)來(lái)構(gòu)造這樣的前綴編碼了,第1個(gè)這也是哈弗曼樹(shù)在過(guò)造的過(guò)程當(dāng)中,他優(yōu)先選擇權(quán)是較小的兩個(gè)節(jié)點(diǎn),作為新節(jié)點(diǎn)的兩個(gè)子樹(shù),那么依次向上,我們就會(huì)讓那些全是教導(dǎo)節(jié)點(diǎn)的根節(jié)點(diǎn)越來(lái)越遠(yuǎn),而確實(shí)較大的節(jié)點(diǎn)離杠精點(diǎn)越來(lái)越進(jìn),第2個(gè)特點(diǎn)是由跟進(jìn)點(diǎn)到葉結(jié)點(diǎn)都有唯一一條路徑,而且每一個(gè)硬件也都是初始接線,都是我們要求編碼的那一些字母,這就是第2個(gè)原因,好,這就是哈哈數(shù)解決前綴編碼的方法,那么最后還需要強(qiáng)調(diào)的一點(diǎn)是,哈佛函數(shù)并不唯一,因?yàn)槲覀兛梢越粨Q左右子數(shù),那么對(duì)應(yīng)了字符01也是可以交換的,所以每個(gè)字符對(duì)應(yīng)的哈方便編碼也是不唯一的,但無(wú)論怎么樣的不唯一,最終的代權(quán)路徑長(zhǎng)度是相同的而且是最優(yōu)的,因?yàn)樗且粋€(gè)阿富汗樹(shù)好,這是哈佛半數(shù)的一個(gè)重要應(yīng)用,這就是本節(jié)課的全部?jī)?nèi)容。?
總結(jié)
以上是生活随笔為你收集整理的5.5.3哈夫曼树和哈夫曼编码的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 铁道部官网如何体现了互联网思维?
- 下一篇: 岳阳学计算机软件,岳阳附近的it计算机电