以下是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代码
答案 0 :(得分:2)
征服部分的想法是,你必须假设返回的集合M1
& M2
符合这一条件:
同一组中的任何一对点都可以共存
也就是说,集合中的任何一对点都必须满足x1 < x2 && y1 > y2
在合并M1
和M2
之后,您应该返回一个满足此条件的集合,最后我们获得的集合就是答案。
有一点需要注意的是,我认为在合并时,x
实际上不需要进行比较,因为M1
中的所有点都应该x
<= M2
我们使用q
M2
中的第一个点与M1
中的所有点进行比较,因为
q
无需与M2
q
是x
中y
最小M2
的点,如上所述M1
x
M2
应该小于q
中的所有点,因此这里的要点y
在M2
中的M1
最大,因此覆盖(消除)点的最大“潜力”在q
组合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)}