分治算法求解二维点集合的Skyline
实验背景和内容
给定二维数据集合D,要求设计、分析并实现基于分治的二维数据Skyline求解算法。
思路
- 先将所有点对都按照x轴进行排序;
- 然后递归地二分所有点对;
- 左右集合合并的时候,因为左边集合的x值一定小于右边集合的x值,则如果左边的集合不为空,则依次将左边点集的点的y值与右边的点集中最大y值比较,如果,左边元素的y值小于等于右边点集中y最大的值,则左边那个元素一定被右边y值最大的元素所支配,就将左边的那个点删去,直至左边集合比较结束。
- 然后将左边集合加到右边集合中,并返回右边的集合继续进行递归。
伪代码
Skyline(D)
1. QuickSortByXAxis(D);
2. SkylineDivide(D);
3. PrintSkyline(D);
SkylineDivide(D)
1. create arrays left ,right;
2. if D.size>0
3. left = D[0,mid];
4. right = D[mid+1,r];
5. left = SkylineDivide(left);
6. right = SkylineDivide(right);
7. D = SkylineConquerMerge(left,right);
8. return D;
SkylineConquerMerge(left,right)
1. ryMax = Max(right)
2. for j ← 0 to left.size
3. p = left[j];
4. if (p.Y <= ryMax.Y)
5. left.remove(p);
6. right.addAll(left);
7. return right;
性能分析
- Skyline(D)的第1行对所有点进行排序,快排的时间复杂度是T(n)=θ(nlgn);
- SkylineDivide(D)的第5、6行对所有点进行二分,第7行进行合并,合并的时间复杂度是θ(n);
- 所以我么可以得到SkylineDivide(D)函数的时间复杂度是T(n)=T(n/2)+θ(n),根据master定理,可知T(n)=θ(nlgn);
- 所以,skyline的分治算法的时间复杂度为T(n)=θ(nlgn)+θ(nlgn)=θ(nlgn)。