行程编码实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
行程编码算法实现
姓名:唐超
学号: 201426810618
班级:计自1401班一、实验目的:
了解行程算法的压缩和解压过程,学会计算压缩比以及与行程算法相关的问题。
二、软件设计说明:
1、实验平台:
Visual studio 2013
2、实验原理:
该程序主要是为了实现压缩和解压的功能。压缩算法相对较为简单,主要是对输入的要压缩的数据进行遍历,遍历并同时记录相同的数据的数目,当遍历到不相同的数据后停止遍历并将数据和数目压入到vector中保存,考虑到可能会在数据间产生误差,我加入’\’用于区分不同的两个数据,还有若数据的长度为1时,我不将1保存到vector中,以此方式尽可能的减少压缩数据的长度,增加压缩的效果。函数中使用了
void compress(vector
{
int length=a.size(); //原数据的长度
vector
int j=0;
int n=1;
for(int i=0;i { string b=a[i]; if(i!=length-2) { if(a[i]!=a[i+1]) { if(n!=1) { if(b=="\\") { temp.push_back(b); temp.push_back(b); } else temp.push_back(b); string s; stringstream out; out< s = out.str(); temp.push_back(s); s="\\"; temp.push_back(s); n=1; j=j+2; } else { if(b=="\\") { temp.push_back(b); temp.push_back(b); } else temp.push_back(b); string s; s="\\"; temp.push_back(s); n=1; j=j+1; } } else n++; } else { if(a[i]==a[i+1]) { n++; if(b=="\\") { temp.push_back(b); temp.push_back(b); } else temp.push_back(b); string s; stringstream out; out< s = out.str(); temp.push_back(s); n=1; j=j+2; } else { if(n!=1) { if(b=="\\") { temp.push_back(b); temp.push_back(b); } else temp.push_back(b); string s; stringstream out; out< s = out.str(); temp.push_back(s); s="\\"; temp.push_back(s); n=1; if(a[i+1]=="\\") { temp.push_back(a[i+1]); temp.push_back(a[i+1]); } else temp.push_back(a[i+1]); j=j+2; } else { if(b=="\\") { temp.push_back(b); temp.push_back(b); } else temp.push_back(b); string s; s="\\"; temp.push_back(s); n=1; if(a[i+1]=="\\") { temp.push_back(a[i+1]); temp.push_back(a[i+1]); } else temp.push_back(a[i+1]); j=j+2; } } } } print(temp,a,j); //用于数据的输出 } 然后是解压算法的设计思路如下,主要是定义三个vector的向量,一个用于记录要压缩的数据,一个用于记录标志’\’的在string中的位置,然后根据’\’的位置求出数据的数目,将数目保存到另外一个vector中,然后根据数据和长度一一对应输出,这样就将数据解压完成。但是在这里需要特别注意对’\’的处理在压缩的过程中若压缩的字符为’\\’,则输出的时候记为’\\’,判断的时候主要是判定连续3个字符是否全为’\\’,以此判断是否是遇到标志字符’\’。 代码如下: void uncompress(string a) { vector vector vector vector for(int i=0;i { if(i==0) { if(a[i]=='\\') { data.push_back('\\'); loca.push_back(1); i++; } else { data.push_back(a[0]); loca.push_back(i);