合并两个有序数组并去除重复元素的算法实现

模仿dbscan聚类算法过滤清洗轨迹数据中要进行合并聚类操作,实际上就是两个有序数组的合并去重。

例如:

聚类A:[2588,2586,2585,2584,2583,2582,2581,2580,2579,2578,2575,2574,2571,2570,2569,2568,2567,2566,2565,2564]

聚类B:[2484,2483,2482,2481,2480,2474,2470,2469,2468,2467,2466,2465,2464,2463,2462,2461,2460,2459,2458 ]

聚类C:[2479,2478,2477,2476,2475,2474,2473,2472,2471,2470,2438,2437,2436,2435,2434,2433,2432,2482,2481,2480]

聚类D:[2453,2452,2451,2450,2449,2448,2447,2457,2456,2474,2470,2469,2468,2467,2466,2482,2481,2480,2479,2478]

算法思想:

第一步:先判断后面B数组的第一个值2484与第A数组的最后一个值2564的大小,发现2484<2564,直接将B并入A。又如,发现D[0]<C[C.length-1],则执行下一步;

第二步:一个一个比较,C[0]和D[0]比较,小的插入到result数组中,并将小的数组下标后移。若有重复的元素,则去其中一个,这个时候,相当于从两个数组中都取了一个元素,所以两个数组的下标都要后移。

 具体实现如下:

function hebing(list1,list2){
		int[] result=new int[list1.length+list2.length];
		int i=0,j=0,k=0;//定义三个变量。i  j  k分别控制list1 list2  result三个数组的下标
		while(i<list1.length && j< list2.length){//两个数组都不为空的时候
			if(list1[i]<list2[j]){//若list1的元素小,加入result
				result.push(list1[i]);
				i++;//list1的下标后移
			}else if(list1[i]==list2[j]){//若二者相等 这一步就是去重复。
				result.push(list1[i]);//这里两个数组的元素把哪个加入result都行
				i++;//这里要注意的是  两个重复了,去重之后,两个数组的下标都要后移
				j++;
			}else {
				result.push(list2[j]);//若list2的元素小,加入result
				j++;
			}	
		}
		
		//下面是当其中一个数组元素全部添加到result了,另一个还没添加完  继续添加。
		while(i<num1.length){//
			result.push(list1[i]);
			i++;
		}
		while(j<list2.length){
			result.push(list2[j]);
			j++;
		}
        return result;
}

 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值