Divide-and-Conquer算法的设计
设计过程分为三个阶段:
Divide:整个问题划分为多个子问题
Conquer:求解各子问题(递归调用正设计的算法)
Merge:合并子问题的解,形成原始问题的解
下面是几道小题使用分治算法求解的思路。
黑白点对
题目:
给定平面上有n个白点和n个黑点,任意三点不共线,试实际一个分治算法将每个白点与一个黑点相连,是所有连线互不相交。
思路:
将所有2n个点点按照x有小到大排序,以一条垂直于x轴的线将这些点分为大小均为n的左右两部分,左右两部分递归的进行黑白点对的匹配,由于每部分分到的黑点数与白点数不一定相等,最终返回的每部分都是互不相交的黑白点对连线以及一些单独的黑点,或者是互不相交的黑白点对连线以及一些单独的白点。
在合并时,若两部分剩余的点都是黑色或都是白色,则合并完成。
若一部分剩余的是黑点,另一部分剩余的是白点,则将这些点匹配连线。每次新连接一条线时,若并不与其他线相交,则连接下一对;若与其他k对相交,可以通过k-1次交换使其不再交叉(由于不存在任意三点共线,所以必然可以通过有限次交换使其互不相交),连接下一对。直到单独的黑点或者白点全部连接完毕。
算法设计:
Divide:按照横坐标,将所有点分为等量的左右两部分。
Conquer:递归的将左右两部分进行黑白点对的匹配。当某部分中只有一个点或两个同色的点时,直接返回;有两个不同色的点时,将他们匹配。
Merge:左右两部分中若有某部分黑白点完全匹配了,直接合并,返回;左右两部分没有匹配的单独点同色,直接合并,返回;将左右两