方块编码:是行程编码结构从一维扩展到二维的情况,采用正方形区域作为记录单元,每个记录单元包括相邻的若干栅格,数据结构由起始行号、列好、格网高程值、区域半径组成的单元组。也是一种有效的压缩编码。
函数说明:
①void Creat_array()函数,该函数创建20*20的动态二维数组,并利用for循环将rand函数生成1-3的随机数填入该动态二维数组;
②void Creat_tagarray()函数,该函数创建一个标记数组,用于后期遍历动态数组时判断区域是否已经编码,未编码区域为0,已编码区域为1;
③int Examin(int indexR, int indexL, int Radius)函数,该函数用来检验当前半径下所有区域的值是否一样,从而获取块状的半径;
④void alter_repeat()函数,该函数用来调整实验数组某些区域的值,使所创建的数组内形成更多的块状,以便观察压缩情况;
⑤void batch_pressing()函数,该函数为块状编码的核心函数,压缩实验数组并将压缩后的结果存入int** batch = new int* [400]二维数组中。
⑥float pressProportion(int pressnum)函数计算压缩率。
#include <iostream>
using namespace std;
int Radius = 1, pressNum = 0,temp;//设置初始半径为1;pressNum记录压缩的块数;记录遍历时的网格值
int** batch = new int* [400];//创建压缩后的数组(行,列,值,半径)
float Ratio;//记录压缩率
//创建指针数组并赋予随机值====================================================
int Width = 20, Height = 20;
int** defBuf = new int* [20];
void Creat_array()
{
for (int i = 0; i < 20; i++)
{
defBuf[i] = new int[20];
}
for (int i = 0; i < 20; i++)
{
for (int j = 0; j < 20; j++)
{
int num = rand() % 3 + 1;
defBuf[i][j] = num;
}
}
}
//创建标记数组================================================================
int** tag = new int* [20];
void Creat_tagarray()
{
for (int i = 0; i < 20; i++)
{
tag[i] = new int[20];
}
for (int i = 0; i < 20; i++)
{
for (int j = 0; j < 20; j++)
{
tag[i][j] = 0;
}
}
}
//压缩时判断当前半径内的所有网格数值数是否与temp相等
int Examin(int indexR, int indexL, int Radius)
{
for (int i = indexR; i < indexR + Radius; i++) //遍历当前半径内的所有网格
{
for (int j = indexL; j < indexL + Radius; j++)
{
if (defBuf[i][j] != temp)
{
return 0;
}
}
}
return 1;
}
//调整数据,增大数据重复率,更好地观察压缩效果====================================================
void alter_repeat()
{
for (int j = 0; j < 20; j++)
{
defBuf[7][j] = 3;
defBuf[8][j] = 3;
defBuf[9][j] = 3;
defBuf[10][j] = 2;
defBuf[11][j] = 2;
defBuf[12][j] = 2;
defBuf[13][j] = 2;
defBuf[14][j] = 1;
defBuf[15][j] = 1;
defBuf[16][j] = 1;
defBuf[17][j] = 3;
defBuf[18][j] = 3;
defBuf[j][4] = 3;
defBuf[j][5] = 3;
defBuf[j][6] = 3;
}
cout << "压缩前:" << endl;
for (int i = 0; i < 20; i++)
{
for (int j = 0; j < 20; j++)
{
cout << defBuf[i][j];
}
cout << endl;
}
}
//方块压缩====================================================================
void batch_pressing()
{
for (int i = 0; i < 20; i++)//遍历每一个网格
{
for (int j = 0; j < 20; j++)
{
while (tag[i][j] == 1) //若标记值为1,说明该网格已经压缩,跳到下一个网格
{
j++;
}
temp = defBuf[i][j];//获取当前网格值
if ((j + Radius + 1) < 20 && (i + Radius + 1)<20)
{
while ((Examin(i, j, Radius + 1)))
{
Radius++;
}
}
cout << " ";
for (int m = i; m < i + Radius; m++)
{
for (int n = j; n < j + Radius; n++)
{
tag[m][n] = 1;
}
}
pressNum++;
batch[pressNum] = new int[4];
batch[pressNum][0] = i;
batch[pressNum][1] = j;
batch[pressNum][2] = temp;
batch[pressNum][3] = Radius;
Radius = 1;
cout << "(";
for (int i = 0; i < 4; i++)
{
cout << batch[pressNum][i] ;
if (i < 3)
{
cout << ",";
}
}
cout << ")";
}
}
}
//计算压缩率(暂不清楚压缩率怎么衡量,这里的计算方式未包含压缩后的方块的行、列、以及半径信息)===================================================================
float pressProportion(int pressnum)
{
return float (400-pressnum)/400;
}
int main()
{
//创建数组
Creat_array();
//创建标记数组
Creat_tagarray();
//增大实验数组的重复率
alter_repeat();
//方块压缩
cout << "压缩后:" << endl;
batch_pressing();
//压缩率
Ratio = pressProportion(pressNum);
cout << "压缩率:" << Ratio << endl;
}
运行结果:
该程序能满足课程作业的基本要求,块状编码基本思想大概如此,但程序还存在一些问题有待修改。该文章仅供参考。