




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、哈夫曼編碼1問題分析與任務(wù)定義1.1 需求分析.1 用哈夫曼編碼進行通信可以大大提高通信利用率,縮短信息傳輸時間,降低傳輸成本。但是,這要求在發(fā)射端通過一個編碼系統(tǒng)對待傳輸?shù)臄?shù)據(jù)預(yù)先編碼,在接受端將傳來的數(shù)據(jù)進行譯碼(復(fù)原)。對于雙工信息道(既可以雙向傳輸信息的通道),每端都需要一個完整的編/譯碼系統(tǒng)。試為這樣的信息收發(fā)站寫一個哈夫曼碼的編譯/碼系統(tǒng)。.2 本演示程序中,用戶可以輸入鍵盤中的任意字符,長度為任意長,字符輸入順序不限,且允許出現(xiàn)重碼。.3 演示程序以用戶與計算機的對話方式執(zhí)行,即在計算機終端上顯示“提示信息”之后,由用戶在鍵盤上輸入演示程序中規(guī)定的運算命令,相應(yīng)的輸入數(shù)據(jù)(可慮去
2、輸入中的非法字符)和運算結(jié)果顯示在其后。.4 在本系統(tǒng)中,用戶可以對任意長的字符串可進行編碼/譯碼。1.2 設(shè)計基本要求: 一個完整的系統(tǒng)應(yīng)該包括以下功能: 初始化(initalization). 從終端讀入字符集大小n,以及n個字符和n個權(quán)值,建立哈夫曼樹, 中. 編碼(Encoding)。利用已建立好的哈夫曼樹(如不在內(nèi)存,則從文件中讀入),對文件中的正文進行編碼,然后將結(jié)果代碼存(傳輸)到文件codeFile中. 譯碼(Decoding)。利用已建好的哈夫曼樹,對傳輸?shù)竭_的CodeFile中的數(shù)據(jù)代碼進行譯碼,將譯碼結(jié)果存入文件TextFile中. 印文件代碼(Print)。將文件Cod
3、eFile以緊湊格式顯示在終端上,每行50個代碼。同時將此字符形式的編碼文件寫入文件CodePrin中。.5 印哈夫曼樹(TreePrinting)。將已在內(nèi)存中的哈夫曼樹以直觀的方式(樹或凹入表的形式)顯示在終端上,同時將此字符形式的哈夫曼樹寫入文件TreePrint中。 任務(wù)定義 1.3.1 程序執(zhí)行的命令包括:1)初始化 2)編碼 3)譯碼 4)印代碼文件 5)印哈夫曼樹 6)退出 1.3.2 測試數(shù)據(jù): 1) 利用教科書例6-2中的數(shù)據(jù)調(diào)試程序。2)用程序文件夾中的text.txt文件進行測試,并把得到的哈夫曼編碼寫入codefile.txt文件中。2數(shù)據(jù)類型和系統(tǒng)設(shè)計 2.1邏輯設(shè)計
4、 為實現(xiàn)上述程序,須將程序分模塊設(shè)計,具體設(shè)計為四個模塊:分別是二叉樹節(jié)點模塊,二叉樹實現(xiàn)的模塊,哈夫曼樹的實現(xiàn)模塊及測試模塊。各模塊的抽象數(shù)據(jù)類型如下: 二叉樹節(jié)點模塊: 本模塊中主要定義二叉樹節(jié)點的類型,包括:.1樹的節(jié)點值 m_data.2指向左孩子節(jié)點的指針 left_child.3指向右孩子節(jié)點的指針 right_child 二叉樹實現(xiàn)的模塊 本模塊中主要根據(jù)二叉樹的節(jié)點,來建立一系列的操作,即:.1 初始化一棵二叉樹 BinaryTree_T(void);.2二叉樹的賦值BinaryTree_T<T>& operator=(const BinaryTree_T&
5、lt;T>& bt).3 二叉樹的遍歷 void PreOrder(void); .4 二叉樹的清空 void Clear(void);.5 二叉樹的訪問 void Visit(const TreeNode_T<T>*ptr) 哈夫曼樹的實現(xiàn)模塊 本模塊中根據(jù)二叉樹來建立哈夫曼樹,主要包括: .1 哈夫曼樹的初始化 HfmTree_T(void) .2 哈夫曼樹的創(chuàng)建 void CreatHfmTree(void); .3 哈夫曼樹的創(chuàng)建 HfmTree_T<W>& operator=(const HfmTree_T<W> &r
6、hs); .4 文件譯碼 void Code(char *&code);; .5 文件的解碼 void GenerateCode(BinaryTree_T<int> &P); 主測試模塊 int main() HfmTree_T<int>hfmTree;hfmTree.CreatHfmTree(); hfmTree.GenerateCode(); hfmTree.DeCode(); return 0; 2.2 詳細設(shè)計 本部分內(nèi)容主要包括對模塊的抽象,及將其抽象出一般的定義,各模塊的抽象數(shù)據(jù)類型如下: 抽象數(shù)據(jù)類型TreeNode_h 用以實現(xiàn)二叉樹的節(jié)
7、點,其定義如下: Template<class T> Class TreeNode_T Private:T m_data;/樹的節(jié)點值TreeNode_T<T> *left_child;/指向左孩子節(jié)點的指針 TreeNode_T<T> *right_child;/指向右孩子節(jié)點的指針Public:/成員函數(shù) TreeNode_T(const T &data,TreeNode_T<T> *lchild=NULL, TreeNode_T<T> *rchild=NULL);T Data(void)const; TreeNode_T
8、<T>*& LeftChild(void); TreeNode_T<T>*& RightChild(void); .2 抽象數(shù)據(jù)類型BinaryTree_h用以實現(xiàn)二叉樹的操作,其定義如下:template<class T>class BinaryTree_T Public:BinaryTree_T(void); BinaryTree_T(const T &element); BinaryTree_T(const BinaryTree_T<T> &bt);BinaryTree_T(void);/賦值 BinaryT
9、ree_T<T>& operator=(const BinaryTree_T<T>& bt); TreeNode_T<T>* CopyBinaryTree(TreeNode_T<T>*ptr); /構(gòu)造二叉樹 Void MakeTree(constT&data,BinaryTree_T<T>&lhs, BinaryTree_T<T>&rhs); /前置條件:當前樹為空 lhs rhs 不等 /后置條件:lhs rhs 為空/拆開二叉樹 Void BreakTree(T&dat
10、a,BinaryTree_T<T>&lhs, BinaryTree_T<T>&rhs);/前置條件:當前樹非空,rhs lhs為空,且不等/后置條件:當前樹指空 void PreOrder(void);/前序 void InOrder(void);/中序void PostOrder(void);/后序/清空 void Clear(void); /訪問節(jié)點void Visit(const TreeNode_T<T>*ptr);/得到樹的根結(jié)點 TreeNode_T<T>* GetTreeNode(void);protected: /
11、樹的保護成員只想二叉樹節(jié)點的指針 TreeNode_T<T>* m_root;private:/樹的遍歷的私有成員函數(shù) void PreOrder(TreeNode_T<T>*ptr); void InOrder(TreeNode_T<T>*ptrvoid PostOrder(TreeNode_T<T>*ptr);void Clear(TreeNode_T<T>*ptr);.3 抽象數(shù)據(jù)類型HfmTree_h用以實現(xiàn)哈夫曼樹的操作,其定義如下: template<class W>class HfmTree_Tpublic:
12、 /幾種構(gòu)造函數(shù) HfmTree_T(void); HfmTree_T(const BinaryTree_T<int> &rhs); HfmTree_T(const HfmTree_T<W> &rhs); /析構(gòu)函數(shù)HfmTree_T(void); bool operator>(const HfmTree_T<W> &rhs)const; bool operator=(const HfmTree_T<W> &rhs)const; bool operator<(const HfmTree_T<W&g
13、t; &rhs)const; HfmTree_T<W>& operator=(const HfmTree_T<W> &rhs); /創(chuàng)建Hfm樹 void CreatHfmTree(void); operator W()const;/重載()運算符 以得到勸值 /void ShowTree(void); /記錄頻率 void GetWeight(char c); /譯碼 void Code(char *&code);; int GetNumber(int x); int GetNumber(char c); void GenerateCo
14、de(void); void DeCode(void);private: void GenerateCode(BinaryTree_T<int> &P);void GenerateCode(TreeNode_T<int> *ptr,char *c,char *&code,int &count,int k,int lev); BinaryTree_T<int>m_tree; /哈夫曼樹的權(quán)值W m_weight;3調(diào)試報告 由于文件text.txt的內(nèi)容較多,結(jié)果造成程序運的較慢,并造成部分的字母沒有被編碼。導(dǎo)致程序調(diào)試時間花費較多,且
15、最后并沒很好的解決。 3.2 本程序有些代碼重復(fù)出現(xiàn),從而減少了空間的利用率和增加了程序的雜亂性,特別是文件操作方面,如果可能的話,可以把文件的讀入讀出分別寫成一個函數(shù),將會大大增強程序的可讀性。 3.3 算法的時空分析:此程序中使用了大量的指針,且是動態(tài)申請,釋放內(nèi)存的,有效的利用了系統(tǒng)的空間,使程序執(zhí)行起來更高效。 3.4 本程序采用數(shù)據(jù)抽象的程序設(shè)計方法,將程序分為四個模塊,使得設(shè)計時思路清晰,實現(xiàn)時調(diào)試順利完成,各個模塊具有較好的可重用性,確實做到了一次良好的程序設(shè)計訓(xùn)練。 3.5 程序運行結(jié)果如下: 在text.txt文檔中輸入要編碼的文件,結(jié)果程序順利把該文件中包含的字符編碼,并進行了解碼,結(jié)果如下:4經(jīng)驗和體會、通過實驗更好的掌握了哈夫曼樹,并對哈夫曼樹有了深一步的了解、掌握了用get
溫馨提示
- 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)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025貴州師范大學(xué)輔導(dǎo)員考試試題及答案
- 2025贛州職業(yè)技術(shù)學(xué)院輔導(dǎo)員考試試題及答案
- 夏季溺水急救措施
- 西安聯(lián)豐迅聲信息科技有限公司招聘筆試題庫2025
- 手衛(wèi)生在產(chǎn)科的重要性
- 2025年咨詢工程師職業(yè)考試題及答案詳解
- 綠城誠園戶型設(shè)計
- 電擊傷急救知識
- 2025年醫(yī)學(xué)影像學(xué)研究生入學(xué)考試試卷及答案
- 2025年藝術(shù)設(shè)計專業(yè)研究生入學(xué)考試試卷及答案
- 新能源并網(wǎng)系統(tǒng)寬頻振蕩分析與抑制閱讀記錄
- 12J3-3蒸壓加氣混凝土砌塊墻
- 醫(yī)療器械經(jīng)營質(zhì)量管理體系文件模板
- 2024年天津高考英語第二次高考真題(原卷版)
- 浙江省2024年中考英語模擬試卷(含答案)
- 國開2024春《人文英語4》第5-8單元作文練習參考答案
- 2024建筑工程施工承包人工費合同書
- 社工招聘筆試考試試題及答案
- 四川省成都市2024年七年級下學(xué)期期末數(shù)學(xué)試題附答案
- 思辨與創(chuàng)新智慧樹知到期末考試答案章節(jié)答案2024年復(fù)旦大學(xué)
- MOOC 算法設(shè)計與分析-武漢理工大學(xué) 中國大學(xué)慕課答案
評論
0/150
提交評論