分治算法求解二维点集合的Skyline

分治算法求解二维点集合的Skyline

实验背景和内容

在这里插入图片描述
给定二维数据集合D,要求设计、分析并实现基于分治的二维数据Skyline求解算法。

思路

  1. 先将所有点对都按照x轴进行排序;
  2. 然后递归地二分所有点对;
  3. 左右集合合并的时候,因为左边集合的x值一定小于右边集合的x值,则如果左边的集合不为空,则依次将左边点集的点的y值与右边的点集中最大y值比较,如果,左边元素的y值小于等于右边点集中y最大的值,则左边那个元素一定被右边y值最大的元素所支配,就将左边的那个点删去,直至左边集合比较结束。
  4. 然后将左边集合加到右边集合中,并返回右边的集合继续进行递归。

伪代码

 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)。

结果

在这里插入图片描述
skyline问题的Java源代码

  • 7
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值