数组压缩 (2)
前面两种基本办法对于数组内的重复数字有基本除重功能,但是对于多重重复数组,(6,6,6,6,4,4,4 ) 这种将重复调用内存拷贝,效率上有一定损失,下面将实现一次性拷贝这些数值。
算法执行演示如下:
{ 1,2,2,6,6,6,6,4,4,4,8,9,7,8,6,7,4,4,3,3 }; 找到第一个和2不同的位,移动6到第二个2的位置
{ 1,2,6,6,6,6,4,4,4,8,9,7,8,6,7,4,4,3,3 }; 找到第一个和6不同的位,移动4到第二个6的位置
{ 1,2,6,4,4,4,8,9,7,8,6,7,4,4,3,3 }; 找到第一个和4不同的位,移动8到第二个4的位置
{ 1,2,6,4,8,9,7,8,6,7,4,4,3,3 }; 找到第一个和4不同的位,移动3到第二个4的位置
{ 1,2,6,4,8,9,7,8,6,7,4,3,3 }; 最两位都为 3,3找不到一位不同的数,设置数组大小为第一个相同数的出现位置为数组大小,也就是12
算法代码:
std::vector<long> p = { 1,2,2,6,6,6,6,4,4,4,8,9,7,8,6,7,4,4,3,3 };
long size = p.size();
long value = 1;
long findex = 1;
long first_same_index = -1;
bool flag = false;
while (findex < size)
{
if (p[findex] != value)
{
value = p[findex];
if (flag){
memcpy(&p[0] + first_same_index, &p[0] + findex, sizeof(long) * (size - findex + 1));flag = false;
size = size - (findex - first_same_index);
findex = first_same_index;
value = p[findex];
}
findex++;
}
else
{
if (!flag)//连续相同的
first_same_index = findex;
flag = true;
findex++;
if (findex == size)//如果末尾都是一样的
size = first_same_index;
}
}
}
另外附上三种算法的数值去重的时间效率对比:
时间单位为毫秒,1000000万次聚合,每次20个值耗时最好在214ms。
数值去重思想还能使用在像素聚合,地理数据聚合上,后续将在此算法基础上实现 点线数据绘制压缩。