递归如何在分裂和征服最大值集算法中工作?

时间:2017-03-27 03:25:27

标签: algorithm recursion divide-and-conquer

以下是Goodrich算法教科书中的伪代码算法,用于查找一组点中的主导2D点,称为查找最大值集:

Algorithm MaximaSet(S):

Input: A set,S,of n points in the plane

Output: The set, M, of maxima points in S 

if n ≤ 1

then return S  

Let p be the median point in S, by lexicographic (x,y)-coordinates 

Let L be the set of points lexicographically less than p in S 

Let G be the set of points lexicographically greater than or equal to p in S 

 M1 ←MaximaSet(L) 
 M2 ←MaximaSet(G) 

 Let q be the lexicographically smallest point in M2 

  for each point, r, in M1 do 

              if x(r) ≤ x(q) and y(r) ≤ y(q) 

              then Remove r from M1 

 return M1 ∪ M2

我的问题是在第10,11行的两次递归调用中。我的理解是,在第10行第一次调用M1会将L侧分成另一个L和G组,然后将下一个L分成另一个L和G组,直到一组保持不变,下一行将运行并执行同样的事情是G方面的M2,但现在它如何与q进行比较?有人能帮助我追踪这个算法的征服部分吗?

给出

(1,4)(2,6),(3,1)(4,5)(5,7)(6,9)(7,2),(8,6)(9,3)

我知道最大值设置是(6,9)(8,6)(9,3)但我仍然坚持使用THIS算法得到的确切结果。我通过蛮力解决了这个问题。这开始是一个硬件问题,我在技术上可以继续,因为我确实找到了答案,但我真的需要了解这一点,我已经尝试了2本教科书和谷歌,但我想我这次需要一个人。提前谢谢你,因为这是我第一次上堆,请不要犹豫(请,请)给我任何更正我如何问我的问题或提出我的p代码

1 个答案:

答案 0 :(得分:2)

征服部分的想法是,你必须假设返回的集合M1& M2符合这一条件:

  

同一组中的任何一对点都可以共存

也就是说,集合中的任何一对点都必须满足x1 < x2 && y1 > y2

在合并M1M2之后,您应该返回一个满足此条件的集合,最后我们获得的集合就是答案。

有一点需要注意的是,我认为在合并时,x实际上不需要进行比较,因为M1中的所有点都应该x <= M2

我们使用q M2中的第一个点与M1中的所有点进行比较,因为

  1. 如上所述,q无需与M2
  2. 中的其他元素进行比较
  3. 视觉上,qxy最小M2的点,如上所述M1 x M2应该小于q中的所有点,因此这里的要点yM2中的M1最大,因此覆盖(消除)点的最大“潜力”在q
  4. 组合1&amp; 2,该算法使用M1来比较M2中的所有点,以尝试消除绝望的候选者,并将剩下的dtf = open("C:\\Users\\foggi\\Documents\\Fred.txt","w") dtf.write("Hello people") 联合起来形成一个满足上述条件的新集合。

    让我们使用您的示例进行演示:

    鸿沟: (1,4)(2,6)(3,1)(4,5)(5,7)(6,9)(7,2)(8,6)(9,3); L =(1,4)(2,6),(3,1)(4,5)(5,7); R =(6,9)(7,2),(8,6)(9,3)

    鸿沟: (1,4)(2,6)(3,1)(4,5)(5,7); L =(1,4)(2,6),(3,1); R =(4,5)(5,7)

    鸿沟: (1,4)(2,6)(3,1); L =(1,4)(2,6); R =(3,1),返回{(3,1})

    鸿沟: (1,4)(2,6); L =(1,4); 返回{(1,4)} ; R =(2,6); 返回{(2,6)}

    鸿沟: (4,5)(5,7); L =(4,5); 返回{(4,5)} ; R =(5,7); 返回{(5,7)}

    征服: (1,4)(2,6); M1 = {(1,4)}; M2 = {(2,6)} q =(2,6); 返回合并集 = {(2,6)}

    征服: (1,4)(2,6)(3,1); M1 = {(2,6)}; M2 = {(3,1)}; q =(3,1); 返回合并集 = {(2,6),(3,1)}

    征服: (4,5)(5,7); M1 = {(4,5)}; M2 = {(5,7)}; q =(5,7); 返回合并集 = {(5,7)}

    征服: (1,4)(2,6)(3,1)(4,5)(5,7); M1 = {(2,6),(3,1)}; M2 = {(5,7)}; q =(5,7); 返回合并集 = {(5,7)}

    鸿沟: (6,9)(7,2)(8,6)(9,3); L =(6,9)(7,2); R =(8,6)(9,3)

    鸿沟: (6,9)(7,2); L =(6,9); 返回{(6,9}); R =(7,2); 返回{(7,2)}

    鸿沟: (8,6)(9,3); L =(8,6); 返回{(8,6)} ; R =(9,3),返回{(9,3)}

    征服: (6,9)(7,2); M1 = {(6,9)}; M2 = {(7,2)}; q =(7,2); 返回合并集 = {(6,9),(7,2)}

    征服: (8,6)(9,3); M1 = {(8,6)}; M2 = {(9,3)}; q =(9,3); 返回合并集 = {(8,6),(9,3)}

    征服: (6,9)(7,2)(8,6)(9,3); M1 = {(6,9),(7,2)}; M2 = {(8,6),(9,3)}; q =(8,6); 返回合并集 = {(6,9),(8,6),(9,3)}

    征服: (1,4)(2,6)(3,1)(4,5)(5,7)(6,9)(7,2)(8,6)(9,3); L =(1,4)(2,6)(3,1)(4,5)(5,7); M1 = {(5,7)}, M2 = {(6,9),(8,6),(9,3)}; q =(6,9); 返回合并集 = {(6,9),(8,6),(9,3)}

    ==&GT; 返回 {(6,9),(8,6),(9,3)}