C++实现块状编码

方块编码:是行程编码结构从一维扩展到二维的情况,采用正方形区域作为记录单元,每个记录单元包括相邻的若干栅格,数据结构由起始行号、列好、格网高程值、区域半径组成的单元组。也是一种有效的压缩编码。

函数说明:

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

运行结果:

该程序能满足课程作业的基本要求,块状编码基本思想大概如此,但程序还存在一些问题有待修改。该文章仅供参考。

  • 7
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

忘仔小秃头

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值