版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、<p><b> 《信息理論與編碼》</b></p><p><b> 課程論文</b></p><p> 題目: 霍夫曼碼研究與設(shè)計(jì) </p><p> 學(xué)生姓名: </p><p> 學(xué) 號: </p><p><b
2、> 系 別: </b></p><p> 專 業(yè): 通信工程 </p><p> 任課教師: </p><p> 2013年 6月 19 日</p><p><b> 目 錄</b></p><p><b&g
3、t; 摘 要1</b></p><p><b> 1論文課題描述2</b></p><p> 2霍夫曼設(shè)計(jì)原理2</p><p><b> 3 設(shè)計(jì)過程3</b></p><p><b> 3.1軟件介紹3</b></p><
4、p> 3.1.1 Visual C++ 6.0簡介3</p><p> 3.1.2主要部分4</p><p><b> 3.2設(shè)計(jì)內(nèi)容5</b></p><p> 4編碼程序及其分析7</p><p><b> 總 結(jié)15</b></p><p>&
5、lt;b> 參考文獻(xiàn)16</b></p><p><b> 摘 要</b></p><p> 哈夫曼編碼的應(yīng)用很廣泛,利用哈夫曼樹求得的用于通信的二進(jìn)制編碼稱為哈夫曼編碼。樹中從根到每個(gè)葉子都有一條路徑,對路徑上的各分支約定:指向左子樹的分支表示“0”碼,指向右子樹的分支表示“1”碼,取每條路徑上的“0”或“1”的序列作為和各個(gè)對應(yīng)的字符的編
6、碼,這就是哈夫曼編碼。 </p><p> 哈夫曼編碼(Huffman Coding)是一種編碼方式,也是可變字長編碼(VLC)的一種。這種方法完全依據(jù)字符出現(xiàn)的概率來構(gòu)造異字頭的平均長度最短的碼字,有時(shí)稱之為最佳編碼,一般就叫作哈夫曼編碼。對于M進(jìn)制哈弗曼編碼,為了提高編碼效率,就要使長碼的符號數(shù)量盡量少、概率盡量小,所以應(yīng)使合并的信源符號位于縮減信源序列盡可能高的位置上,以減少再次合并的次數(shù),充分
7、利用短碼。</p><p> 本文將采用三進(jìn)制哈夫曼編碼作為例子來詮釋M進(jìn)制哈夫曼編碼。</p><p> 在三進(jìn)制哈夫曼編碼中,得出碼字、平均碼長和編碼效率,構(gòu)造哈夫曼樹,沿著根節(jié)點(diǎn)到葉節(jié)點(diǎn)從左到右依次為0、1、2,保證平均碼長最小。在本文中采用Visual C++6.0進(jìn)行編程,此程序中具有輸入字符集大小和權(quán)值大小,構(gòu)造哈夫曼樹,并對用戶輸入的字符串進(jìn)行編碼等功能。</p&g
8、t;<p> 關(guān)鍵詞:哈弗曼編碼;信源;哈夫曼樹;Visual C++6.0;</p><p><b> 1論文課題描述</b></p><p> 哈夫曼(Huffman)編碼是一種常用的壓縮編碼方法,是Huffman于1952年為壓縮文本文件建立的。它的基本原理是頻繁使用的數(shù)據(jù)用較短的代碼代替,較少使用的數(shù)據(jù)用較長的代碼代替,每個(gè)數(shù)據(jù)的代碼各不相
9、同。</p><p> 哈夫曼壓縮是個(gè)無損的壓縮算法,一般用來壓縮文本和程序文件。哈夫曼壓縮屬于可變代碼長度算法一族。意思是個(gè)體符號用一個(gè)特定長度的位序列替代。因此,在文件中出現(xiàn)頻率高的符號,使用短的位序列,而那些很少出現(xiàn)的符號,則用較長的位序列。</p><p> 哈夫曼編碼是哈夫曼樹的一個(gè)應(yīng)用,是一種最優(yōu)的前綴技術(shù),然而其存在的不足卻制約了它的直接應(yīng)用。首先,其解碼時(shí)間為O(lav
10、g),其中l(wèi)avg為碼字的平均長度;其次,更為重要的是,解碼器需要知道哈夫曼編碼樹的結(jié)構(gòu),因而編碼器必須為解碼器保存或傳輸哈夫曼編碼樹。對于小量數(shù)據(jù)的壓縮而言,這是很大的開銷。因而,應(yīng)用哈夫曼編碼的關(guān)鍵是如何降低哈夫曼編碼樹的存儲空間。目前流行的很多壓縮方法都是用了該技術(shù),如GZIB、ZLIB、PNC等。</p><p><b> 2霍夫曼設(shè)計(jì)原理</b></p><
11、p> 對于多進(jìn)制哈夫曼編碼,為了提高編碼效率,就要是長碼的符號數(shù)量盡量少、概率盡量小,所以信源符號數(shù)量最好滿足n=(m-1)*k+r,其中m為進(jìn)制數(shù),k為縮減的次數(shù)。</p><p><b> 設(shè)計(jì)步驟如下:</b></p><p> [1]將信源符號按概率從大到小的順序排列,令</p><p> p(x1)≥ p(x2)≥…≥
12、p(xn)</p><p> [2]給兩個(gè)概率最小的信源符號p(xn-1)和p(xn)各分配一個(gè)碼位“0”和“1”,將這兩個(gè)信源符號合并成一個(gè)新符號,并用這兩個(gè)最小的概率之和作為新符號的概率,或者在新添加一個(gè)信源符號,令其概率為0,則個(gè)分配一個(gè)碼位“0”、“1”和“2”,將其合并,結(jié)果得到一個(gè)只包含(n-1)個(gè)信源符號的新信源。稱為信源的第一次縮減信源,用S1表示。</p><p>
13、[3]將縮減信源S1的符號仍按概率從大到小順序排列,此后每次合并3個(gè)信源符號,得到只含(n-3)個(gè)符號的縮減信源S2。</p><p> [4]重復(fù)上述步驟,直至最后,此時(shí)所剩符號的概率之和必為1。然后從最后一級縮減信源開始,依編碼路徑向前返回,就得到各信源符號所對應(yīng)的碼字。</p><p><b> 3 設(shè)計(jì)過程</b></p><p>
14、<b> 3.1軟件介紹</b></p><p> 3.1.1 Visual C++ 6.0簡介</p><p> Visual C++ 6.0,簡稱VC或者VC6.0,是微軟推出的一款C++編譯器,將“高級語言”翻譯為“機(jī)器語言(低級語言)”的程序。Visual C++是一個(gè)功能強(qiáng)大的可視化軟件開發(fā)工具。自1993年Microsoft公司推出Visual C+
15、+1.0后,隨著其新版本的不斷問世,Visual C++已成為專業(yè)程序員進(jìn)行軟件開發(fā)的首選工具。Visual C++6.0由Microsoft開發(fā), 它不僅是一個(gè)C++ 編譯器,而且是一個(gè)基于Windows操作系統(tǒng)的可視化集成開發(fā)環(huán)境(integrated development environment,IDE)。Visual C++6.0由許多組件組成,包括編輯器、調(diào)試器以及程序向?qū)ppWizard、類向?qū)lass Wizard等
16、開發(fā)工具。 這些組件通過一個(gè)名為Developer Studio的組件集成為和諧的開發(fā)環(huán)境。Microsoft的主力軟件產(chǎn)品。Visual C++是一個(gè)功能強(qiáng)大的可視化軟件開發(fā)工具。</p><p> Visual C++6.0以擁有“語法高亮”,自動編譯功能以及高級除錯(cuò)功能而著稱。比如,它允許用戶進(jìn)行遠(yuǎn)程調(diào)試,單步執(zhí)行等。還有允許用戶在調(diào)試期間重新編譯被修改的代碼,而不必重新啟動正在調(diào)試的程序。其編譯及創(chuàng)建預(yù)
17、編譯頭文件(stdafx.h)、最小重建功能及累加連結(jié)(link)著稱。這些特征明顯縮短程序編輯、編譯及連結(jié)的時(shí)間花費(fèi),在大型軟件計(jì)劃上尤其顯著。</p><p><b> 3.1.2主要部分</b></p><p> [1]Developer Studio</p><p> 圖1 Developer Studio環(huán)境</p>
18、<p> 這是一個(gè)集成開發(fā)環(huán)境,我們?nèi)粘9ぷ鞯?9%都是在它上面完成的,再加上它的標(biāo)題赫然寫著“Microsoft Visual C++”,所以很多人理所當(dāng)然的認(rèn)為,那就是Visual C++了。其實(shí)不然,雖然Developer Studio提供了一個(gè)很好的編輯器和很多Wizard,但實(shí)際上它沒有任何編譯和鏈接程序的功能,真正完成這些工作的幕后英雄后面會介紹。我們也知道,Developer Studio并不是專門用于VC
19、的,它也同樣用于VB,VJ,VID等Visual Studio家族的其他同胞兄弟。所以不要把Developer Studio當(dāng)成Visual C++, 它充其量只是Visual C++的一個(gè)殼子而已。這一點(diǎn)請切記! </p><p><b> [2]MFC</b></p><p> 從理論上來講,MFC也不是專用于Visual C++,Borland C++,C+
20、+Builder和Symantec C++同樣可以處理MFC。同時(shí),用Visual C++編寫代碼也并不意味著一定要用MFC,只要愿意,用Visual C++來編寫SDK程序,或者使用STL,ATL,一樣沒有限制。不過,Visual C++本來就是為MFC打造的,Visual C++中的許多特征和語言擴(kuò)展也是為MFC而設(shè)計(jì)的,所以用Visual C++而不用MFC就等于拋棄了Visual C++中很大的一部分功能。但是,Visual C
21、++也不等于MFC。 </p><p> [3]Platform SDK</p><p> 這才是Visual C++和整個(gè)Visual Studio的精華和靈魂,雖然我們很少能直接接觸到它。大致說來,Platform SDK是以Microsoft C/C++編譯器為核心(不是Visual C++,看清楚了),配合MASM,輔以其他一些工具和文檔資料。上面說到Developer Stu
22、dio沒有編譯程序的功能,那么這項(xiàng)工作是由誰來完成的呢?是CL,是NMAKE,和其他許許多多命令行程序,這些我們看不到的程序才是構(gòu)成Visual Studio的基石。</p><p><b> 3.2設(shè)計(jì)內(nèi)容</b></p><p> 例:對如下單符號離散無記憶信源編三進(jìn)制哈夫曼碼。</p><p> 這里:m=3,n=8</p&g
23、t;<p> 令k=3,m+k(m-1)=9,則 s=9-n=9-8=1</p><p> 所以第一次取m-s=2個(gè)符號進(jìn)行編碼。</p><p><b> 由計(jì)算可得:</b></p><p><b> 平均碼長為:</b></p><p><b> ?。?.1)&
24、lt;/b></p><p><b> 信息率為:</b></p><p><b> ?。?.2)</b></p><p><b> 編碼效率為:</b></p><p><b> ?。?.3)</b></p><p>
25、 可見:哈夫曼的編碼效率相當(dāng)高,對編碼器的要求也簡單得多。</p><p><b> 編碼過程如下:</b></p><p><b> 表1 哈夫曼編碼</b></p><p><b> 圖2 哈夫曼樹</b></p><p><b> 4編碼程序及其分析&l
26、t;/b></p><p> //**哈夫曼編碼**</p><p> #include <iostream.h></p><p> #include <math.h></p><p> #include <string.h></p><p> #include &l
27、t;stdio.h></p><p> #include <stdlib.h></p><p> #include <vector> //為了使用vector容器</p><p> using namespace std; ///vector屬于std命名域,因此使用全局命名域方式</p>
28、<p> struct Huffman_InformationSource //信源類型</p><p><b> {</b></p><p> char InformationSign[10]; //信源符號</p><p> double Probability; //概率</p><p
29、> char Code[10]; //編碼結(jié)果</p><p> int CodeLength; //碼長</p><p><b> };</b></p><p> struct HuffNode //哈夫曼樹的節(jié)點(diǎn)類型</p><p><b&g
30、t; {</b></p><p> char InformationSign[10];</p><p> double Probability;</p><p> HuffNode *LeftSubtree,*middleSubtree,*RightSubtree,*Next;</p><p> char Code[10
31、];</p><p> int CodeLength;</p><p><b> };</b></p><p> class CHuffman_3 //三進(jìn)制哈夫曼編碼</p><p><b> {</b></p><p><b> publ
32、ic:</b></p><p> CHuffman_3() //初始化</p><p><b> {</b></p><p> ISNumber=0;</p><p> AvageCodeLength=0.0;</p><p> InformationRate=0.0
33、;</p><p> CodeEfficiency=0.0;</p><p><b> }</b></p><p> ~CHuffman_3()</p><p><b> {</b></p><p> DestroyBTree(HuffTree);</p>
34、;<p><b> }</b></p><p> void Huffman_Input(); //輸入信息</p><p> void Huffman_Sort(); //排序</p><p> void Huffman_Tree(); //構(gòu)造哈夫曼樹</p&
35、gt;<p> void Huffman_Coding(); //生成哈夫曼編碼</p><p> void Huffman_CodeAnalyzing(); //結(jié)果分析</p><p> void Huffman_Display(); //顯示結(jié)果信息</p><p> void Destro
36、yBTree(HuffNode *TreePointer); //釋放資源</p><p><b> private:</b></p><p> vector<Huffman_InformationSource>ISarray; //聲明ISarray數(shù)組,初始時(shí)為空</p><p> int ISNumber;
37、 //符號個(gè)數(shù)</p><p> double AvageCodeLength; //平均碼長</p><p> double InformationRate; //信息率</p><p> double CodeEfficiency;
38、 //編碼效率</p><p> HuffNode * HuffTree; //哈夫曼樹</p><p><b> private:</b></p><p> void Huffman_Code(HuffNode *TreePointer);</p><p><b>
39、 };</b></p><p><b> //輸入信源信息</b></p><p> void CHuffman_3::Huffman_Input()</p><p><b> {</b></p><p> Huffman_InformationSource temp1={&qu
40、ot;A",0.40,"",0};</p><p> ISarray.push_back(temp1);</p><p> Huffman_InformationSource temp2={"B",0.18,"",0};</p><p> ISarray.push_back(temp2);&
41、lt;/p><p> Huffman_InformationSource temp3={"C",0.10,"",0};</p><p> ISarray.push_back(temp3);</p><p> Huffman_InformationSource temp4={"D",0.10,"&
42、quot;,0};</p><p> ISarray.push_back(temp4);</p><p> Huffman_InformationSource temp5={"E",0.07,"",0};</p><p> ISarray.push_back(temp5);</p><p> H
43、uffman_InformationSource temp6={"F",0.06,"",0};</p><p> ISarray.push_back(temp6);</p><p> Huffman_InformationSource temp7={"G",0.05,"",0};</p>&l
44、t;p> ISarray.push_back(temp7);</p><p> Huffman_InformationSource temp8={"H",0.04,"",0};</p><p> ISarray.push_back(temp8);</p><p> ISNumber=ISarray.size();
45、</p><p><b> }</b></p><p> //按概率“從大到小”排序:</p><p> void CHuffman_3::Huffman_Sort()</p><p><b> {</b></p><p> Huffman_InformationS
46、ource temp;</p><p><b> int i,j;</b></p><p> for(i=0;i<ISNumber-1;i++)</p><p> for(j=i+1;j<ISNumber;j++)</p><p> if(ISarray[i].Probability<ISarr
47、ay[j].Probability)</p><p><b> {</b></p><p> temp=ISarray[i];</p><p> ISarray[i]=ISarray[j];</p><p> ISarray[j]=temp;</p><p><b> }<
48、;/b></p><p><b> }</b></p><p> //基于ISarray數(shù)組構(gòu)造哈夫曼樹</p><p> void CHuffman_3::Huffman_Tree()</p><p><b> {</b></p><p><b>
49、 int i;</b></p><p> HuffNode *ptr1,*ptr2,*ptr3,*ptr4,*temp1,*temp2;</p><p> //(1):基于數(shù)組,創(chuàng)建單向鏈表</p><p> ptr1=new HuffNode;</p><p> strcpy(ptr1->InformationSi
50、gn,ISarray[0].InformationSign);</p><p> ptr1->Probability=ISarray[0].Probability;</p><p> strcpy(ptr1->Code,ISarray[0].Code); </p><p> ptr1->LeftSubtree=NULL;</p>
51、<p> ptr1->middleSubtree =NULL;</p><p> ptr1->RightSubtree=NULL;</p><p> ptr1->Next=NULL; </p><p> HuffTree=ptr1; //賦給數(shù)據(jù)成員HuffTree</p><p&
52、gt; for(i=1;i<ISNumber;i++)</p><p><b> {</b></p><p> ptr2=new HuffNode;</p><p> strcpy(ptr2->InformationSign,ISarray[i].InformationSign);</p><
53、;p> ptr2->Probability=ISarray[i].Probability;</p><p> strcpy(ptr2->Code,ISarray[i].Code); </p><p> ptr2->LeftSubtree=NULL;</p><p> ptr2->middleSubtree =NULL;</
54、p><p> ptr2->RightSubtree=NULL;</p><p> ptr2->Next=ptr1;</p><p> ptr1=ptr2;</p><p><b> }</b></p><p> //結(jié)果:鏈表的表頭為數(shù)組的最小元素。</p><
55、;p> HuffTree=ptr1; //使HuffTree指向鏈表頭</p><p> //(2):基于鏈表,構(gòu)造哈夫曼樹</p><p> int k; //樹的層次</p><p> int s; //需要添加的無用符號的數(shù)目。
56、</p><p> k=ceil((double)(ISNumber-3)/(3-1)); //“3”:表示三進(jìn)制</p><p> //ceil函數(shù):向上取整;</p><p> //floor函數(shù):向下取整</p><p> s=3+k*(3-1)-ISNumber;</p><p> if
57、(s==1) //第一次取m-s=3-1=2個(gè)符號</p><p><b> {</b></p><p> //合并概率最小的二個(gè)節(jié)點(diǎn)ptr1、ptr2,生成一個(gè)新節(jié)點(diǎn)ptr4:</p><p> ptr2=ptr1->Next;</p><p> ptr4=n
58、ew HuffNode;</p><p> strcpy(ptr4->InformationSign,"*");//新節(jié)點(diǎn)的符號為“*”</p><p> ptr4->Probability=ptr1->Probability+ptr2->Probability; //新節(jié)點(diǎn)的概率為二者之和</p><p>
59、 strcpy(ptr4->Code,""); </p><p> ptr4->LeftSubtree =NULL;</p><p> ptr4->middleSubtree=ptr1; //最小的節(jié)點(diǎn)ptr1成為ptr4的“中”子樹,將來賦予碼元“1”</p><p> ptr4->RightSubtree
60、=ptr2;//次小的節(jié)點(diǎn)ptr2成為ptr4的“右”子樹,將來賦予碼元“0”</p><p> HuffTree=ptr2->Next; //指向下一個(gè)節(jié)點(diǎn)</p><p><b> //重新排序:</b></p><p> temp1=HuffTree;</p><p&g
61、t; while(temp1&&(ptr4->Probability>temp1->Probability))</p><p><b> {</b></p><p> temp2=temp1;</p><p> temp1=temp1->Next;</p><p><
62、b> }</b></p><p> ptr4->Next=temp1; //插在當(dāng)前節(jié)點(diǎn)temp1之前</p><p> if(temp1==HuffTree)</p><p> HuffTree=ptr4;</p><p><b> else </b>&
63、lt;/p><p> temp2->Next=ptr4; //插在temp2節(jié)點(diǎn)之后</p><p> ptr1=HuffTree;</p><p><b> }</b></p><p> while(ptr1->Next)</p><p><b
64、> {</b></p><p> //合并概率最小的三個(gè)節(jié)點(diǎn)ptr1、ptr2,生成一個(gè)新節(jié)點(diǎn)ptr4:</p><p> ptr2=ptr1->Next;</p><p> ptr3=ptr2->Next;</p><p> ptr4=new HuffNode;</p><p>
65、; strcpy(ptr4->InformationSign,"*");//新節(jié)點(diǎn)的符號為“*”</p><p> ptr4->Probability=ptr1->Probability+ptr2->Probability</p><p> +ptr3->Probability; //新節(jié)點(diǎn)的概率為三者之
66、和</p><p> strcpy(ptr4->Code,""); </p><p> ptr4->LeftSubtree=ptr1;//最小的節(jié)點(diǎn)ptr1成為ptr4的“左”子樹,將來賦予碼元“2”</p><p> ptr4->middleSubtree=ptr2//次小的節(jié)點(diǎn)ptr2成為ptr4的“中”子樹,將來賦
67、予 “1”</p><p> ptr4->RightSubtree=ptr3;//次次小的節(jié)點(diǎn)ptr3成為ptr4的“右”子樹,將來賦予 “0”</p><p> HuffTree=ptr3->Next;</p><p> temp1=HuffTree;</p><p> while(temp1&&(ptr
68、4->Probability>temp1->Probability))</p><p><b> {</b></p><p> temp2=temp1;</p><p> temp1=temp1->Next;</p><p><b> }</b></p>
69、<p> ptr4->Next=temp1; //插在當(dāng)前節(jié)點(diǎn)temp1之前</p><p> if(temp1==HuffTree)</p><p> HuffTree=ptr4;</p><p><b> else </b></p><p> temp2-&g
70、t;Next=ptr4; //插在temp2節(jié)點(diǎn)之后</p><p> ptr1=HuffTree;</p><p><b> }</b></p><p><b> //釋放:</b></p><p> ptr1=NULL;</p><p>
71、 ptr2=NULL;</p><p> ptr3=NULL;</p><p> ptr4=NULL;</p><p> temp1=NULL;</p><p> temp2=NULL;</p><p><b> //設(shè)置根節(jié)點(diǎn):</b></p><p> st
72、rcpy(HuffTree->Code,"");</p><p> HuffTree->CodeLength=0;</p><p><b> }</b></p><p><b> //生成哈夫曼碼:</b></p><p> void CHuffman_3::
73、Huffman_Code(HuffNode *TreePointer)</p><p><b> {</b></p><p> if (TreePointer == NULL)</p><p><b> return;</b></p><p> char tempstr[10]="
74、";</p><p> if(!TreePointer->LeftSubtree&&!TreePointer->middleSubtree</p><p> &&!TreePointer->RightSubtree)</p><p><b> {</b></p>&
75、lt;p> for(int i=0;i<ISNumber;i++)</p><p> if(strcmp(ISarray[i].InformationSign,TreePointer->InformationSign)==0)</p><p><b> {</b></p><p> strcpy(ISarray[i].
76、Code,TreePointer->Code);</p><p> ISarray[i].CodeLength=TreePointer->CodeLength;</p><p><b> return;</b></p><p><b> }</b></p><p><b>
77、; return;</b></p><p><b> }</b></p><p> if(TreePointer->LeftSubtree)</p><p><b> {</b></p><p> //生成左子樹編碼:</p><p> strc
78、py(tempstr,TreePointer->Code);</p><p> strcat(tempstr,"2");</p><p> strcpy(TreePointer->LeftSubtree->Code,tempstr);</p><p> TreePointer->LeftSubtree->Cod
79、eLength=TreePointer->CodeLength+1;</p><p> Huffman_Code(TreePointer->LeftSubtree);</p><p><b> }</b></p><p> if(TreePointer->middleSubtree)</p><p&g
80、t;<b> {</b></p><p> //生成中子樹編碼:</p><p> strcpy(tempstr,TreePointer->Code);</p><p> strcat(tempstr,"1");</p><p> strcpy(TreePointer->midd
81、leSubtree->Code,tempstr);</p><p> TreePointer->middleSubtree->CodeLength=TreePointer->CodeLength+1;</p><p> Huffman_Code(TreePointer->middleSubtree);</p><p><b&g
82、t; }</b></p><p> if(TreePointer->RightSubtree)</p><p><b> {</b></p><p> //生成右子樹編碼:</p><p> strcpy(tempstr,TreePointer->Code);</p>&l
83、t;p> strcat(tempstr,"0");</p><p> strcpy(TreePointer->RightSubtree->Code,tempstr);</p><p> TreePointer->RightSubtree->CodeLength=TreePointer->CodeLength+1;</p&g
84、t;<p> Huffman_Code(TreePointer->RightSubtree);</p><p><b> }</b></p><p><b> }</b></p><p> void CHuffman_3::Huffman_Coding()</p><p>
85、;<b> {</b></p><p> Huffman_Code(HuffTree);</p><p><b> }</b></p><p><b> //編碼結(jié)果分析</b></p><p> void CHuffman_3::Huffman_CodeAnalyz
86、ing()</p><p><b> {</b></p><p> //(1):平均碼長</p><p> for(int i=0;i<ISNumber;i++)</p><p> AvageCodeLength+=ISarray[i].Probability*ISarray[i].CodeLength;&
87、lt;/p><p><b> //(2):信息率</b></p><p> int L=1; //單符號時(shí),L=1</p><p> int m=3; //三進(jìn)制編碼,m=3</p><p> InformationRate=AvageCodeLengt
88、h/L*(log(m)/log(2));</p><p> //(3):編碼效率</p><p> double Hx=0;</p><p> for(int j=0;j<ISNumber;j++) //求信源熵</p><p> Hx+=-ISarray[j].Probability*log(ISarray[j
89、].Probability)/log(2);</p><p> CodeEfficiency=Hx/InformationRate;</p><p><b> }</b></p><p><b> //顯示結(jié)果</b></p><p> void CHuffman_3::Huffman_Di
90、splay()</p><p><b> {</b></p><p> cout<<"編碼結(jié)果:"<<endl;</p><p> for(int i=0;i<ISNumber;i++)</p><p><b> {</b></p>
91、;<p> cout<<"\'"<<ISarray[i].InformationSign<<"\'"<<": "<<ISarray[i].Code<<endl;</p><p><b> }</b></p>&l
92、t;p> cout<<endl;</p><p> cout<<"平均碼長:"<<AvageCodeLength<<endl<<endl;</p><p> cout<<"信息率 :"<<InformationRate<<endl<&l
93、t;endl;</p><p> cout<<"編碼效率:"<<CodeEfficiency<<endl<<endl;</p><p><b> }</b></p><p><b> //釋放資源</b></p><p>
94、void CHuffman_3::DestroyBTree(HuffNode *TreePointer)</p><p><b> {</b></p><p> if (TreePointer!= NULL)</p><p><b> {</b></p><p> DestroyBTree(
95、TreePointer->LeftSubtree);</p><p> DestroyBTree(TreePointer->middleSubtree);</p><p> DestroyBTree(TreePointer->RightSubtree);</p><p> delete TreePointer;</p><
96、p> TreePointer = NULL;</p><p><b> }</b></p><p><b> }</b></p><p><b> //主函數(shù):</b></p><p> void main()</p><p><b
97、> {</b></p><p> CHuffman_3 YYY;</p><p> YYY.Huffman_Input();</p><p> YYY.Huffman_Sort();</p><p> YYY.Huffman_Tree();</p><p> YYY.Huffman_Cod
98、ing();</p><p> YYY.Huffman_CodeAnalyzing();</p><p> YYY.Huffman_Display();</p><p><b> }</b></p><p><b> 圖3 程序運(yùn)行結(jié)果</b></p><p><
99、;b> 總 結(jié)</b></p><p> 通過一周的課程設(shè)計(jì)使我對哈夫曼樹以及哈夫曼編碼有了更深的認(rèn)識和理解,也使我更加明白哈夫曼編碼譯碼在信息技術(shù)中的重要性和地位。 </p><p> 首先我談?wù)勎以谠O(shè)計(jì)期間我遇到的難點(diǎn)。開始的時(shí)候,代碼中有許多的錯(cuò)誤,特別是有一個(gè)“無法找到文件”的錯(cuò)誤讓我束手無策,最后還是屏蔽了定義的四個(gè)頭文件然后慢慢地改正錯(cuò)誤才讓我
100、又看到了希望。然后在實(shí)現(xiàn)文章的讀入時(shí),由于對文件不是太熟悉,只好翻開C語言書本仿照其模式編寫。許多的錯(cuò)誤讓我明白了一個(gè)道理---細(xì)心是非常重要的。同時(shí),對于編程者而言,思路清晰是相當(dāng)重要的。在適當(dāng)?shù)臅r(shí)候和同學(xué)一起交流探討是一個(gè)十分好的學(xué)習(xí)機(jī)會。請教老師也很重要,因?yàn)楫吘刮覀兪切率?,對于某些問題很難弄清楚。而且,某些錯(cuò)誤對于我們來說有時(shí)候想半天都弄不來,但老師幾下下就搞好了,這樣就更加有效地節(jié)約了時(shí)間。 </p>
101、<p> 這次課程設(shè)計(jì)不但讓我學(xué)得了一些編程知識,還學(xué)會了系統(tǒng)的做一份課程設(shè)計(jì)報(bào)告,學(xué)會了如何截圖,學(xué)會了如何更好的畫流程圖,明白了做事情只有認(rèn)真才能真正做得更好! </p><p> 這段時(shí)間里,可謂是酸甜苦辣都嘗過。有時(shí),為了一個(gè)錯(cuò)誤而焦頭爛額;有時(shí),連吃飯都是匆匆了事;但一旦程序運(yùn)行成功,總會讓我興奮不已。 </p><p> 通過這次課程設(shè)計(jì),我
102、看清楚了自己的編程功底和動手能力還不如人意,這主要是平時(shí)實(shí)踐太少的緣故。我想,在未來的暑假中,我會努力嘗試編寫一些程序。雖然我們信息管理專業(yè)的學(xué)生,但現(xiàn)在編程的能力太差了,畢竟多精通一門技術(shù)總是好事。 </p><p> 在這個(gè)程序中,還有許多地方值得完善。比如,讀出文本只能是大寫的文檔,空格和小寫不能識別,更不用說是任意的ASCⅡ碼字符了。由于時(shí)間問題,暫時(shí)不能實(shí)現(xiàn)了。我想在暑假里好好研究這個(gè)問題。
103、</p><p><b> 參考文獻(xiàn)</b></p><p> [1]曹雪虹,張宗橙.信息論與編碼.北京:清華大學(xué)出版社,2007.</p><p> [2] 傅祖蕓.信息論基礎(chǔ).北京:電子工業(yè)出版社,1989</p><p> [3] R W漢明.朱雪龍譯.編碼和信息理論.北京:科學(xué)出版社,1984</p
104、><p> [4] 王育民,梁傳甲.信息與編碼理論.西安:西安電子科技大學(xué)出版社,1986</p><p> [5] 周炯槃.信息理論基礎(chǔ).北京:人民郵電出版社,1983</p><p> [6] 鐘義信.信息科學(xué)原理.北京:北京郵電大學(xué)出版社,1996</p><p> [7]楊永國,張冬明.Visual C++6.0實(shí)用教程.北京:清
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 信息論與編碼課程設(shè)計(jì)
- 信息論與編碼課程設(shè)計(jì)
- 信息論與編碼課程設(shè)計(jì)
- 信息論與編碼課程設(shè)計(jì)
- 信息論與編碼課程設(shè)計(jì)--統(tǒng)計(jì)信源熵與香農(nóng)編碼
- 信息論與編碼課程設(shè)計(jì)--統(tǒng)計(jì)信源熵與哈夫曼編碼
- 信息論與編碼課程設(shè)計(jì)(哈夫曼編碼的分析與實(shí)現(xiàn))
- 信息論課程設(shè)計(jì)報(bào)告書
- 信息論與編碼答案
- 信息論與編碼論文
- 信息論與編碼論文
- 信息論與編碼-教案
- 信息論與編碼b課程教學(xué)大綱
- 信息論與編碼b課程教學(xué)大綱
- 信息論與編碼b課程教學(xué)大綱
- 信息論與編碼b課程教學(xué)大綱
- 信息論與編碼b課程教學(xué)大綱
- 信息論與糾錯(cuò)編碼題庫
- 信息論與編碼習(xí)題(2)
- 信息論與編碼習(xí)題答案
評論
0/150
提交評論