点压缩聚合(2)

数组压缩 (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。

数值去重思想还能使用在像素聚合,地理数据聚合上,后续将在此算法基础上实现 点线数据绘制压缩。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值