行程编码实验报告.docx
《行程编码实验报告.docx》由会员分享,可在线阅读,更多相关《行程编码实验报告.docx(25页珍藏版)》请在冰豆网上搜索。
![行程编码实验报告.docx](https://file1.bdocx.com/fileroot1/2023-8/4/38b24819-91d1-4bc3-a3d3-d0159927965d/38b24819-91d1-4bc3-a3d3-d0159927965d1.gif)
行程编码实验报告
行程编码以vc方式实现
实验目的:
了解行程算法的压缩和解压过程,学会计算压缩比以及与行程算法相关的问题。
实验平台:
在vc2010下以c++代码的形式完成。
软件设计说明:
该程序主要是为了实现压缩和解压的功能。
压缩算法相对较为简单,主要是对输入的要压缩的数据进行遍历,遍历并同时记录相同的数据的数目,当遍历到不相同的数据后停止遍历并将数据和数目压入到vector中保存,考虑到可能会在数据间产生误差,我加入’\’用于区分不同的两个数据,还有若数据的长度为1时,我不将1保存到vector中,以此方式尽可能的减少压缩数据的长度,增加压缩的效果。
函数中使用了中的功能,其作用为将int转换为string的类型,便于储存数据,其功能函数如下:
voidyasuo(vectora)//a传入要压缩的数据
{
intlength=a.size();//原数据的长度
vectortemp;//保存压缩后的数据
intj=0;
intn=1;
for(inti=0;i{
stringb=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);
strings;
stringstreamout;
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);
strings;
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);
strings;
stringstreamout;
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);
strings;
stringstreamout;
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);
strings;
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个字符是否全为’\\’,以此判断是否是遇到标志字符’\’。
代码如下:
voidjieya(stringa)
{
vectordata;//记录数据
vectorloca;//记录标志的位置
vectorlen;//记录个数据的长度
vectorzhi;//记录每个数据的各个位上的数值
for(inti=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);
}
}
else
{
if(a.length()-i-1>2)
{
if(a[i]=='\\'&&a[i+1]=='\\'&&a[i+2]=='\\')
{
data.push_back('\\');
loca.push_back(i+2);
i=i+2;
}
else
if(a[i]=='\\'&&a[i+1]!
='\\')
{
data.push_back(a[i+1]);
loca.push_back(i+1);
}
}
else
{
if(a[i]=='\\'&&a[i+1]=='\\'&&a[i+2]=='\\')
{
data.push_back('\\');
loca.push_back(i+2);
i=i+2;
}
else
if(a[i]=='\\'&&a[i+1]!
='\\')
{
data.push_back(a[i+1]);
loca.push_back(i+1);
}
}
}
}
for(intj=0;j{
if(data.size()==1)
{
if(loca[j]==a.length()-1&&data[j]!
='\\')
len.push_back
(1);
else
if(loca[j]==a.length()-1&&data[j]=='\\')
len.push_back
(1);
else
{
intlensi=0;
for(intk=loca[j]+1;k{
if(a[k]>='0'&&a[k]<='9')
zhi.push_back((int)a[k]-48);
}
if(zhi.size()==0)
lensi=1;
else
for(intl=0;l{
intz=zhi.size()-l-1;
lensi=lensi+zhi[l]*pow((float)10,z);
}
len.push_back(lensi);
lensi=0;
zhi.clear();
}
}
else
{
if(j==data.size()-1)
{
if(a.length()-loca[j]==0)
{
len.push_back
(1);
}
else
{
intlensi1=0;
for(intk=loca[j]+1;k{
if(a[k]>='0'&&a[k]<='9')
zhi.push_back((int)a[k]-48);
}
if(zhi.size()==0)
lensi1=1;
else
for(intl=0;l{
intz=zhi.size()-l-1;
lensi1=lensi1+zhi[l]*pow((float)10,z);
}
len.push_back(lensi1);
lensi1=0;
zhi.clear();
}
}
else
{
intlensi2=0;
for(intk=loca[j]+1;k{
if(a[k]>='0'&&a[k]<='9')
zhi.push_back((int)a[k]-48);
}
if(zhi.size()==0)
lensi2=1;
else
for(intl=0;l{
intz=zhi.size()-l-1;
lensi2=lensi2+zhi[l]*pow((float)10,z);
}
len.push_back(lensi2);
lensi2=0;
zhi.clear();
}
}
}
for(inth=0;hcout<print2(data,len);
}
运行截图:
首先运行压缩算法:
压缩不同字符,结果如下:
qqqqqqqWWWWWWW22222222111111((((((====
结果如下:
输入特殊的字符,包含’\’,输入\\\\\wwww1111R
运算结果如下:
解压的运行结果如图,解压q7\W7\28\16\(6\=4,
运行结果如下:
解压\\5\w4\14\R,
运行结果如下:
解压\\\w5\t7\\\,
运行结果如下:
此数据考虑了边界的输出情况,而输出结果也是正确的。
完整代码如下:
#include
#include
#include
#include
usingnamespacestd;
voidprint(vector&temp,vector&a)//输出解压后的数据
{
doublerate;
cout<<"压缩后的数据为:
"<for(intk=0;kcout<cout<cout<<"压缩前的长度为:
"<cout<<"压缩后的长度为:
"<rate=a.size()/(temp.size()*1.0);
cout<<"压缩率为:
"<}
voidprint2(vector&a,vector&b)//输出压缩后的数据
{
cout<<"解压后的数据为:
"<for(inti=0;ifor(intj=0;j
cout<}
voidyasuo(vectora)//压缩算法
{
intlength=a.size();
vectortemp;
intj=0;
intn=1;
for(inti=0;i{
stringb=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);
strings;
stringstreamout;
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);
strings;
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);
strings;
stringstreamout;
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);
strings;
stringstreamout;
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);
strings;
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);
}
voidjieya(stringa)//解压算法
{
vectordata;//保存数据
vectorloca;//保存标志的位置
vectorlen;//保存数据的长度
vectorzhi;
for(inti=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);
}
}
else
{
if(a.length()-i-1>2)
{
if(a[i]=='\\'&&a[i+1]=='\\'&&a[i+2]=='\\')
{
data.push_back('\\');
loca.push_back(i+2);
i=i+2;
}
else
if(a[i]=='\\'&&a[i+1]!
='\\')
{
data.push_back(a[i+1]);
loca.push_back(i+1);
}
}
else
{
if(a[i]=='\\'&&a[i+1]=='\\'&&a[i+2]=='\\')
{
data.push_back('\\');
loca.push_back(i+2);
i=i+2;
}
else
if(a[i]=='\\'&&a[i+1]!
='\\')
{
data.push_back(a[i+1]);
loca.push_back(i+1);
}
}
}
}
for(intj=0;j{
if(data.size()==1)
{
if(loca[j]==a.length()-1&&data[j]!
='\\')
len.push_back
(1);
else
if(loca[j]==a.length()-1&&data[j]=='\\')
len.push_back
(1);
else
{
intlensi=0;
for(intk=loca[j]+1;k{
if(a[k]>='0'&&a[k]<='9')
zhi.push_back((int)a[k]-48);
}
if(zhi.size()==0)
lensi=1;
else
for(intl=0;l{
intz=zhi.size()-l-1;
lensi=lensi+zhi[l]*pow((float)10,z);
}
len.push_back(lensi);
lensi=0;
zhi.clear();
}
}
else
{
if(j==data.size()-1)
{
if(a.length()-loca[j]==0)
{
len.push_back
(1);
}
else
{
intlensi1=0;
for(intk=loca[j]+1;k{
if(a[k]>='0'&&a[k]<='9')
zhi.push_back((int)a[k]-48);
}
if(zhi.size()==0)
lensi1=1;
else
for(intl=0;l{
intz=zhi.size()-l-1;
lensi1=lensi1+zhi[l]*pow((float)10,z);
}
len.push_back(lensi1);