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