霽彩華年,因夢(mèng)同行—— 慶祝深圳霽因生物醫(yī)藥轉(zhuǎn)化研究院成立十周年 情緒益生菌PS128助力孤獨(dú)癥治療,權(quán)威研究顯示可顯著改善孤獨(dú)癥癥狀 PARP抑制劑氟唑帕利助力患者從維持治療中獲益,改寫(xiě)晚期卵巢癌治療格局 新東方智慧教育發(fā)布“東方創(chuàng)科人工智能開(kāi)發(fā)板2.0” 精準(zhǔn)血型 守護(hù)生命 腸道超聲可用于檢測(cè)兒童炎癥性腸病 迷走神經(jīng)刺激對(duì)抑郁癥有積極治療作用 探索梅尼埃病中 MRI 描述符的性能和最佳組合 自閉癥患者中癡呆癥的患病率增加 超聲波 3D 打印輔助神經(jīng)源性膀胱的骶神經(jīng)調(diào)節(jié) 胃食管反流病患者耳鳴風(fēng)險(xiǎn)增加 間質(zhì)性膀胱炎和膀胱疼痛綜合征的臨床表現(xiàn)不同 研究表明 多語(yǔ)言能力可提高自閉癥兒童的認(rèn)知能力 科學(xué)家揭示人類(lèi)與小鼠在主要癌癥免疫治療靶點(diǎn)上的驚人差異 利用正確的成像標(biāo)準(zhǔn)改善對(duì)腦癌結(jié)果的預(yù)測(cè) 地中海飲食通過(guò)腸道細(xì)菌變化改善記憶力 讓你在 2025 年更健康的 7 種驚人方法 為什么有些人的頭發(fā)和指甲比其他人長(zhǎng)得快 物質(zhì)的使用會(huì)改變大腦的結(jié)構(gòu)嗎 飲酒如何影響你的健康 20個(gè)月,3大平臺(tái),300倍!元育生物以全左旋蝦青素引領(lǐng)合成生物新紀(jì)元 從技術(shù)困局到創(chuàng)新錨點(diǎn),天與帶來(lái)了一場(chǎng)屬于養(yǎng)老的“情緒共振” “華潤(rùn)系”大動(dòng)作落槌!昆藥集團(tuán)完成收購(gòu)華潤(rùn)圣火 十七載“冬至滋補(bǔ)節(jié)”,東阿阿膠將品牌營(yíng)銷(xiāo)推向新高峰 150個(gè)國(guó)家承認(rèn)巴勒斯坦國(guó)意味著什么 中國(guó)海警對(duì)非法闖仁愛(ài)礁海域菲船只采取管制措施 國(guó)家四級(jí)救災(zāi)應(yīng)急響應(yīng)啟動(dòng) 涉及福建、廣東 女生查分查出608分后,上演取得理想成績(jī)“三件套” 多吃紅色的櫻桃能補(bǔ)鐵、補(bǔ)血? 中國(guó)代表三次回?fù)裘婪焦糁肛?zé) 探索精神健康前沿|情緒益生菌PS128閃耀寧波醫(yī)學(xué)盛會(huì),彰顯科研實(shí)力 圣美生物:以科技之光,引領(lǐng)肺癌早篩早診新時(shí)代 神經(jīng)干細(xì)胞移植有望治療慢性脊髓損傷 一種簡(jiǎn)單的血漿生物標(biāo)志物可以預(yù)測(cè)患有肥胖癥青少年的肝纖維化 嬰兒的心跳可能是他們說(shuō)出第一句話(huà)的關(guān)鍵 研究發(fā)現(xiàn)基因檢測(cè)正成為主流 血液測(cè)試顯示心臟存在排斥風(fēng)險(xiǎn) 無(wú)需提供組織樣本 假體材料有助于減少靜脈導(dǎo)管感染 研究發(fā)現(xiàn)團(tuán)隊(duì)運(yùn)動(dòng)對(duì)孩子的大腦有很大幫助 研究人員開(kāi)發(fā)出診斷 治療心肌炎的決策途徑 兩項(xiàng)研究評(píng)估了醫(yī)療保健領(lǐng)域人工智能工具的發(fā)展 利用女子籃球隊(duì)探索足部生物力學(xué) 抑制前列腺癌細(xì)胞:雄激素受體可以改變前列腺的正常生長(zhǎng) 肽抗原上的反應(yīng)性半胱氨酸可能開(kāi)啟新的癌癥免疫治療可能性 研究人員發(fā)現(xiàn)新基因療法可以緩解慢性疼痛 研究人員揭示 tisa-cel 療法治療復(fù)發(fā)或難治性 B 細(xì)胞淋巴瘤的風(fēng)險(xiǎn) 適量飲酒可降低高危人群罹患嚴(yán)重心血管疾病的風(fēng)險(xiǎn) STIF科創(chuàng)節(jié)揭曉獎(jiǎng)項(xiàng),新東方智慧教育榮膺雙料殊榮 中科美菱發(fā)布2025年產(chǎn)品戰(zhàn)略布局!技術(shù)方向支撐產(chǎn)品生態(tài)縱深! 從雪域高原到用戶(hù)口碑 —— 復(fù)方塞隆膠囊的品質(zhì)之旅
您的位置:首頁(yè) >綜合精選 >

霍夫曼編碼屬于有損壓縮(霍夫曼編碼)

關(guān)于霍夫曼編碼屬于有損壓縮,霍夫曼編碼這個(gè)問(wèn)題很多朋友還不知道,今天小六來(lái)為大家解答以上的問(wèn)題,現(xiàn)在讓我們一起來(lái)看看吧!

1、霍夫曼編碼是一種被廣泛應(yīng)用而且非常有效的數(shù)據(jù)壓縮技術(shù),根據(jù)待壓縮數(shù)據(jù)的特征,一個(gè)可壓縮掉20%~90%。

2、這里考慮的數(shù)據(jù)指的是字符串序列。

3、要理解霍夫曼編碼,先要理解霍夫曼樹(shù),即最優(yōu)二叉樹(shù),是一類(lèi)帶權(quán)路徑長(zhǎng)度最短的樹(shù)。

4、路徑是指從樹(shù)中一個(gè)結(jié)點(diǎn)到另一個(gè)結(jié)點(diǎn)之間的通路,路徑上的分支數(shù)目稱(chēng)為路徑長(zhǎng)度。

5、樹(shù)的路徑長(zhǎng)度是從樹(shù)根到每一個(gè)葉子之間的路徑長(zhǎng)度之和。

6、結(jié)點(diǎn)的帶權(quán)路徑長(zhǎng)度為從該結(jié)點(diǎn)到樹(shù)根之間的路徑長(zhǎng)度與該結(jié)點(diǎn)權(quán)的乘積,樹(shù)的帶權(quán)路徑長(zhǎng)度為樹(shù)中所有葉子結(jié)點(diǎn)的帶權(quán)路徑長(zhǎng)度之和.霍夫曼樹(shù)是指所有葉子結(jié)點(diǎn)的二叉樹(shù)中帶權(quán)路徑長(zhǎng)度最小的二叉樹(shù).當(dāng)給定了n個(gè)葉子結(jié)點(diǎn)的權(quán)值后,構(gòu)造出的最優(yōu)二叉樹(shù)的結(jié)點(diǎn)數(shù)目m就確定了,即m=2n-1,所以可用一維結(jié)構(gòu)樹(shù)組來(lái)存儲(chǔ)最優(yōu)二叉樹(shù)#define MAXLEAFNUM 50 /*最優(yōu)二叉樹(shù)中最大葉子樹(shù)目*/struct node{ char ch; /*當(dāng)前結(jié)點(diǎn)表示的字符,對(duì)于非葉子結(jié)點(diǎn),此域不用*/ int weight; /*當(dāng)前結(jié)點(diǎn)的權(quán)值*/ int parent; /*當(dāng)前結(jié)點(diǎn)的父結(jié)點(diǎn)的下標(biāo),為0時(shí)表示無(wú)父結(jié)點(diǎn)*/ int lchild,rchild; /*當(dāng)前結(jié)點(diǎn)的左,右孩子結(jié)點(diǎn)的下標(biāo),為0時(shí)表示無(wú)孩子結(jié)點(diǎn)*/}HuffmanTree[2 * MAXLEAFNUM];typedef char *HuffmanCode[MAXLEAFNUM + 1];創(chuàng)建最優(yōu)二叉樹(shù)void createHTree(HuffmanTree HT, char *c, int *w, int n){ /*數(shù)組c[0..n-1]和w[0..n-1]存放了n個(gè)字符及其概率,構(gòu)造霍夫樹(shù)HT*/ int i, s1, s2; if (n <= 1) return;/*根據(jù)n個(gè)權(quán)值構(gòu)造n棵只有根結(jié)點(diǎn)的二叉樹(shù)*/ for (i=1; i<=n; i++) { HT[i].ch = c[i-1]; HT[i].weight = w[i-1]; HT[i].parent = HT[i].lchild = HT[i].rchild = 0; }for (; i<2*n; ++i) { HT[i].parent = 0; HT[i].lchild = 0; HT[i].rchild = 0; }/*構(gòu)造霍夫曼樹(shù)*/ for (i=n+1; i<2*n; i++) { /*從HT[1..i-1]中選擇parent為0且weight最小的兩棵樹(shù),其序號(hào)為s1和s2*/ select(HT,i-1,s1,s2); HT[s1].parent = i; HT[s2].parent = i; HT[i].lchild = s1; HT[i].rchild = s2; HT[i].weight = HT[s1].weight + HT[s2].weight; }}應(yīng)用霍夫曼編碼假設(shè)有一個(gè)包含100 000個(gè)字符的數(shù)據(jù)文件要壓縮存儲(chǔ)。

7、各字符在該文件中的出現(xiàn)頻度見(jiàn)表1。

8、僅有6種不同字符出現(xiàn)過(guò),字符a出現(xiàn)了45000次。

9、 a b c d e f 頻度(千字) 45 13 12 16 9 5固定代碼字 000 001 010 011 100 101變長(zhǎng)代碼字 0 101 100 111 1101 1100表1 一個(gè)字符編碼問(wèn)題。

10、大小為100 000個(gè)字符的一個(gè)數(shù)據(jù)文件僅包含字符a~f,每個(gè)字符出現(xiàn)的頻度如表中所示。

11、如果對(duì)每個(gè)字符賦予一個(gè)三位的編碼,則該文件可被編碼為300000位。

12、如果利用表中的可變長(zhǎng)度編碼,該文件可被編碼為224000位。

13、可以用很多種方式來(lái)表示這樣一個(gè)文件。

14、采用固定長(zhǎng)度編碼,則需要三位二進(jìn)制數(shù)字來(lái)表示六個(gè)字符:a=000,b=001,…,f=101。

15、這種方法需要300 000來(lái)對(duì)整個(gè)原文件編碼。

16、 而可變長(zhǎng)度編碼是對(duì)頻度高的字符賦以短編碼,而對(duì)頻度低的字符賦以較長(zhǎng)一些的編碼。

17、表1顯示了這種編碼,其中一位串0表示a,四位串1100表示f。

18、這種編碼方式需要 (45*1+13*3+12*3+16*3+9*4+5*4)*1000 = 224 000 位來(lái)表示整個(gè)文件,即可壓縮掉約25%。

19、這其實(shí)就是最優(yōu)字符編碼(霍夫曼編碼)前綴編碼我們這里考慮的編碼方案中,沒(méi)有一個(gè)編碼是另一個(gè)編碼的前綴。

20、這樣的編碼稱(chēng)為前綴編碼(或許“無(wú)前綴編碼“是個(gè)更好的名字,但是前綴編碼是標(biāo)準(zhǔn)的書(shū)面語(yǔ))。

21、 對(duì)任何一種二進(jìn)制字符編碼來(lái)說(shuō)編碼總是簡(jiǎn)單的,這只要將文件中表示每個(gè)字符的編碼并置起來(lái)即可。

22、利用表1的可變長(zhǎng)度編碼,把包含三個(gè)字符的文件abc編成0 . 101 . 100 = 0 101 100,其中“.“表示并置。

23、 在前綴編碼中解碼也是很方便的。

24、因?yàn)闆](méi)有一個(gè)碼是其他碼的前綴,故被編碼文件的開(kāi)始處的編碼是確定的。

25、我們只要識(shí)別出第一個(gè)編碼,將它翻譯成原文字符,再對(duì)余下的編碼文件重復(fù)這個(gè)解碼過(guò)程即可。

26、在我們的例子中,可將串001 011 101唯一地分析為0.0.101.1101,因此可解碼為aabe。

27、 解碼過(guò)程需要有一種關(guān)于前綴編碼的方便表示,使得初始編碼可以很容易地被識(shí)別出來(lái)。

28、有一種表示方法就是葉子為給定字符的二叉樹(shù)。

29、在這種樹(shù)中,我們將一個(gè)字符的編碼解釋為從根至該字符的路徑,其中0表示“轉(zhuǎn)向左子結(jié)點(diǎn)”,1表示“轉(zhuǎn)向右子結(jié)點(diǎn)“。

30、如下給出最優(yōu)二叉樹(shù),如圖1。

31、圖1以下給出查找最優(yōu)二叉樹(shù)葉子結(jié)點(diǎn)編碼的算法typedef char *HuffmanCode[MAXLEAFNUM + 1];(本文開(kāi)頭也有說(shuō)明)void HuffmanCoding(HuffmanTree HT, HuffmanCode HC, int n){ /* n個(gè)葉子結(jié)點(diǎn)在霍夫曼樹(shù)HT中的下標(biāo)為1~n,*/ /*第i(1<= i <= n)個(gè)葉子的編碼存放HC[i]中*/ char *cd; int i,start,c,f; if (n<=1) return;/*分配n個(gè)字節(jié)的內(nèi)存,用來(lái)存放當(dāng)前得到的編碼*/ /*n個(gè)葉子結(jié)點(diǎn)最大的編碼長(zhǎng)度為n所以分配n個(gè)字節(jié)*/ cd = (char*)malloc(n) cd[n-1] = ‘/0’;for (i=1; i<=n; i++) { start = n -1; for (c=i,f=HT[i].parent; f!=0; c=f,f=HT[f].parent) /*從葉子結(jié)點(diǎn)開(kāi)始查找編碼*/ /*葉子結(jié)點(diǎn)的父結(jié)點(diǎn)的左子樹(shù)為葉子結(jié)點(diǎn),則編碼為0*/ /*否則就為父結(jié)點(diǎn)的右子樹(shù),則編碼為1*/ if (HT[f].lchild = = c) cd[--start] = ‘0’; else cd[--start] = ‘1’; /*分配內(nèi)存,分配內(nèi)存的字節(jié)數(shù)為當(dāng)前得到的字符編碼數(shù)*/ HC[i] = (char*)malloc(n-start); strcpy(HC[i], &cd[start]);}free(cd);}譯碼算法為:從根結(jié)點(diǎn)出發(fā),按二進(jìn)制位串中的0和1確定是進(jìn)入左分支還是右分支,當(dāng)?shù)竭_(dá)葉子結(jié)點(diǎn)時(shí)譯出該葉子對(duì)應(yīng)的字符。

32、數(shù)據(jù)文件(包含編碼)未結(jié)束,則回到根結(jié)點(diǎn)繼續(xù)進(jìn)行上述過(guò)程。

33、給出如下函數(shù):void Decoding(HuffmanTree HT, int n, char *buff){ /*利用具有n個(gè)葉子結(jié)點(diǎn)的最優(yōu)二叉樹(shù)(存儲(chǔ)在數(shù)組HT中)進(jìn)行譯碼,葉子的下標(biāo)*//*為1~n,buff指向數(shù)據(jù)文件的編碼序列*/int p = 2*n -1; /*指向根結(jié)點(diǎn)*/while (*buff){ if ((*buff) = = ‘0’) p = HT[p].lchild; /*進(jìn)入左分支*/ else p = HT[p].rchild; /*進(jìn)入右分支*//*到達(dá)一個(gè)葉子結(jié)點(diǎn)*/ if(HT[p].lchild = = 0 && HT[p].rchild = = 0) { printf(“%c”, HT[p].ch); p = 2*n – 1; /*回到根結(jié)點(diǎn)*/ }buff++;}}。

本文分享完畢,希望對(duì)大家有所幫助。

標(biāo)簽:

免責(zé)聲明:本文由用戶(hù)上傳,與本網(wǎng)站立場(chǎng)無(wú)關(guān)。財(cái)經(jīng)信息僅供讀者參考,并不構(gòu)成投資建議。投資者據(jù)此操作,風(fēng)險(xiǎn)自擔(dān)。 如有侵權(quán)請(qǐng)聯(lián)系刪除!

最新文章