實驗報告與總結 一、 實驗目得
1、掌握哈夫曼編碼原理; 2、熟練掌握哈夫曼樹得生成方法;
3、理解數據編碼壓縮與譯碼輸出編碼得實現. 二、實驗要求
實現哈夫曼編碼與譯碼得生成算法。
三、實驗內容 先統計要壓縮編碼得文件中得字符字母出現得次數,按字符字母與空格出現得概率對其進行哈夫曼編碼,然后讀入要編碼得文件,編碼后存入另一個文件;接著再調出編碼后得文件,并對其進行譯碼輸出,最后存入另一個文件中。
五、實驗原理 1、哈夫曼樹得定義:假設有 n 個權值,試構造一顆有 n 個葉子節點得二叉樹,每個葉子帶權值為 wi,其中樹帶權路徑最小得二叉樹成為哈夫曼樹或者最優二叉樹; 2、哈夫曼樹得構造: weight為輸入得頻率數組,把其中得值賦給依次建立得 HT Node對象中得 data 屬性,即每一個 HT Node 對應一個輸入得頻率。然后根據 data 屬性按從小到大順序排序,每次從data 取出兩個最小與此次小得 HT Node,將她們得 data相加,構造出新得HTNode 作為她們得父節點,指針 parent,leftchild,rightchild賦相應值。在把這個新得節點插入最小堆。按此步驟可以構造構造出一棵哈夫曼樹。
通過已經構造出得哈夫曼樹,自底向上,由頻率節點開始向上尋找 parent,直到 parent為樹得頂點為止。這樣,根據每次向上搜索后,原節點為父節點得左孩子還就是右孩子,來記錄1或 0,這樣,每個頻率都會有一個01編碼與之唯一對應,并且任何編碼沒有前部分就是同其她完整編碼一樣得。
六、實驗流程
① 初始化,統計文本文件中各字符得個數作為權值,生成哈夫曼樹; ② 根據符號概率得大小按由大到小順序對符號進行排序;
?、?把概率最小得兩個符號組成一個節點; ④ 重復步驟(2)(3),直到概率與為1; ⑤ 從根節點開始到相應于每個符號得“樹葉”,概率大得標“0”,概率小得標“1”; ⑥ 從根節點開始,對符號進行編碼; ⑦ 譯碼時流程逆向進行,從文件中讀出哈夫曼樹,并利用哈夫曼樹將編碼序列解碼。
七、實驗程序
#include〈iostream〉 #include〈fstream> #include<iomanip> #include<vector>
using namespace std; typedef struct
//節點結構 {
char data;
//記錄字符值
重權符字錄記//
;thgiew tni gnol? unsigned int parent,lchild,rchild; }HTNode,*HuffmanTree;
//動態分配數組存儲哈夫曼樹 typedef char * *HuffmanCode;
//動態分配數組存儲哈夫曼編碼表 void Select(HuffmanTree &HT,int i,int &s1,int &s2)
//在 HT[1、、、t]中選擇parent 不為 0 且權值最小得兩個結點,其序號分別為s1 與 s2
{
;0=2s;0=1s? ;00003=2n,00003=1n tni? for(int k=1;k<=i;k++)
{?
if(HT[k]、parent==0)
{
?。?n<thgiew、]k[TH(fi? ?
{
??? n2=n1; n1=HT[k]、weight;
??? s2=s1; s1=k;
?。?/p>
?。澹髄e?
?
if(HT[k]、weight〈n2)
{???
n2=HT[k]、weight;
??
?。?=k;
? }
}? }?} void HuffmanCoding(HuffmanTree &HT,HuffmanCode &HC,int n)//將要編碼得字符串存入空樹中 {
ifstream fin1(”zifu、txt");
ifstream fin2("weight、txt”);
if(n〈=1)return;
int m=2*n—1;
int i;
;]1+m[edoNTH wen=TH? char *zifu;
?。閚t *weight;
zifu= new char[n+1];
weight=new int[n+1];
中組數 ufiz在放符字得碼編待將//)++i;n=〈i;1=i(rof?
{? ;hc rahc??
ch=fin1、get();
?。籬c=]i[ufiz?? }
中組數 thgiew 在放值權得應對符字碼編帶將//)++i;n=〈i;1=i(rof? {?
?。鎖n2〉〉weight[i];
}
for( i=1;i〈=n;i++)
?。?/p>
;]i[ufiz=atad、]i[TH? ;]i[thgiew=thgiew、]i[TH?? }? for(i=n+1;i<=m;i++)
{
HT[i]、data=’';
?。? )++i;m=〈i;1=i(rof? {
HT[i]、parent=HT[i]、lchild=HT[i]、rchild=0;
}? )i++;m=<i;1+n=i(rof? {
;2s,1s tni??
Select(HT,i—1,s1,s2);
HT[s1]、parent=i;
HT[s2]、parent=i;
;2s=dlihcr、]i[TH
;1s=dlihcl、]i[TH?? ;thgiew、]2s[TH+thgiew、]1s[TH=thgiew、]i[TH?? }
間空作工得碼編求個一辟開;))*rahc(foezis*)1+n((collam)edoCnamffuH(=CH? ;dc* rahc? 值權放存間空辟開//;))rahc(foezis*n(collam)* rahc(=dc? cd[n-1]="\0’; for(i=1;i<=n;i++) {
;1-n=trats tni?
;f,c tni?
for( c=i, f=HT[i]、parent;f!=0;c=f,f=HT[f]、parent)//從葉子到根逆向求編碼
{
? if(HT[f]、lchild==c)
?
? cd[—-start]=’0’;//若就是左孩子編為"0"
?。澹髄e? ?
"1’為編子孩右是就若//;"1"=]trats—-[dc??
}??分碼編個i第為//
;))rahc(foezis*)trats-n((collam)* rahc(=]i[CH?配空間
strcpy(HC[i],&cd[start]);
}? delete []cd;
//釋放工作空間 } void printHuffmanTree(HuffmanTree HT,int n)
//顯示有 n 個葉子結點得哈夫曼樹得編碼表 {
ofstream fout("hfmtree、txt");
//將對應字符得得哈弗曼樹存入 "
”<〈”tnerap"<<”
”<<"thgiew”〈<”
"〈<"atad”〈〈”
"〈〈”MUN"<〈tuoc?〈<"lchild"<<”
”<〈"rchlid”〈〈endl;
for(int i=1;i<=2*n—1;i++)
{
? fout<〈HT[i]、weight〈〈setw(3)〈<HT[i]、parent〈〈setw(3)<<HT[i]、lchild<<setw(3)〈<HT[i]、rchild<<endl; <〈thgiew、]i[TH<〈)3(wtes〈<atad、]i[TH〈<)5(wtes<〈i〈〈tuoc??setw(3)〈<HT[i]、parent<<setw(3)<<HT[i]、lchild〈〈setw(3)<<HT[i]、rchild〈〈endl;
} } void printHuffmanCoding(HuffmanTree HT,HuffmanCode HC,int n)//輸出字符得對應哈弗曼編碼并存入 code、txt 文件 {
cout<〈"Huffman code is:”<〈endl;
?。?”txt、edoc”(tuof maertsfo? for(int i=1;i<=n;i++)
{?
cout<〈HT[i]、data<<” —-> ";
;ldne〈<)]i[CH(<<tuoc? ;ldne<<)]i[CH(<〈tuof?? }?} void code_ HT,HuffmanCode HC,int n)//對文件 tobetran、txt 進行編碼,并將編碼存入 codefile 文件中 {
ifstream fin("tobetran、txt");
;)”edoc”(tuof maertsfo? ;a 〉rahc〈rotcev? ;hc rahc? )’*"=!))(teg、nif=hc((elihw?
a、push_back(ch);
cout〈<"待編碼得字符串為:";
?。?+k;)(ezis、a<k;0=k tni(rof? ;]k[a〈〈tuoc??
;ldne〈〈tuoc? ;ldne<<":果結碼編 n\"〈〈tuoc? )++i;)(ezis、a〈i;0=i tni(rof? {
)++j;n=〈j;1=j tni(rof? {???)atad、]j[TH==]i[a(fi?
{? ?
fout〈<HC[j];
;kaerb??
}
? }
}? fin、close();
;)(esolc、tuof?} void Decoding(HuffmanTree HT,HuffmanCode HC,int n)//打開 codefile 文件并對文件內容進行譯碼 {
int const m=2*n—1;
ifstream fin("code”);
;)"txet"(tuof maertsfo? vector<char> a;
?。籧>>nif;c rahc(rof?
a、push_back(c);
;0=tnuoc tni? for(int k=0;k<a、size();k++)
{
? cout〈〈a[k];
? count++;
? if(count%50==0)
?;ldne〈<tuoc? }? int i=0;
值得 m 住記來 p 用//
;p tni? cout<〈endl;
?。鉶ut<<”\n 譯碼結果:”<〈endl;
while(i〈a、size())
{? 歷遍始開根得數曼弗哈從//
;m=p??
)dlihcl、]p[TH(elihw?
{
)’1’==]i[a(fi?
;dlihcr、]p[TH=p??
else
? ;dlihcl、]p[TH=p?
;++i?
?。?/p>
? fout<<HT[p]、data;
;atad、]p[TH〈〈tuoc? } } void main() {
int n;
?。鉶ut<<”輸入權值個數:”;
//設置權值數值
;n>〉nic? ;)"n\”(ftnirp? TH 樹曼夫哈//
;TH eerTnamffuH? CH表碼編曼夫哈//
;CH edoCnamffuH? 碼編曼夫哈行進//
;)n,CH,TH(gnidoCnamffuH? printHuffmanCoding(HT,HC,n);
?。@示編碼得字符
??;)"n\"(ftnirp? code_);
//顯示要編碼得字符串,并把編碼值顯示出來
串符字得后碼譯示顯并碼譯//
;)n,CH,TH(gnidoceD? ;)”n\n\n\”(ftnirp? ;)"esuap"(metsys?}
八、結果分析 哈夫曼編碼就是動態變長編碼,臨時建立概率統計表與編碼樹。概率小得碼比較長,概率小得碼比較長。概率大得碼短,這樣把一篇文件編碼后,就會壓縮許多。從樹得角度瞧,哈夫曼編碼方式就是盡量把短碼都利用上。首先,把一階節點全都用上,如果碼字不夠時,然后,再從某個節點伸出若干枝,引出二階節點作為碼字,以此類推,顯然所得碼長最短,再根據建立得概率統計表合理分布與放置,使其平均碼長最短就可以得到最佳碼。
九、實驗總結
通過這次實驗,我對二叉樹與哈希曼樹有了更好得認識。在實驗過程中,我掌握了哈曼樹得構造方法,學會了如何將理論知識傳換成實際應用。同時,在解決程序中遇到得一些問題得同時,我也對調試技巧有了更好得掌握,分析問題得能力也略有提高. 在實驗中,我遇到了許多難點,比如:統計字符得權值,就需要我們有扎實得基礎,需要有靈活得頭腦,只有不斷得練習,不斷得訓練,我們才能處理各種問題.在以后得學習中,我要不斷得努力,多聯系,多思考,我相信我能有所進步得。
推薦訪問: 編碼 實驗 報告上一篇:數據庫實驗報告,(4)
下一篇:倒立擺實驗報告
同志們:今天這個大會,是市委全面落實黨要管黨、從嚴治黨要求的一項重大舉措,也是對縣市區委書記履行基層黨建工作第一責任人情況的一次集中檢閱,同時是對全市基層黨建工作的一次再部署、再落實的會議。前面,**
***年,我認真履行領班子、帶隊伍、抓黨員、保穩定的基層黨建工作思路,以學習貫徹習近平新時代中國特色社會主義思想和黨的十九大歷次全會精神為主線,以市局基層黨建工作考核細則為落腳點,落實全面從嚴治黨主體
根據會議安排,現將2022年履行抓基層黨建工作職責情況報告如下:一、履職工作特色和亮點1 突出政治建設,著力在思想認識上提高。牢固樹立抓黨建就是抓政績的理念,以“黨建工作抓引領、社區治理求突破,為民服
2022年以來,在**黨委的正確領導下,堅持以習近平新時代中國特色社會主義思想為指導,深入學習宣傳貫徹黨的二十大精神,以黨建工作為統領,扎實開展夯實“三個基本”活動,以“四化四力”行動為抓手,聚力創建
各位領導,同志們:根據會議安排,現就2022年度抓基層黨建工作情況匯報如下:一、主要做法及成效(一)強化政治引領。一是不斷強化理論武裝。堅持通過黨組會、中心組學習會和“三會一課”,第一時間、第一議題學
2022年度抓基層黨建工作述職報告按照黨委工作部署,現將本人2022年度抓基層黨建工作情況報告如下:一、2022年度抓基層黨建工作情況(一)旗幟鮮明講政治將旗幟鮮明講政治放在全局發展首要位置,積極開展
2022年,是我在數計系黨總支書記這個新崗位上度過的第一個完整的工作年度。回首一年來在校黨委的正確領導下,與數計系領導班子和全體師生共同走過的日子,艱辛歷歷在目,收獲溫潤心田。作為黨總支書記,我始終牢
按照考核要求,現將本人一年來,作為統戰部長履行職責、廉潔自律等方面情況報告如下:一、著眼增強政治素質,不斷深化理論學習堅持把旗幟鮮明講政治作為履職從政的第一位要求,帶領統戰系統干部堅決擁護“兩個確立”
**年,緊緊圍繞黨工委、管委會的決策部署,全體人員團結協作、凝心聚力,緊扣黨工委“**”基本工作思路,全力開拓進取,認真履職盡責,圓滿完成各項工作任務。一、個人思想政治狀況檸檬文苑www bgzjy
按照縣委關于開展抓基層黨建述職評議會議的有關要求,經請示縣委組織部同意,今天,我們在此召開2022年度基層黨組織書記抓基層黨建述職評議會議。1 首先,請**黨委書記,**同志述職。**黨委能夠主動研究