版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、行程編碼算法實現(xiàn)姓名:k學號:201426810618班級:計自1401班一、實驗目的:了解行程算法的壓縮和解壓過程,學會計算壓縮比以及與行程算法相關的問題。二、軟件設計說明:1、實驗平臺:visual studio 2013 2、實驗原理:該程序主要是為了實現(xiàn)壓縮和解壓的功能。壓縮算法相對較為簡單,主要是對輸入 的要壓縮的數(shù)據(jù)進行遍歷,遍歷并同時記錄相同的數(shù)據(jù)的數(shù)目,當遍歷到不相同的 數(shù)據(jù)后停止遍歷并將數(shù)據(jù)和數(shù)目壓入到 vector中保存,考慮到可能會在數(shù)據(jù)間產生 誤差,我加入用于區(qū)分不同的兩個數(shù)據(jù),還有若數(shù)據(jù)的長度為1時,我不將1保存到vector中,以此方式盡可能的減少壓縮數(shù)據(jù)的長度,增
2、加壓縮的效果。函數(shù)中 使用了 <sstream外的功能,其作用為將int轉換為string的類型,便于儲存數(shù)據(jù), 其功能函數(shù)如下:/a傳入要壓縮的數(shù)據(jù)原數(shù)據(jù)的長度保存壓縮后的數(shù)據(jù)void compress(vector<string> a)int length=a.size();vector<string> temp;int j=0;int n=1;for(int i=0;i<length-1;i+)string b=ai;if(i!=length-2) if(ai!=ai+1)if(n!=1)if(b="")temp.push_back
3、(b);temp.push_back(b);elsetemp.push_back(b);string s;stringstream out;out<<n;s = out.str();temp.push_back(s);s=""temp.push_back(s);n=1;j=j+2;elseif(b="")temp.push_back(b);temp.push_back(b);elsetemp.push_back(b);string s;s=""temp.push_back(s);n=1;j=j+1;elsen+;elsei
4、f(ai=ai+1)n+;if(b="")temp.push_back(b);temp.push_back(b);elsetemp.push_back(b);string s;stringstream out;out<<n;s = out.str();temp.push_back(s);n=1;j=j+2;elseif(n!=1)if(b="")temp.push_back(b);temp.push_back(b);elsetemp.push_back(b);string s;stringstream out;out<<n;s =
5、 out.str();temp.push_back(s);s=""temp.push_back(s);n=1;if(ai+1="")temp.push_back(ai+1);temp.push_back(ai+1);elsetemp.push_back(ai+1);j=j+2;elseif(b="")temp.push_back(b);temp.push_back(b);elsetemp.push_back(b);string s;s=""temp.push_back(s);n=1;if(ai+1="&q
6、uot;)temp.push_back(ai+1);temp.push_back(ai+1);elsetemp.push_back(ai+1);j=j+2;print(temp,a,j);/用于數(shù)據(jù)的輸出然后是解壓算法的設計思路如下,主要是定義三個vector 的向量,一個用于記錄要壓縮的數(shù)據(jù),一個用于記錄標志 的在 string 中的位置,然后根據(jù) 的位置求出數(shù)據(jù)的數(shù)目,將數(shù)目保存到另外一個vector 中,然后根據(jù)數(shù)據(jù)和長度一一對應輸出,這樣就將數(shù)據(jù)解壓完成。 但是在這里需要特別注意對 的處理在壓縮的過程中若壓縮的字符為 ,則輸出的時候記為 ,判斷的時候主要是判定連續(xù)3 個字符是否全為 ,
7、以此判斷是否是遇到標志字符 。代碼如下:void uncompress(string a)/記錄數(shù)據(jù)/記錄標志的位置/記錄個數(shù)據(jù)的長度/記錄每個數(shù)據(jù)的各個位上的數(shù)值/記錄數(shù)據(jù)和標志的位置vector<char> data;vector<int> loca;vector<int> len;vector<int> zhi;for(int i=0;i<a.length();i+)if(i=0)if(ai='') data.push_back('');loca.push_back(1);i+;elsedata.pus
8、h_back(a0);loca.push_back(i);else if(a.length()-i-1>2)if(ai=''&&ai+1=''&&ai+2='')data.push_back('');loca.push_back(i+2);i=i+2;elseif(ai=''&&ai+1!='')data.push_back(ai+1);loca.push_back(i+1);elseif(ai=''&&ai+1=
9、''&&ai+2='')data.push_back('');loca.push_back(i+2);i=i+2; elseif(ai=''&&ai+1!='')data.push_back(ai+1);loca.push_back(i+1);/記錄數(shù)據(jù)的長度for(int j=0;j<data.size();j+)if(data.size()=1) if(locaj=a.length()-1&&dataj!='')len.push_back(1
10、);else if(locaj=a.length()-1&&dataj='')len.push_back(1);elseint lensi=0;for(int k=locaj+1;k<a.size();k+)if(ak>='0'&&ak<='9')zhi.push_back(int)ak-48);if(zhi.size()=0)lensi=1;elsefor(int l=0;l<zhi.size();l+)int z=zhi.size()-l-1;lensi=lensi+zhil*pow(f
11、loat)10,z);len.push_back(lensi);lensi=0;zhi.clear();elseif(j=data.size()-1)if(a.length()-locaj=0)len.push_back(1);elseint lensi1=0;for(int k=locaj+1;k<a.size();k+)if(ak>='0'&&ak<='9')zhi.push_back(int)ak-48);if(zhi.size()=0)lensi1=1;elsefor(int l=0;l<zhi.size();l+
12、)int z=zhi.size()-l-1;lensi1=lensi1+zhil*pow(float)10,z);len.push_back(lensi1);lensi1=0;zhi.clear();elseint lensi2=0;for(int k=locaj+1;k<locaj+1-1;k+)if(ak>='0'&&ak<='9')zhi.push_back(int)ak-48);if(zhi.size()=0)lensi2=1;elsefor(int l=0;l<zhi.size();l+)int z=zhi.si
13、ze()-l-1;lensi2=lensi2+zhil*pow(float)10,z);len.push_back(lensi2);lensi2=0;zhi.clear();for(int h=0;h<loca.size();h+)cout<<locah<<""print2(data,len);運行截圖:壓縮不同字符,輸入:dddddddddhhhhhhhhhh3111888899999999結果如下:蜜 c:.wind5入£ycmd.exe居13jjl- hs 63 18 h 一佰h xt 度度2.據(jù)hll壓 £數(shù)dha
14、k-tfj-rrdd5十后dd入 ejejdd輸 ®壓®解dd請輸入特殊的字符,包含 一,輸入:000008788888運算結果如下:請輸入你想壓縮的數(shù)據(jù);wwsx000008 788888 s壓縮后的數(shù)據(jù)為工x6 05 xs 78 5 、蹉麟霸15 壓縮率為!ieelsewww000008 788888s請輸入你想壓縮的數(shù)據(jù),源代碼如下:#include<iostream>#include<vector>#include<string>#include<sstream>using namespace std;輸出解壓后的數(shù)據(jù)
15、void print(vector<string> &temp,vector<string> & a)(double rate;cout<<"壓縮后的數(shù)據(jù)為:"<<endl;for(int k=0;k<temp.size();k+)cout<<tempk;cout<<endl;cout<<"壓縮前的長度為:"<<a.size()<<endl;cout<<"壓縮后的長度為:"<<tem
16、p.size()<<endl;rate=a.size()/(temp.size()*1.0);cout<<"壓縮率為:"<<rate<<endl;/輸出壓縮后的數(shù)據(jù)void print2(vector<char> &a,vector<int> &b) cout<<" 解壓后的數(shù)據(jù)為: "<<endl;for(int i=0;i<a.size();i+)for(int j=0;j<bi;j+)cout<<ai;void c
17、ompress(vector<string> a,vector<string> &temp)/壓縮算法int length=a.size();int j=0;int n=1;for(int i=0;i<length-1;i+)string b=ai;if(i!=length-2)if(ai!=ai+1)if(n!=1)if(b="")temp.push_back(b);temp.push_back(b);temp.push_back(b);string s;stringstream out;out<<n;s = out.st
18、r();temp.push_back(s);s=""temp.push_back(s);n=1;j=j+2;elseif(b="")temp.push_back(b);temp.push_back(b);elsetemp.push_back(b);string s;s=""temp.push_back(s);n=1;j=j+1; elsen+;elseif(ai=ai+1)n+;if(b="")temp.push_back(b);temp.push_back(b);elsetemp.push_back(b);str
19、ing s;stringstream out;out<<n;s = out.str();temp.push_back(s);n=1;j=j+2;elseif(n!=1)if(b="")temp.push_back(b);temp.push_back(b);elsetemp.push_back(b);string s;stringstream out;out<<n;s = out.str();temp.push_back(s);s=""temp.push_back(s);n=1;if(ai+1="")temp.p
20、ush_back(ai+1);temp.push_back(ai+1);elsetemp.push_back(ai+1);j=j+2;elseif(b="")temp.push_back(b);temp.push_back(b); elsetemp.push_back(b);string s;s=""temp.push_back(s);n=1;if(ai+1="")temp.push_back(ai+1);temp.push_back(ai+1);elsetemp.push_back(ai+1);j=j+2;print(temp,a)
21、;/解壓算法/保存數(shù)據(jù)/保存標志的位置/保存數(shù)據(jù)的長度void uncompress(string a)vector<char> data;vector<int> loca;vector<int> len;vector<int> zhi;for(int i=0;i<a.length();i+)if(i=0)if(ai='')data.push_back('');loca.push_back(1);i+;elsedata.push_back(a0);loca.push_back(i);elseif(a.leng
22、th()-i-1>2)if(ai=''&&ai+1=''&&ai+2='')data.push_back('');loca.push_back(i+2);i=i+2;elseif(ai=''&&ai+1!='')data.push_back(ai+1);loca.push_back(i+1);elseif(ai=''&&ai+1=''&&ai+2='')data.pu
23、sh_back('');loca.push_back(i+2);i=i+2;elseif(ai=''&&ai+1!='')data.push_back(ai+1);loca.push_back(i+1);for(int j=0;j<data.size();j+)if(data.size()=1)if(locaj=a.length()-1&&dataj!='')len.push_back(1);elseif(locaj=a.length()-1&&dataj=''
24、)len.push_back(1);elseint lensi=0;for(int k=locaj+1;k<a.size();k+)if(ak>='0'&&ak<='9')zhi.push_back(int)ak-48);if(zhi.size()=0)lensi=1;elsefor(int l=0;l<zhi.size();l+)int z=zhi.size()-l-1;lensi=lensi+zhil*pow(float)10,z);len.push_back(lensi);lensi=0;zhi.clear();elseif(j=data.size()-1)if(a.length()-locaj=0)len.push_back(1);elseint lensi1=0;if(
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 高考物理總復習專題三牛頓運動定律第1講牛頓第一定律、牛頓第三定律練習含答案
- 美容美發(fā)工具采購協(xié)議
- 《大數(shù)據(jù)分析》課件
- 江西省萬載縣高中地理 第三章 生產活動與地域聯(lián)系 3.1 農業(yè)區(qū)位因素教案 中圖版必修2
- 2024-2025學年新教材高中地理 第2單元 不同類型區(qū)域的發(fā)展 單元活動 開展小區(qū)域調查教案 魯教版選擇性必修2
- 2024秋四年級英語上冊 Unit 6 Meet my family第3課時(Let's spell Lets sing)教案 人教PEP
- 2024-2025學年高中物理 第十二章 機械波 1 波的形成和傳播教案3 新人教版選修3-4
- 高考地理一輪復習第四章地球上的水及其運動第二節(jié)海水的性質課件
- 包豪斯設計課件
- 租賃備案代辦委托合同
- 幼兒園游戲方案與案例-完整版PPT課件
- 生產安全事故風險評估報告(參考模板)
- ASME培訓教程ASME規(guī)范第VIII-1卷-壓力容器
- 過磅管理制度管理辦法
- 繩子的故事(課堂PPT)
- 醫(yī)學人文與修養(yǎng)(課堂PPT)
- 第2章 行車荷載分析-3
- 華為交換機常用配置
- 社區(qū)居家養(yǎng)老服務需求論文
- 110米鋼桁梁頂推架設監(jiān)理實施細則
- 金屬間化合物要點
評論
0/150
提交評論