怎样计算来自两个集合的最近点对?

eijnim 2011-05-28 07:16:20
RT。就是有两个点集A和B,求最近点对,其中一个点来自A,另一个来自B。哪位大牛有比较好的算法?
...全文
417 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
showjim 2011-05-30
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 pandm 的回复:]
合并,然后求最近点对。
这个问题如果有比“合并A和B,然后求最近点对。”更好的解法的话,那我就能在求一般的最近点对问题里将点数组分成两部分a[1..N/2]和a[n/2 + 1..N]来加速了。。。
[/Quote]
这样是可以的啊,区别就是要抛弃来自同一集合的相邻点对
超级大笨狼 2011-05-29
  • 打赏
  • 举报
回复
求完凸包,就可以连接凸包中心点做个线段,最靠近线段中点作为坐标轴原点的话,
两个凸包上的各取最靠近原点的上下两个点,这四个候选点,求两个欧式距离,最近的那个就是。

这几天在研究凸包,所以啥都往凸包上扯,错了别介意哈:)
超级大笨狼 2011-05-29
  • 打赏
  • 举报
回复
哦,好像无法分半,直接求凸包吧,复杂度不受影响。
eijnim 2011-05-29
  • 打赏
  • 举报
回复
对了,POJ上还有个裸题3714,大家有兴趣可以看一下,代码需要的给我发邮件jie414341055#gmail.com
eijnim 2011-05-29
  • 打赏
  • 举报
回复
谢谢大家了,这个问题已经解决了,其实很简单,和普通一个集合的最近点对一样,分治,复杂度O(n*logn),只不过在合并的时候只有两个点属于不同的集合才会更新。这么做已经证明是对的,因为递归到2个点的时候最近的点对一定是合并的时候产生的,所以其实在整个算法过程中不断更新的答案一定是在合并的时候产生的,因此只需在合并的时候注意两个点属于不同集合就好了。真囧,其实只需要加一个标记域和一行代码就OK了。
超级大笨狼 2011-05-29
  • 打赏
  • 举报
回复
好象应该这样:

1,把AB都分成两半,去掉AB靠外侧的点,比如去除A的左半,B的右半,因为肯定形成不了最近。
2,分别求凸包ab,graham法复杂度为n*logn,利用叉积的技巧来进行犄角排序。
3,对ab的极点,求最近,复杂度m*logm忽略不计。

总体复杂度
A+B+(A*logA+B*logB-A-B)/2+m*logm

忽略小的和常数,大概是
A*logA+B*logB
lovekelly20 2011-05-28
  • 打赏
  • 举报
回复
我觉得复杂度要求是O(nlogn)的话可以按2楼说的当成是所有的点的小值。只不过每次求出当前最小值的时候 判断一下两个点是否在一个集合。。但是作了这么多没必要的比较总感觉怪怪的。。坐等大牛 犀利算法。
pandm 2011-05-28
  • 打赏
  • 举报
回复
抱歉。。。我理解错题目了。。。。面壁去。。
pandm 2011-05-28
  • 打赏
  • 举报
回复
合并,然后求最近点对。
这个问题如果有比“合并A和B,然后求最近点对。”更好的解法的话,那我就能在求一般的最近点对问题里将点数组分成两部分a[1..N/2]和a[n/2 + 1..N]来加速了。。。

33,008

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧