




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
實驗一無失真信源編碼
一、實驗?zāi)康呐c要求
1.理解并掌握無失真信源編碼定理的內(nèi)容及支撐理論;
2.掌握唯一可譯碼的含義及判斷方法;
3.掌握赫夫曼碼的數(shù)學(xué)基礎(chǔ)、編碼原理與實現(xiàn)技術(shù);
4.掌握二進制、三進制赫夫曼碼的編碼方法與結(jié)果分析;
5.基于VisualC++環(huán)境使用面向?qū)ο蠓椒ㄔO(shè)計赫夫曼編碼軟件。
二、實驗儀器與設(shè)備
1.微型電子計算機80臺
2.Windows2000以上版本操作系統(tǒng)80套
3.VisualC++6.0開發(fā)系統(tǒng)80套
三、實驗內(nèi)容與步驟
(-)二進制赫夫曼編碼
使用以下兩種不同的方法編寫二進制赫夫曼碼:
?信源合并后的新符號排在其它相同概率的符號的前面;
?合并后的新符號排在其它相同概率的符號的后面。
具體要求:
1.使用VisualC++6.0開發(fā)環(huán)境,應(yīng)用面向?qū)ο蟮某绦蛟O(shè)計模式,編寫CHuffman_2類,并根
據(jù)具體要求,添加必須的數(shù)據(jù)成員和成員函數(shù);
2.分別求出兩種編碼方法下的平均碼長、信息率和編碼效率,并分析實際中應(yīng)選擇哪種編碼
方法;
3.添加成員函數(shù)IsUniDecodableCdoe(),以判斷赫夫曼碼是否唯一可譯碼;
4.添加成員函數(shù)IsCodingwithoutDistoryion(),以判斷赫夫曼碼是否滿足無失真編碼定理;
5.用戶可以隨機輸入多個心愿符號信息,并在主函數(shù)中至少測試兩組數(shù)據(jù),并顯示有關(guān)結(jié)果
信息。
(-)三進制赫夫曼編碼
與上述步驟類似,設(shè)計CHuffman_3類,編寫三進制赫夫曼碼。要求使用相同的測試數(shù)據(jù),
并比較平均碼長、信息率及編碼效率等,給出自己的思考結(jié)論。
(三)m進制赫夫曼編碼
設(shè)計CHuffman_m類,編寫m進制赫夫曼碼。m在運行時由用戶輸入。其它要求同上。
綜合實驗代碼及分析:
#include<iostream.h>
#include<math.h>
#include<string.h>
#include<stdio.h>
#include<stdlib.h>
#include<vector>
usingnamespacestd;
#defineMAX10〃輸入進制,最多10進制
structHuffman_InformationSource〃信源類型
charInformationsign[10];〃信源符號
doubleProbability;〃概率
charCode[20];〃編碼結(jié)果
intCodeLength;〃碼長
);
structHuffNode〃赫夫曼樹的節(jié)點類型
(
charInformationSign[10];
doubleProbability;
HuffNode*Subtree[MAX];〃子樹
HuffNode*Next;
charCode[20];
intCodeLength;
);
classCHuffman_m//赫夫曼編碼
(
public:
CHuffman_m(intM)〃初始化
m=M;
ISNumber=0;
AvageCodeLength=0.0;
InformationRate=0.0;
CodeEfficiency=0.0;
)
-CHuffman_m()
//DestroyBTree(HuffTree);
)
voidHuffman_Input();〃輸入信息
voidHuffman_Sort();//排序
voidHuffman_Tree();//構(gòu)造赫夫曼樹
voidHuffman_Coding();〃生成赫夫曼編碼
voidHuffman_CodeAnalyzing();〃結(jié)果分析
voidHuffman_Display();〃顯示結(jié)果信息
voidDestroyBTree(HuffNode*TreePointer);〃釋放資源
private:
vector<Huffman_InformationSource>ISarray;〃聲明ISarray數(shù)組,初始時為空
intISNumber;〃符號個數(shù)
doubleAvageCodeLength;〃平均碼長
doubleInformationRate;//信息率
doubleCodeEfficiency;〃編碼效率
intm;//m進制
HuffNode*HuffTree;〃赫夫曼樹
private:
voidHuffman_Code(HuffNode*TreePointer);
);//輸入信源信息
voidCHuffman_m::Huffman_Input()
{intn,i,j;
doublesum=0;
cout<<”請輸入信源符號個數(shù):”;
cin?n;
cout〈<”請信源符號和概率:H?endl;
for(i=0;i<n;i+4-)
(
HuffmanJnformationSourcetemp;
cin?temp.InformationSign;
cin?temp.Probability;
strcpy(temp.Code,',u);
temp.CodeLength=0;
ISarray.push_back(temp);
ISNumber=ISarray.size();
)
fbr(j=0;j<ISarray.size();j4-+)
sum+=ISarray[j].Probability;
if(sum==l)
return;
else
(
cout?"\a\a\a概率和不為1!請重新輸入"<<endl;
ISarray.clear();
CHuffman_m::Huffman_Input();
)
)
〃按概率"從大到小"排序:
voidCHuffman_m::Huffman_Sort()
(
HuffmanJnformationSourcetemp;
inti,j;
for(i=0;i<ISNumber-1;i++)
for(j=i+l;j<ISNumber;j++)
if(ISaiTay[i].Probability<ISaiTayfj].Probability)
(
temp=ISaiTay[i];
ISarray[i]=ISarray[j];
ISarray[j]=temp;
〃基于ISarray數(shù)組構(gòu)造赫夫曼樹
voidCHuffman_m::Huffman_Tree()
inti,j;
HuffNode*ptrl,*ptr2;
//(1):基于數(shù)組,創(chuàng)建單向鏈表
ptrl=newHuflNode;
strcpy(ptrl->InformationSign,ISarray[0].InformationSign);
ptrl->Probability=ISarray[0].Probability;
strcpy(ptrl->Code,ISarray[0].Code);
forG=0;j<m;j++)〃初始化子樹
ptrl->Subtree[j]=NULL;
ptrl->Next=NULL;
HuffTree=ptrl;〃賦給數(shù)據(jù)成員HuffTree
for(i=l;i<ISNumber;i++)
(
ptr2=newHuffNode;
strcpy(ptr2->InformationSign,ISarray(i].InfbrmationSign);
ptr2->Probability=ISarray[i].Probability;
strcpy(ptr2->Code,ISarray[i].Code);
for(j=0;j<m;j++)〃初始化子樹
ptr2->Subtree[j]=NULL;
plr2->Next=ptrl;
ptrl=ptr2;
)
〃結(jié)果:鏈表的表頭為數(shù)組的最小元素。
HuffTree=ptrl;〃使HuffTree指向鏈表頭
//(2):基于鏈表,構(gòu)造赫夫曼樹
intk;〃樹的層次
ints;〃需要添加的無用符號的數(shù)目。參看教材P140/50。
k=ceil((double)(ISNumber-m)/(m-l));//"mn:表示m進制
//ceil函數(shù):向上取整;
//floor函數(shù):向下取整
s=m+k*(m-1)-ISNumber;
HuffNode*plr4,*templ,*temp2;
if(s!=0)〃第一次取m-s個符號
(
ptr4=newHuffNode;
strcpy(ptr4->InformationSign,n*u);〃新節(jié)點的符號為"*"
ptr2=ptrl;
ptr4->Probability=0;
for(j=0;j<m-s;j++)
ptr4->Probability+=ptr2->Probability;
ptr4->Subtree[m-s-j-1]=ptr2;//最小節(jié)點成為ptr4的"第m-s-1個子樹”,將
來賦予碼元“ms1”
ptr2=ptr2->Next;
)
for(j=m-s;j<m;j++)
ptr4->Subtree|j]=NULL;
strcpy(ptr4->Code,H;
HuffTree=ptr2;
〃重新排序:
templ=HuffTree;
while(templ&&(ptr4->Probability>templ->Probability))
(
temp2=templ;
temp1=temp1->Next;
)
ptr4->Next=templ;//插在當(dāng)前節(jié)點tempi之前
if(templ==HuffTree)
HuffTree=ptr4;
else
temp2?>Next=ptr4;〃插在temp2節(jié)點之后
ptrl=HufiTree;
)
while(ptrl->Next)
(
〃合并概率最小的m個節(jié)點,生成一個新節(jié)點ptr4:
ptr4=newHuffNode;
strcpy(ptr4->InformationSign,"**');〃新節(jié)點的符號為"”
ptr4->Probability=0;
ptr2=ptrl;
for(j=0;j<m;j++)
(
ptr4->Probability+=ptr2->Probability;
ptr4->Subtree[m-j-l]=ptr2;//最小節(jié)點成為ptr4的"第m-1個子樹”,將來
賦予碼元“m-1”
ptr2=ptr2->Next;
)
strcpy(ptr4->Code,;
HuffTree=ptr2;
〃重新排序:
tempi二HuffTree;
while(temp1&&(ptr4->Probability>templ->Probability))
temp2=templ;
temp1=temp1->Next;
)
ptr4->Next=temp1;〃插在當(dāng)前節(jié)點tempi之前
if(temp1==HuflTree)
HuffTree=ptr4;
else
temp2?>Next二ptr4;〃插在temp2節(jié)點之后
plrl=HuflTree;
)
//釋放:
ptrl=NULL;
ptr2=NULL;
ptr4=NULL;
templ=NULL;
temp2=NULL;
〃設(shè)置根節(jié)點:
strcpy(HuffTree->Code,'M,);
HuffTree->CodeLength=0;
)
〃生成赫夫曼碼:
voidCHuffman_m::Huffman_Code(HuffNode*TreePointer)
(
if(TreePointer==NULL)
return;
inti;
fbr(i=0;i<m;i++)
if(TreePointer->Subtree[i])
break;
if(i==m)//如果所有子樹均為NULL
(
for(inti=O;i<ISNumber;i++)
if(strcmp(ISarray[i].InformationSign,TreePointer->InformationSign)==0)
(
strcpy(ISarray[i].Code,TreePointer->Code);
ISarray[i].CodeLength=TreePointer->CodeLength;
return;
)
return;
)
fbr(i=0;i<m;i++)
(
if(TreePointer->Subtree[i])
〃生成子樹編碼:
chartempch[5],tempstrf10]='H,;
strcpy(tempstr,TreePointer->Code);
itoa(i,tempeh,10);〃將10進制整數(shù)i轉(zhuǎn)換為字符串,保存在tempeh中。
strcat(tempstr,tempeh);
strcpy(TreePointer->Subtree[i]->Code,tempstr);
TreePointer->Subtree[i]->CodeLength=TreePointer->CodeLength+l;
Huffman_Code(TreePointer->Subtree[i]);
)
)
)
voidCHuffman_m::Huffman_Coding()
(
Huffman_Code(HuffTree);
)
〃編碼結(jié)果分析
voidCHuffman_m::Huffman_CodeAnalyzing()
(
〃(1):平均碼長
for(inti=0;i<ISNumber;i++)
AvageCodeLength+=ISarray[i].Probability*ISarray[i].CodeLength;
〃(2):信息率
intL=l;〃單符號時,L=1
InformationRate=AvageCodeLength/L*(log(m)/log(2));
〃(3):編碼效率
doubleHx=0;
for(intj=O;j<ISNumber;j++)〃求信源嫡
Hx+=-ISarray[j].Probability*log(ISarray[j].Probability)/log(2);
CodeEfficiency=Hx/InformationRate;
)
//顯示結(jié)果
voidCHuffman_m::Huffman_Display()
(
coutvv”編碼結(jié)果:"?endl;
for(inti=0;i<ISNumber;i++)
(
cout<<”\"'v<ISairay[i].InformationSign<<"\”'<<":H?ISarray[i].Code?endl;
)
cout?endl;
cout?”平均碼長:n?AvageCodeLength?endl?endl;
cout<<"信息率:n?InformationRate<<endl?endl;
cout<<"編碼效率:"v<CodeEfflciency<vendlv<endl;
〃釋放資源
voidCHuffman_m::DestroyBTree(HuffNode*TreePointer)
if(TreePointer!=NULL)
(
for(inti=0;i<m;i++)
if(TreePointer->Subtree[i])
DestroyBTree(TreePointer->Subtree[i]);
deleteTreePointer;
TreePointer=NULL;
)
)
〃主函數(shù):
voidmain()
(
intm;
do{
cout<<”請輸入進制數(shù)m(2-9):”;
cin?m;
}while(m>9||m<2);
CHuffman_mYYY(m);
YYY.HuffmanJnput();
YYY.Huffman_Sort();
YYY.Huffman_Tree();
YYY.Huffman_Coding();
YYY.Huffman_CodeAnalyzing();
Y
溫馨提示
- 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. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 上海各區(qū)初中言議論文考題選
- 4.3 平面鏡成像 說課稿 2025年初中人教版物理八年級上冊
- 賓館消防安全管理制度
- 合作協(xié)議的定價
- 任務(wù)未完成檢討書
- 委托書無效可以變更
- 寵物運輸國內(nèi)服務(wù)協(xié)議
- 航運貨物延誤答辯狀
- 二零二五年度北京市體育館體育活動組織及推廣合同
- 模具產(chǎn)業(yè)園項目可行性研究報告
- (一模)東北三省三校2025年高三第一次聯(lián)合模擬考試 生物試卷(含答案)
- 金屬熔融崗位培訓(xùn)課件
- 污水處理廠工程設(shè)備安裝施工方案及技術(shù)措施
- 2025年海南??谑兴畡?wù)局招聘事業(yè)單位人員35人歷年高頻重點模擬試卷提升(共500題附帶答案詳解)
- 2025年關(guān)聯(lián)公司資金往來協(xié)議
- 交警大隊合同范本
- 產(chǎn)業(yè)轉(zhuǎn)移課件-2024-2025學(xué)年高三一輪復(fù)習(xí)人教版(2019)地理選擇性必修2
- 2025年02月中國科協(xié)所屬單位公開招聘社會在職人員14人筆試歷年典型考題(歷年真題考點)解題思路附帶答案詳解
- 2025年江蘇鹽城市交通投資建設(shè)控股集團有限公司招聘筆試參考題庫附帶答案詳解
- 事故隱患內(nèi)部舉報獎勵制度
- 衛(wèi)生保潔管理方案及措施
評論
0/150
提交評論