數(shù)據(jù)結(jié)構(gòu)課設-用哈夫曼實現(xiàn)軟件壓縮_第1頁
數(shù)據(jù)結(jié)構(gòu)課設-用哈夫曼實現(xiàn)軟件壓縮_第2頁
數(shù)據(jù)結(jié)構(gòu)課設-用哈夫曼實現(xiàn)軟件壓縮_第3頁
數(shù)據(jù)結(jié)構(gòu)課設-用哈夫曼實現(xiàn)軟件壓縮_第4頁
數(shù)據(jù)結(jié)構(gòu)課設-用哈夫曼實現(xiàn)軟件壓縮_第5頁
已閱讀5頁,還剩12頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

-.z.-----總結(jié)資料**師范大學"數(shù)據(jù)構(gòu)造"課程設計報告**:**:學院:計算機科學與技術(shù)學院題目:排序算法比擬與壓縮軟件的實現(xiàn)指導教師:二〇一四年九月一日目錄必做題3一、設計內(nèi)容3二、設計思想描述31希爾排序32快速排序33堆排序44二路歸并排序7三、程序構(gòu)造81類設計82主程序設計83流程圖9四、系統(tǒng)環(huán)境與程序測試案例9五、設計中遇到的問題及解決方案121測時間的函數(shù)不準確12其他測試運行時間的方式:132什么是"真隨機〞,什么是"偽隨機〞?143如何根據(jù)文檔構(gòu)造圖生成目錄14六、參考文獻15選做題15一、設計內(nèi)容15二、設計思想描述151Huffman樹與Huffman編碼152Huffman算法的思想153現(xiàn)有的壓縮軟件及其壓縮比16三、程序構(gòu)造171類設計172主程序設計183流程圖20四、系統(tǒng)環(huán)境與程序測試案例20五、設計中遇到的問題及解決方案23六、收獲與體會24七、參考文獻24必做題設計內(nèi)容編程實現(xiàn)希爾、快速、堆排序、歸并排序算法。要求隨機產(chǎn)生10000個數(shù)據(jù)存入磁盤文件,然后讀入數(shù)據(jù)文件,分別采用不同的排序方法進展排序,并將結(jié)果存入文件中。設計思想描述1希爾排序希爾排序是對直接插入排序的改良。根本思想是先取一個小于n的整數(shù)d1作為第一個增量,把文件的全部記錄分組,所有距離為d1的倍數(shù)的記錄放在同一個組中。先在各組內(nèi)進展直接插人排序;然后,取第二個增量d2<d1重復上述的分組和排序,直至所取的增量dt=1(dt<dt-l<…<d2<d1),即所有記錄放在同一組中進展直接插入排序為止。該方法實質(zhì)上是一種分組插入方法。舉例數(shù)據(jù)序列為〔12,5,9,20,6,31,24〕,對該數(shù)據(jù)序列進展希爾排序:12125 9 20 6 3124125 9206 312456 9122024 31初始鍵值序列第一趟排序結(jié)果〔d1=3〕〕第二趟排序結(jié)果〔d2=1〕〕具體代碼見Sort代碼.t*t!2快速排序根本思想是:通過一趟排序?qū)⒁判虻臄?shù)據(jù)分割成獨立的兩局部,其中一局部的所有數(shù)據(jù)都比另外一局部的所有數(shù)據(jù)都要小,然后再按此方法對這兩局部數(shù)據(jù)分別進展快速排序,整個排序過程可以遞歸進展,以此到達整個數(shù)據(jù)變成有序序列。舉例數(shù)據(jù)序列為〔12,5,9,20,6,31,24〕,對該數(shù)據(jù)序列進展快速排序:一次劃分12125 9 20 6 31 24125 9 20 6 31 24125 9 20 6 31 2465 9 20 1231 2465 9 20 1231 2465 9 20 1231 2465 9 12 2031 24對軸值兩側(cè)分別進展快速排序665 965 9569 592031 242031 2431 24242431 3堆排序堆排序〔Heapsort〕是指利用堆這種數(shù)據(jù)構(gòu)造所設計的一種排序算法。堆是一個近似完全二叉樹的構(gòu)造,并同時滿足堆性質(zhì):即子結(jié)點的鍵值或索引總是小于〔或者大于〕它的父結(jié)點。舉例數(shù)據(jù)序列為〔12,5,9,20,6,31,24〕,對該數(shù)據(jù)序列進展堆排序:初始:512初始:512924206311調(diào)整成小根堆659242012312525與24換624952012313調(diào)整成小根堆126952024311231195202465調(diào)整成小根堆1293152024646與31換121224195203167調(diào)整成小根堆2093152412669與24換202024195123169調(diào)整成小根堆24931524206812與24換24319512206820與31換10調(diào)整成小根堆31241124和31換951220631241212排序結(jié)果9512206244二路歸并排序?qū)蓚€按值有序序列合并成一個按值有序序列,則稱之為二路歸并排序?!?〕歸并子算法:把位置相鄰的兩個按值有序序列合并成一個按值有序序列。voidMerge(intr[],intr1[],ints,intm,intt); //一次歸并算法〔2〕一趟歸并掃描子算法:將參加排序的序列分成假設干個長度為t的,且各自按值有序的子序列,然后屢次調(diào)用歸并子算法merge將所有兩兩相鄰成對的子序列合并成假設干個長度為2t的,且各自按值有序的子序列。假設*一趟歸并掃描到最后,剩下的元素個數(shù)缺乏兩個子序列的長度時:?假設剩下的元素個數(shù)大于一個子序列的長度t時,則再調(diào)用一次歸并子算法merge將剩下的兩個不等長的子序列合并成一個有序子序列?假設剩下的元素個數(shù)小于或者等于一個子序列的長度t時,只須將剩下的元素依次復制到前一個子序列后面。voidMergePass(intr[],intr1[],intn,inth); //一趟歸并排序算法〔3〕二路歸并排序算法:將參加排序的初始序列分成長度為1的子序列使用MergePass函數(shù)進展第一趟排序,得到n/2個長度為2的各自有序的子序列〔假設n為奇數(shù),還會存在一個最后元素的子序列〕,再一次調(diào)用mergePass函數(shù)進展第二趟排序,得到n/4個長度為4的各自有序的子序列,第i趟排序就是兩兩歸并長度為2^(i-1)的子序列得到n/(2^i)長度為2^i的子序列,直到最后只剩一個長度為n的子序列。由此看出,一共需要log2n趟排序,每一趟排序的時間復雜度是O(n)。voidMergeSort1(intr[],intr1[],intn); //歸并排序非遞歸算法舉例數(shù)據(jù)序列為〔12,5,9,20,6,31,24〕,對該數(shù)據(jù)序列進展堆排序:1212592063124512920631245912206243156912202431程序構(gòu)造1類設計本程序中只含有一個類,即測執(zhí)行時間的類CTimer:classCTimer //測執(zhí)行時間的類{public: CTimer() { QueryPerformanceFrequency(&m_Frequency); Start(); } voidStart() { QueryPerformanceCounter(&m_StartCount); } doubleEnd() { LARGE_INTEGERCurrentCount; QueryPerformanceCounter(&CurrentCount); returndouble(CurrentCount.LowPart-m_StartCount.LowPart)/(double)m_Frequency.LowPart; } voidShowNow() { LARGE_INTEGERCurrentCount; QueryPerformanceCounter(&CurrentCount); cout<<"TimerCountis:"<<double(CurrentCount.LowPart-m_StartCount.LowPart)/(double)m_Frequency.LowPart<<endl; }private: LARGE_INTEGERm_Frequency; LARGE_INTEGERm_StartCount;};2主程序設計Sort.h文件中包含所有排序算法,具體代碼見Sort.h文件。test.cpp文件中包含產(chǎn)生隨機數(shù),讀寫文件,main函數(shù)和菜單控制程序。函數(shù)聲明如下:intMenu();voidMainMenuCtrl();voidWriteFile(intn);voidSaveFile(intr[],intn,charfilename[]);voidReadFile(intr[],intn);voidPrint(intr[],intn);測試時間的代碼如下:CTimert;t.Start();ShellSort(r,n); //希爾排序cout<<"希爾排序執(zhí)行時間為:"<<t.End()<<"s"<<endl;3流程圖菜單菜單產(chǎn)生隨機數(shù)并寫入文件讀文件希爾排序快速排序堆排序歸并排序?qū)⑴判蚪Y(jié)果寫入文件開場完畢系統(tǒng)環(huán)境與程序測試案例硬件環(huán)境截圖如下:軟件環(huán)境:MicrosoftVisualC++6.0110000個隨機數(shù)排序220000個隨機數(shù)排序3100000個隨機數(shù)排序測試結(jié)果數(shù)據(jù)分析:時間復雜度10000個數(shù)據(jù)20000個數(shù)據(jù)100000個數(shù)據(jù)希爾排序O(n2)0.00276598秒0.0060197秒0.0395745秒快速排序O(n)0.00172446秒0.00374468秒0.021415秒堆排序O(n)0.00263925秒0.00568505秒0.0337188秒非遞歸的歸并排序O(n)0.00174817秒0.00374692秒0.0208593秒遞歸的歸并排序O(n)0.00266666秒0.00581711秒0.0313498秒表1、各種排序執(zhí)行時間比照表圖1、各種排序執(zhí)行時間比照圖由上圖得,快速排序和非遞歸的歸并排序的排序效率高,其他3種排序速度較慢。設計中遇到的問題及解決方案1測時間的函數(shù)不準確不準確的函數(shù)如下:clock_tstart,finish;//定義開場,完畢時間doubleduration; //持續(xù)時間//測量一個事件持續(xù)的時間start=clock();ShellSort(r,n); //希爾排序finish=clock();duration=(double)(finish-start)/CLOCKS_PER_SEC;//CLK_TCK毫秒CLOCKS_PER_SEC秒cout<<"希爾排序執(zhí)行時間為:"<<duration<<"ms"<<endl;截圖如下:分析:使用clock_tclock()得到的是CPU時間,準確到1/CLOCKS_PER_SEC秒,但實際上會有誤差。clock()函數(shù)clock()定義于time.h中,clock()返回從程序運行時刻開場的時鐘周期數(shù),CLOCKS_PER_SEC定義了每秒鐘包含多少了時鐘單元數(shù)。所以得到的時間差其實是從時鐘周期數(shù)轉(zhuǎn)換過來的。CPU執(zhí)行時間=程序所含時鐘周期數(shù)×時鐘周期程序總時鐘周期數(shù)=程序所含指令條數(shù)=此時的CPI是該機器指令集中的所有指令執(zhí)行所用的平均時鐘周期數(shù),是一個平均數(shù),即可近似的認為三次排序時的CPI一樣。時鐘周期即CPU主頻的倒數(shù),為一個定值。所以三次排序下此條件一樣。所以得到如下結(jié)論:當程序所含的指令條數(shù)越多時,此種方法測到的時鐘周期數(shù)越多,所反映的時間越長,造成了實驗結(jié)果的不準確。其他測試運行時間的方式:〔1〕GetTickCount()函數(shù):GetTickCount記錄了從系統(tǒng)啟動時經(jīng)過的時間,準確到毫秒。在windows下實現(xiàn)(毫秒級):注意要添加頭文件<windows.h>。DWORDdwStart=GetTickCount(); //取windows啟動到現(xiàn)在的流逝時間(毫秒)Run_Your_Func(...);//運行你的函數(shù)DWORDdwUsed=GetTickCount()-dwStart; //計算該函數(shù)所消耗的時間〔2〕對于一般的實時控制,使用GetTickCount()函數(shù)就可以滿足精度要求,但要進一步提高計時精度,就要采用QueryPerformanceFrequency()函數(shù)和QueryPerformanceCounter()函數(shù)。這兩個函數(shù)是VC提供的僅供Windows9*使用的高精度時間函數(shù),并要求計算機從硬件上支持高精度計時器。CTimer類如下:classCTimer //測執(zhí)行時間的類{public: CTimer() { QueryPerformanceFrequency(&m_Frequency); Start(); } voidStart() { QueryPerformanceCounter(&m_StartCount); } doubleEnd() { LARGE_INTEGERCurrentCount; QueryPerformanceCounter(&CurrentCount); returndouble(CurrentCount.LowPart-m_StartCount.LowPart)/(double)m_Frequency.LowPart; } voidShowNow() { LARGE_INTEGERCurrentCount; QueryPerformanceCounter(&CurrentCount); cout<<"TimerCountis:"<<double(CurrentCount.LowPart-m_StartCount.LowPart)/(double)m_Frequency.LowPart<<endl; }private: LARGE_INTEGERm_Frequency; LARGE_INTEGERm_StartCount;};〔3〕寫一個測試執(zhí)行時間的宏#include"window.h"#defineBEGIN_RECORD\{\long____temp_begin_time___;\____temp_begin_time___=::GetTickCount();#defineEND_RECORD(dtime)\dtime=::GetTickCount()-____temp_begin_time___;\}用法:longtim;BEGIN_RECORD被測函數(shù);END_RECORD(tim); //tim就是所求的時間差!2什么是"真隨機〞,什么是"偽隨機〞?(1)、偽隨機數(shù):一方面它是可以預先確定的,并且是可以重復地生產(chǎn)和復制的;一方面它又具有*種隨機序列的隨機特性。(2)、真隨機數(shù):它是相對于偽隨機數(shù)而言的,不具有規(guī)律,但計算機不會產(chǎn)生絕對隨機的隨機數(shù)。MicrosoftVC++產(chǎn)生隨機數(shù)的原理: Srand()和Rand()函數(shù)。它本質(zhì)上是利用線性同余法,y=a*+b(modm)。其中a,b,m都是常數(shù)。因此rand的產(chǎn)生決定于*,*被稱為Seed。Seed需要程序中設定,一般情況下取系統(tǒng)時間作為種子。它產(chǎn)生的隨機數(shù)之間的相關(guān)性很小,取值范圍是0—32767〔int〕,即雙字節(jié)〔16位數(shù)〕,假設用unsignedint雙字節(jié)是65535,四字節(jié)是4294967295,一般可以滿足要求。一樣種子下產(chǎn)生的隨機尋列是一樣的。3如何根據(jù)文檔構(gòu)造圖生成目錄 電子版文檔點擊"視圖〞→"文檔構(gòu)造圖〞編成目錄,點擊可快速,且目錄隨時能夠看到;紙質(zhì)版文檔點擊"插入〞→"引用〞→"索引和目錄〞。二者前提都要點擊"視圖〞→"大綱〞,編輯標題級別。參考文獻[1]DoubleLi——c++計算代碼執(zhí)行時間的方法〔毫秒級〕:.blogs./lidabo/archive/2013/01/08/2850418.html[2]aaronalan的專欄——GetTickCount()用法:[3]許明吉博客——GetTickCount()函數(shù)的作用和用法.blogs./j*soft/archive/2011/10/17/2215366.html選做題設計內(nèi)容設有一個文本文件A〔可以是C源程序〕,統(tǒng)計該文件中各字符的頻率,對各字符進展Huffman編碼,將該文件翻譯成Huffman編碼文件B,再將Huffman編碼文件譯碼成文件C,并對文件A與C進展比擬。設計思想描述1Huffman編碼Huffman樹是在葉子結(jié)點集合確定的前提下,所有可能的二叉樹形態(tài)中樹的帶權(quán)路徑長度最小的二叉樹。當Huffman樹應用于信息編碼領(lǐng)域時,葉子結(jié)點被用于表示待編碼的符號。將每個結(jié)點的左分支記作0,右分支記作1,則每個葉子結(jié)點的路徑可以用一個0/1串的編碼來表示,稱為Huffman編碼。Huffman編碼是一種可變長編碼方式,編碼的原理是:將使用次數(shù)多的代碼轉(zhuǎn)換成長度較短的代碼,而使用次數(shù)少的可以使用較長的編碼,并且保持編碼的唯一可解性。Huffman算法的最根本的原則是:累計的(字符的統(tǒng)計數(shù)字*字符的編碼長度)為最小,也就是權(quán)值(字符的統(tǒng)計數(shù)字*字符的編碼長度)的和最小。2Huffman算法的思想Huffman算法的思想可以概括為2次掃描。第一次是根據(jù)輸入的字符計算各個字符的頻率,并根據(jù)頻率給每個字符編碼;第二次掃描時對每個輸入的字符進展匹配,并把輸入的字符轉(zhuǎn)換為編碼輸出到壓縮文件中。為了得到文本中字符出現(xiàn)的頻率,一般的做法是掃描整個文本進展統(tǒng)計,編寫程序統(tǒng)計文本中各個字符出現(xiàn)的頻率。由于一個字符的范圍在[0-255]之間,即共有256個狀態(tài)。所以直接向系統(tǒng)靜態(tài)的申請一個長度為256的整數(shù)數(shù)組,用于存放相應的頻率。得到頻率后進展哈夫曼編碼,然后將數(shù)據(jù)輸出到文件保存。3現(xiàn)有的壓縮軟件及其壓縮比〔1〕WinZIPZIP是最常見的壓縮文件格式,Windows系統(tǒng)已經(jīng)集成了對ZIP壓縮格式的支持。經(jīng)歷過DOS時代的用戶可能還記得ARJ格式,它根本就是DOS時代的ZIP,直到ZIP格式出現(xiàn),以更高的壓縮效率取代了ARJ,成為用戶的首選。現(xiàn)在大多數(shù)操作系統(tǒng)都會集成對ZIP文件的支持,而所有的壓縮軟件也都會提供對ZIP文件的支持,這些足以表達出ZIP格式的地位。ZIP時代最知名的壓縮軟件就要數(shù)WinZIP了,它幾乎是當時每臺電腦都必備的軟件。直到Windows系統(tǒng)開場集成了對ZIP文件的支持,以及后起之秀RAR格式的出現(xiàn),使得WinZIP不再是則必要,才讓它逐漸淡出了大家的視線?!?〕WinRARRAR格式的文件壓縮率比ZIP更高。同樣的文件使用RAR格式進展壓縮后得到的大小通常都會比使用ZIP壓縮后更小,而用戶對文件進展壓縮的主要目的就是要減小文件大小以便于網(wǎng)絡傳輸,正巧RAR格式又出現(xiàn)在網(wǎng)絡剛剛開場普及之時,所以RAR逐漸取代ZIP的地位也就是情理之中的事了。對RAR文件進展壓縮或者解壓縮,首選的軟件當然是WinRAR。與之前的WinZIP一樣,它幾乎也是現(xiàn)在每臺電腦都必裝的軟件。圖2WinZip12.0和WinRAR壓縮視頻文件最終結(jié)果圖表圖3WinZip12.0和WinRAR壓縮視頻文件最終結(jié)果圖表圖4WinZip12.0和WinRAR壓縮文檔文件最終結(jié)果圖表〔3〕7Z作為壓縮格式的后起新秀,7Z有著比RAR更高的壓縮率,能夠?qū)⑽募嚎s得更加小巧。不過因為RAR格式已經(jīng)高度普及,7Z想要取代RAR目前的地位相當不容易。與之前兩種格式一樣,7Z也有著專門支持它的軟件:7-zip。使用7-zip可以解壓縮RAR格式的壓縮文件,而WinRAR也同樣可以解壓縮7Z格式的壓縮文件。大概因為直接使用現(xiàn)有的Win-RAR就可以處理網(wǎng)絡上下載到的7Z格式文件,而要將文件壓縮成7Z格式的話卻需要額外安裝7-zip,所以也間接阻礙了7Z格式的普及?!?〕CABCAB是微軟的一種安裝文件壓縮格式,主要應用于軟件的安裝程序中。因為涉及到安裝程序,所以CAB文件中包含的文件通常都不是簡單的直接壓縮,而是對文件名等都進展了處理,所以雖然可以對其直接解壓縮,但解壓后得到的文件通常都無法直接使用。和ZIP一樣,Windows系統(tǒng)自身就可以翻開CAB格式的文件,而幾乎所有壓縮軟件也都可以對CAB文件進展解壓?!?〕WinMount最后單獨介紹一個軟件:Win-Mount。當解壓縮一個文件時,就必然會多占用一些磁盤空間,因為磁盤上同時存在了壓縮文件和解壓后的文件。而WinMount的特點就是能夠?qū)嚎s文件以類似虛擬光驅(qū)的方式掛接為一個虛擬磁盤供用戶使用,因為所有的操作都是在內(nèi)存中進展的,并沒有實際執(zhí)行任何的解壓縮操作,所以不會占用額外的磁盤空間。這對于一些用戶來說,可能還是很有幫助的。程序構(gòu)造1類設計哈夫曼樹的結(jié)點構(gòu)造如下:structHuffNode //哈夫曼樹結(jié)點的定義{ chardata; //待編碼的符號 doubleweight; //符號出現(xiàn)的頻率 intlchild,rchild,parent; //父結(jié)點左右孩子結(jié)點的位置};哈夫曼樹類的構(gòu)造如下:classHuffTree{public: HuffTree(vector<HuffNode>&leaves); //構(gòu)造函數(shù) vector<int>Getcode(inti); //取編碼 stringDecode(vector<int>&source); //譯碼 stringDecode(string&source); //譯碼 ~HuffTree(){} intGetn(){returnn;} //返回葉子結(jié)點數(shù) charGetData(inti){returnhufftree[i].data;} //返回葉子結(jié)點的值 HuffNodeGetNode(inti){returnhufftree[i];}private: voidSelectSmall(int&least,int&less,inti);private: vector<HuffNode>hufftree; //所有結(jié)點的存儲空間 intn; //葉子結(jié)點數(shù)};哈夫曼樹類有2個私有成員vector<HuffNode>類型的hufftree〔所有結(jié)點的存儲空間〕和int類型的n〔葉子結(jié)點數(shù)〕。有1個編碼函數(shù)vector<int>Getcode(inti)和2個譯碼函數(shù),如下:stringDecode(vector<int>&source); //哈夫曼編碼是vector<int>類型stringDecode(string&source); //哈夫曼編碼是string類型2主程序設計主程序中有4個重要函數(shù),如下:〔1〕計算待解壓字符出現(xiàn)的頻度voidGetFrequency(intfrequency[],charfilename[]); //統(tǒng)計各字符出現(xiàn)的頻度。先初始化用于統(tǒng)計每個ASCII碼字符個數(shù)的數(shù)組frequencyvoidGetFrequency(intfrequency[],charfilename[]){ for(inti=0;i<256;i++) frequency[i]=0; //初始化frequency數(shù)組 charch; //用于讀入每個字符 ifstreaminfile(filename); //翻開待壓縮的文件 infile>>noskipws; //noskipws:不忽略空白,把每行最后那個‘\n‘也讀進來 while(infile>>ch) frequency[ch]++; //統(tǒng)計每個ASCII碼字符的個數(shù) infile.close(); //關(guān)閉文件}〔2〕壓縮voidpression(HuffTreehf,vector<HuffNode>leaves,charfilename[],charfilename2[]);//壓縮voidpression(HuffTreehf,vector<HuffNode>leaves,charfilename[],charfilename2[]){ ifstreaminfile2(filename); //翻開待壓縮文件 ofstreamoutfile; outfile.open(filename2); //翻開壓縮后文件 charch; infile2>>noskipws; //noskipws:不忽略空白,把每行最后那個‘\n‘也讀進來 while(infile2>>ch) //逐個讀入字符 { for(inti=0;i<leaves.size();i++) if(ch==leaves[i].data) //找到字符對應的葉子結(jié)點 { for(intj=0;j<hf.Getcode(i).size();j++) outfile<<hf.Getcode(i)[j]; //將對應Huffman編碼寫入文件 } } infile2.close(); //關(guān)閉待壓縮文件 outfile.close(); //關(guān)閉壓縮后文件 cout<<endl<<endl<<endl; cout<<"壓縮文件"<<filename<<"成功,"; cout<<"生成了已壓縮文件"<<filename2<<"!"<<endl<<endl<<endl;}〔3〕解壓1voidDepression1(HuffTreehf,charfilename2[],charfilename3[]);解壓方法1:Huffman編碼儲存為vector<int>類型從壓縮后的文件中讀入Huffman編碼,使用HuffTree類中的解碼函數(shù)將Huffman編碼轉(zhuǎn)換成對應的ASCII碼字符寫入解壓后的文件。voidDepression1(HuffTreehf,charfilename2[],charfilename3[]){ charc; //暫時儲存讀入的字符 intt; //儲存讀入字符對應的整數(shù) vector<int>source; //儲存Huffman編碼 ifstreaminfile(filename2); //翻開壓縮后的文件 while(infile>>c) //逐個讀入Huffman碼的0/1符 { t=c-'0'; //將字符轉(zhuǎn)換成整數(shù) source.push_back(t); //將整數(shù)插入Huffman編碼中 } infile.close(); //關(guān)閉壓縮后的文件 stringtarget; target=hf.Decode(source); //得到Huffman編碼對應的字符 ofstreamoutfile(filename3); outfile<<target; //解壓后的字符串寫入解壓后文件 outfile.close(); //關(guān)閉解壓后的文件 cout<<"已成功解壓生成文件"<<filename3<<"!"<<endl<<endl<<endl;}〔4〕解壓2voidDepression2(HuffTreehf,charfilename2[],charfilename3[]); 解壓方法2:Huffman編碼儲存為string類型voidDepression2(HuffTreehf,charfilename2[],charfilename3[]){ charc; //暫時儲存讀入的字符 stringsource; //儲存Huffman編碼 ifstreaminfile(filename2); //翻開壓縮后的文件 while(infile>>c) //逐個讀入Huffman碼的0/1符 { source=source+c; } //將整數(shù)插入Huffman編碼中 infile.close(); //關(guān)閉壓縮后的文件 stringtarget; target=hf.Decode(source); //得到Huffman編碼對應的字符 ofstreamoutfile(filename3); outfile<<target; //解壓后的字符串寫入解壓后文件 outfile.close(); //關(guān)閉解壓后的文件 cout<<"已成功解壓生成文件"<<filename3<<"!"<<endl<<endl<<endl;}3流程圖讀取文本中待壓縮的數(shù)據(jù)讀取文本中待壓縮的數(shù)據(jù)開場完畢統(tǒng)計各字符的頻率建哈夫曼樹得到哈夫曼編碼通過哈夫曼樹解碼系統(tǒng)環(huán)境與程序測試案例硬件環(huán)境截圖如下:軟件環(huán)境:MicrosoftVisualC++6.0軟件使用界面:1待壓縮的文件為Data.t*t,如下:壓縮后的文件為:pressionData.t*t解壓后的文件為:DepressionData1.t*t中

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論