哈夫曼編碼課程設(shè)計(jì)_第1頁(yè)
已閱讀1頁(yè),還剩9頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、<p><b>  摘要</b></p><p>  哈夫曼編碼是廣泛用于數(shù)據(jù)文件壓縮的十分有效的編碼方法,其在電子計(jì)算機(jī)、電視、遙控和通訊等方面廣泛使用。其壓縮通常在20%~90%之間。哈夫曼編碼算法使用字符在文件中出現(xiàn)的頻率表來(lái)建立一個(gè)用0,1串表示各字符的最優(yōu)表示方式。</p><p>  哈夫曼算法構(gòu)造的擴(kuò)充二叉樹(shù)稱(chēng)為哈夫曼編碼樹(shù)或哈夫曼樹(shù)。當(dāng)然,還

2、有編碼和譯碼部分。本系統(tǒng)的前端開(kāi)發(fā)工具是MATLAB 7.0 。用預(yù)先規(guī)定的方法將文字、數(shù)字或其他對(duì)象編成數(shù)碼,或?qū)⑿畔ⅰ?shù)據(jù)轉(zhuǎn)換成規(guī)定的電脈沖信號(hào),通過(guò)本次實(shí)驗(yàn),了解編碼的具體過(guò)程,通過(guò)編程實(shí)現(xiàn)編碼,利用matlab實(shí)現(xiàn)哈弗曼編碼。具有輸入字符集大小及權(quán)值大小,構(gòu)造哈夫曼樹(shù),并對(duì)用戶(hù)輸入的字符串進(jìn)行編碼以及譯碼兩種功能。本程序經(jīng)過(guò)測(cè)試后,功能均能實(shí)現(xiàn),運(yùn)行穩(wěn)定。</p><p>  關(guān)鍵詞:哈夫曼樹(shù),編碼,譯碼

3、,權(quán)值</p><p><b>  目 錄</b></p><p><b>  1 問(wèn)題描述1</b></p><p><b>  2 問(wèn)題分析2</b></p><p><b>  3 算法設(shè)計(jì)3</b></p><p>

4、<b>  4 算法實(shí)現(xiàn)4</b></p><p><b>  5測(cè)試分析7</b></p><p><b>  結(jié) 論9</b></p><p><b>  參考文獻(xiàn)10</b></p><p><b>  1 問(wèn)題描述</b&

5、gt;</p><p>  哈夫曼在上世紀(jì)五十年代初就提出這種編碼時(shí),根據(jù)字符出現(xiàn)的概率來(lái)構(gòu)造平均長(zhǎng)度最短的編碼。它是一種變長(zhǎng)的編碼。哈夫曼編碼應(yīng)用廣泛,如JPEG中就應(yīng)用了哈夫曼編碼。在編碼中,若各碼字長(zhǎng)度嚴(yán)格按照碼字所對(duì)應(yīng)符號(hào)出現(xiàn)概率的大小的逆序排列,則編碼的平均長(zhǎng)度是最小的。構(gòu)造好哈夫曼樹(shù)后,就可根據(jù)哈夫曼樹(shù)進(jìn)行編碼。然而怎樣構(gòu)造一棵哈夫曼樹(shù)呢?最具有一般規(guī)律的構(gòu)造方法就是哈夫曼算法。字符根據(jù)其出現(xiàn)的概率作

6、為權(quán)值構(gòu)造一棵哈夫曼樹(shù)后,經(jīng)哈夫曼編碼得到的對(duì)應(yīng)的碼值。只要使用同一棵哈夫曼樹(shù),就可把編碼還原成原來(lái)那組字符。顯然哈夫曼編碼是前綴編碼,即任一個(gè)字符的編碼都不是另一個(gè)字符的編碼的前綴,否則,編碼就不能進(jìn)行翻譯。</p><p>  利用哈夫曼算法的編碼和譯碼功能,重復(fù)地顯示并處理以下項(xiàng)目,即構(gòu)造哈夫曼樹(shù),實(shí)現(xiàn)編碼及譯碼幾項(xiàng)功能。本次設(shè)計(jì)就是為這樣的一個(gè)哈夫曼的編、譯碼器。</p><p>

7、  哈夫曼編碼所以能產(chǎn)生較短的碼文,是因?yàn)楣蚵鼧?shù)具有最小加權(quán)路徑長(zhǎng)度的二叉樹(shù)。如果葉結(jié)點(diǎn)的權(quán)值恰好是某個(gè)需編碼的文本中各字符出現(xiàn)的次數(shù),則編碼后文本的長(zhǎng)度就是該哈夫曼樹(shù)的加權(quán)路徑長(zhǎng)度。譯碼過(guò)程為自做向右逐一掃描碼文,并從哈夫曼樹(shù)的根開(kāi)始,將掃到的二進(jìn)制位串中的相鄰位與哈夫曼樹(shù)上標(biāo)的0,1相匹配,以確定一條從根到葉子結(jié)點(diǎn)的路徑,一旦到達(dá)葉子,則譯出了一個(gè)字符。再回到樹(shù)根,從二進(jìn)位串的下一位開(kāi)始繼續(xù)譯碼。軟件運(yùn)行環(huán)境及開(kāi)發(fā)工具是MATLA

8、B 7.0。</p><p><b>  2 問(wèn)題分析</b></p><p>  為了建立哈夫曼樹(shù)以及實(shí)現(xiàn)哈夫曼編碼以及譯碼,因此我們選擇了結(jié)點(diǎn)結(jié)構(gòu)體,利用這一結(jié)構(gòu)體,我們定義了一個(gè)結(jié)構(gòu)體數(shù)組和一個(gè)樹(shù)根指針,數(shù)組用來(lái)紀(jì)錄輸入數(shù)據(jù)的多少,樹(shù)根指針用來(lái)連接哈夫曼樹(shù)。從程序中可以看到使用哈夫曼算法構(gòu)造哈夫曼樹(shù)過(guò)程,是從n棵知識(shí)一個(gè)根結(jié)點(diǎn)的樹(shù)組成的森林開(kāi)始的。在算法執(zhí)行中,

9、哈夫曼樹(shù)是由若干棵樹(shù)組成的森林,通過(guò)不斷地合作樹(shù),最后得到一棵哈夫曼樹(shù)。為了便于實(shí)現(xiàn)哈夫曼樹(shù)的建樹(shù)運(yùn)算,定義程序的哈夫曼樹(shù)類(lèi)HfmTree,它包括如下兩個(gè)私有數(shù)據(jù)成員tree和weight:其中,tree是一個(gè)二叉樹(shù)BinaryTree類(lèi)型對(duì)象,是一棵哈夫曼樹(shù),weight是tree所代表的哈夫曼樹(shù)的權(quán)值。</p><p>  在本課程設(shè)計(jì)中構(gòu)造哈弗曼編碼。構(gòu)造哈夫曼樹(shù)算法:(1)用給定的一組權(quán)值{W1,W2,…

10、,Wn},生成一個(gè)有n棵樹(shù)組成的森林F={T1,T2,…Tn},其中每棵二叉樹(shù)Ti只有一個(gè)結(jié)點(diǎn),即權(quán)值為 Wi的根結(jié)點(diǎn)(也是葉子結(jié)點(diǎn));(2)從F中選擇兩棵根結(jié)點(diǎn)權(quán)值最小的樹(shù),作為新樹(shù)根的左右子樹(shù),新樹(shù)根的權(quán)值是左右子樹(shù)根結(jié)點(diǎn)的權(quán)值之和;(3)從F中刪除這兩棵樹(shù),另將新二叉樹(shù)加入F中;(4)重復(fù)(2)和(3),直到F中只包含一棵樹(shù)為止。</p><p>  本次程序設(shè)計(jì)的是哈夫曼編碼及譯碼。由建立好的哈夫曼樹(shù)來(lái)進(jìn)

11、行編碼,從根結(jié)點(diǎn)開(kāi)始,左走一步為‘0’,右走一步為‘1’,并將編碼結(jié)果存入文件中,譯碼過(guò)程為從文件中逐一掃描碼文,并從哈夫曼樹(shù)的根開(kāi)始,將掃到的二進(jìn)制位串中的相鄰位與哈夫曼樹(shù)上標(biāo)的0,1相匹配,以確定一條從根到葉子結(jié)點(diǎn)的路徑,一旦到達(dá)葉子,則譯出了一個(gè)字符。再回到樹(shù)根從二進(jìn)位串的下一位開(kāi)始繼續(xù)譯碼。 </p><p><b>  3 算法設(shè)計(jì)</b></p><p>

12、  Huffman編碼是一種可變長(zhǎng)編碼方式,是由美國(guó)數(shù)學(xué)家David Huffman創(chuàng)立的,是二叉樹(shù)的一種特殊轉(zhuǎn)化形式。編碼的原理是:將使用次數(shù)多的代碼轉(zhuǎn)換成長(zhǎng)度較短的代碼,而使用次數(shù)少的可以使用較長(zhǎng)的編碼,并且保持編碼的唯一可解性。Huffman算法的最根本的原則是:累計(jì)的(字符的統(tǒng)計(jì)數(shù)字*字符的編碼長(zhǎng)度)為最小,也就是權(quán)值(字符的統(tǒng)計(jì)數(shù)字*字符的編碼長(zhǎng)度)的和最小。</p><p>  Huffman樹(shù)是二叉

13、樹(shù)的一種特殊轉(zhuǎn)化形式。以下是構(gòu)件Huffman樹(shù)的例子:比如有以下數(shù)據(jù), ABFACGCAHGBBAACECDFGFAAEABBB先進(jìn)行統(tǒng)計(jì)A(8) B(6) C(4) D(1) E(2) F(3) G(3) H(1) 括號(hào)里面的是統(tǒng)計(jì)次數(shù)。</p><p>  生成Huffman樹(shù):每次取最小的那兩個(gè)節(jié)點(diǎn)(node)合并成一個(gè)節(jié)點(diǎn)(node),并且將累計(jì)數(shù)值相加作為新的接點(diǎn)的累計(jì)數(shù)值,最頂層的是根節(jié)點(diǎn)(roo

14、t) 注:列表中最小節(jié)點(diǎn)的是指包括合并了的節(jié)點(diǎn)在內(nèi)的所有節(jié)點(diǎn),已經(jīng)合并的節(jié)點(diǎn)不在列表。4 算法實(shí)現(xiàn)</p><p>  %哈夫曼編碼的MATLAB實(shí)現(xiàn)(基于0、1編碼):</p><p><b>  clc;</b></p><p><b>  clear;</b></p><p>  A=[0.

15、3,0.2,0.1,0.2,0.2];%信源消息的概率序列</p><p>  A=fliplr(sort(A));%按降序排列</p><p><b>  T=A;</b></p><p>  [m,n]=size(A);</p><p>  B=zeros(n,n-1);%空的編碼表(矩陣)</p>&

16、lt;p><b>  for i=1:n</b></p><p>  B(i,1)=T(i);%生成編碼表的第一列</p><p><b>  end</b></p><p>  r=B(i,1)+B(i-1,1);%最后兩個(gè)元素相加</p><p><b>  T(n-1)=r;&

17、lt;/b></p><p><b>  T(n)=0;</b></p><p>  T=fliplr(sort(T));</p><p><b>  t=n-1;</b></p><p>  for j=2:n-1%生成編碼表的其他各列</p><p><b&g

18、t;  for i=1:t</b></p><p>  B(i,j)=T(i);</p><p><b>  end</b></p><p>  K=find(T==r);</p><p>  B(n,j)=K(end);%從第二列開(kāi)始,每列的最后一個(gè)元素記錄特征元素在</p><p>

19、;<b>  %該列的位置</b></p><p>  r=(B(t-1,j)+B(t,j));%最后兩個(gè)元素相加</p><p><b>  T(t-1)=r;</b></p><p><b>  T(t)=0;</b></p><p>  T=fliplr(sort(T))

20、; </p><p><b>  t=t-1;</b></p><p><b>  end</b></p><p><b>  B;%輸出編碼表</b></p><p>  END1=sym('[0,1]');%給最后一列的元素編碼</p><

21、;p><b>  END=END1;</b></p><p><b>  t=3;</b></p><p><b>  d=1;</b></p><p>  for j=n-2:-1:1%從倒數(shù)第二列開(kāi)始依次對(duì)各列元素編碼</p><p>  for i=1:t-2<

22、;/p><p>  if i>1 & B(i,j)==B(i-1,j)</p><p><b>  d=d+1;</b></p><p><b>  else</b></p><p><b>  d=1;</b></p><p><b&g

23、t;  end</b></p><p>  B(B(n,j+1),j+1)=-1;</p><p>  temp=B(:,j+1);</p><p>  x=find(temp==B(i,j));</p><p>  END(i)=END1(x(d));</p><p><b>  end<

24、/b></p><p>  y=B(n,j+1);</p><p>  END(t-1)=[char(END1(y)),'0'];</p><p>  END(t)=[char(END1(y)),'1'];</p><p><b>  t=t+1;</b></p>&l

25、t;p><b>  END1=END;</b></p><p><b>  end</b></p><p>  A%排序后的原概率序列</p><p><b>  END%編碼結(jié)果</b></p><p><b>  for i=1:n</b><

26、;/p><p>  [a,b]=size(char(END(i)));</p><p><b>  L(i)=b;</b></p><p><b>  end</b></p><p>  avlen=sum(L.*A)%平均碼長(zhǎng) </p><p>  H1=log2(A);&l

27、t;/p><p>  H=-A*(H1')%熵</p><p>  P=H/avlen%編碼效率</p><p><b>  5 測(cè)試分析</b></p><p><b> ?。?)哈夫曼編碼</b></p><p>  對(duì)字符串進(jìn)行編碼運(yùn)行結(jié)果如圖5.2所示。</

28、p><p>  圖1 哈夫曼編碼結(jié)果</p><p><b> ?。?)哈夫曼譯碼</b></p><p>  另外就是在譯碼時(shí)沒(méi)能實(shí)用二進(jìn)制流文件對(duì)相關(guān)知識(shí)沒(méi)能融會(huì)貫通,</p><p>  圖5.3哈夫曼譯碼結(jié)果</p><p><b>  結(jié) 論</b></p>

29、;<p>  通過(guò)這次課程設(shè)計(jì),讓我對(duì)一個(gè)程序的算法有更全面更進(jìn)一步的認(rèn)識(shí),根據(jù)不同的需求,采用不同的數(shù)據(jù)存儲(chǔ)方式,不一定要用棧,二叉樹(shù)等高級(jí)類(lèi)型,有時(shí)用基本的一維數(shù)組,只要運(yùn)用得當(dāng),也能達(dá)到相同的效果,甚至更佳,就如這次的課程設(shè)計(jì),通過(guò)用for的多重循環(huán),舍棄多余的循環(huán),提高了程序的運(yùn)行效率。在編寫(xiě)這個(gè)程序的過(guò)程中,我復(fù)習(xí)了之前學(xué)的基本語(yǔ)法,哈弗曼樹(shù)最小路徑的求取,哈弗曼編碼及譯碼的應(yīng)用范圍,程序結(jié)構(gòu)算法等一系列的問(wèn)題它

30、使我對(duì)程序算法改變了看法。在這次設(shè)計(jì)過(guò)程中,體現(xiàn)出自己?jiǎn)为?dú)設(shè)計(jì)模具的能力以及綜合運(yùn)用知識(shí)的能力,體會(huì)了學(xué)以致用、突出自己勞動(dòng)成果的喜悅心情,也從中發(fā)現(xiàn)自己平時(shí)學(xué)習(xí)的不足和薄弱環(huán)節(jié),從而加以彌補(bǔ)。</p><p>  本次課程設(shè)計(jì)的目的是:把一個(gè)隨機(jī)輸入的字符串中不同字符作為葉子結(jié)點(diǎn)元素,把其在該字符串中出現(xiàn)的次數(shù)作為權(quán)值構(gòu)造一個(gè)赫夫曼樹(shù),并得到各個(gè)葉子結(jié)點(diǎn)的赫夫曼編碼和整個(gè)輸入的字符串的赫夫曼編碼。在寫(xiě)代碼前,首

31、先,對(duì)問(wèn)題進(jìn)行了分析,明確了目標(biāo),列出了大的框架,然后逐漸細(xì)化,劃分出不同的功能模塊,由具體的子函數(shù)去實(shí)現(xiàn),先在紙上編寫(xiě)代碼,寫(xiě)好后進(jìn)行了反復(fù)的邏輯推理,發(fā)現(xiàn)并解決邏輯問(wèn)題,然后,上機(jī)調(diào)試,方法是:一個(gè)一個(gè)功能模塊分開(kāi)進(jìn)行調(diào)試,主要看調(diào)試的模塊能否達(dá)到預(yù)期的結(jié)果,這樣可以縮小排錯(cuò)的范圍,便以糾錯(cuò)和提高編程的效率,當(dāng)每個(gè)功能模塊都調(diào)試好后,就把各個(gè)部分組合起來(lái),再進(jìn)行調(diào)試,主要檢查各函數(shù)接口是否正確,當(dāng)達(dá)到預(yù)期的結(jié)果,調(diào)試結(jié)束,編程部分完

32、成,然后按實(shí)驗(yàn)要求完成實(shí)驗(yàn)報(bào)告。</p><p>  由于寫(xiě)代碼前做了充分的準(zhǔn)備工作,所以寫(xiě)起代碼來(lái)比較順利,使編程的效率有不少的提高并且最終達(dá)到實(shí)驗(yàn)預(yù)期的結(jié)果。</p><p><b>  參考文獻(xiàn)</b></p><p>  [1] 蘇仕華.?dāng)?shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì).北京:機(jī)械工業(yè)出版社,2005</p><p>  [2]

33、 嚴(yán)蔚敏,吳偉民.?dāng)?shù)據(jù)結(jié)構(gòu).北京:清華大學(xué)出版社,1997</p><p>  [3]王成端, 徐翠霞.?dāng)?shù)據(jù)結(jié)構(gòu)上機(jī)實(shí)驗(yàn)與習(xí)題解析 北京-中國(guó)電力出版社,2006</p><p>  [4]Adam Drozdek.?dāng)?shù)據(jù)結(jié)構(gòu)與算法,北京:清華大學(xué)出版社,2006</p><p>  [5]李春葆,金晶.?dāng)?shù)據(jù)結(jié)構(gòu)教程.北京:清華大學(xué)出版社,2006</p&

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫(kù)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論