分治算法

Divide-and-Conquer算法的设计

设计过程分为三个阶段:

Divide:整个问题划分为多个子问题

Conquer:求解各子问题(递归调用正设计的算法)

Merge:合并子问题的解,形成原始问题的解

下面是几道小题使用分治算法求解的思路。

黑白点对

题目:

给定平面上有n个白点和n个黑点,任意三点不共线,试实际一个分治算法将每个白点与一个黑点相连,是所有连线互不相交。

思路:

将所有2n个点点按照x有小到大排序,以一条垂直于x轴的线将这些点分为大小均为n的左右两部分,左右两部分递归的进行黑白点对的匹配,由于每部分分到的黑点数与白点数不一定相等,最终返回的每部分都是互不相交的黑白点对连线以及一些单独的黑点,或者是互不相交的黑白点对连线以及一些单独的白点。

在合并时,若两部分剩余的点都是黑色或都是白色,则合并完成。

若一部分剩余的是黑点,另一部分剩余的是白点,则将这些点匹配连线。每次新连接一条线时,若并不与其他线相交,则连接下一对;若与其他k对相交,可以通过k-1次交换使其不再交叉(由于不存在任意三点共线,所以必然可以通过有限次交换使其互不相交),连接下一对。直到单独的黑点或者白点全部连接完毕。

算法设计:

Divide:按照横坐标,将所有点分为等量的左右两部分。

Conquer:递归的将左右两部分进行黑白点对的匹配。当某部分中只有一个点或两个同色的点时,直接返回;有两个不同色的点时,将他们匹配。

Merge:左右两部分中若有某部分黑白点完全匹配了,直接合并,返回;左右两部分没有匹配的单独点同色,直接合并,返回;将左右两部分没

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值