行程编码实验报告

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

行程编码算法实现

姓名:唐超

学号: 201426810618

班级:计自1401班一、实验目的:

了解行程算法的压缩和解压过程,学会计算压缩比以及与行程算法相关的问题。

二、软件设计说明:

1、实验平台:

Visual studio 2013

2、实验原理:

该程序主要是为了实现压缩和解压的功能。压缩算法相对较为简单,主要是对输入的要压缩的数据进行遍历,遍历并同时记录相同的数据的数目,当遍历到不相同的数据后停止遍历并将数据和数目压入到vector中保存,考虑到可能会在数据间产生误差,我加入’\’用于区分不同的两个数据,还有若数据的长度为1时,我不将1保存到vector中,以此方式尽可能的减少压缩数据的长度,增加压缩的效果。函数中使用了中的功能,其作用为将int转换为string的类型,便于储存数据,其功能函数如下:

void compress(vector a) //a传入要压缩的数据

{

int length=a.size(); //原数据的长度

vector temp; //保存压缩后的数据

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 data; //记录数据

vector loca; //记录标志的位置

vector len; //记录个数据的长度

vector zhi; //记录每个数据的各个位上的数值

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);

相关文档
最新文档