我们给出了一个大小为N
的平衡树,在某种意义上,对于树中的每个节点,如果以该节点为根的子树的大小为n
且{{1} }子项,那么其k子树的大小为k
。我们在飞机上也得到Omega(n/k)
点,没有三个是共线的。我们试图在这个树中的节点和平面上的点之间找到一个双射,这样在平面上绘制树不会导致任何边缘交叉。 N
为k
,每个节点可以有所不同。
我试图找到解决此问题的递归解决方案,但无济于事,因为我不确定如何保证无交叉要求。目标运行时为Theta(1)
,因此形式O(n log^2 n)
的重现会导致这种情况发生,所以我试图按照这些方式进行思考。我通过x-coord对点进行排序,找到中位数,然后将其余点分成块并递归求解。但我已经提出了让解决方案失败的测试用例。有什么帮助吗?
答案 0 :(得分:2)
你应该能够为你的根选择一个任意点,然后像饼一样切割它周围的平面,这样每个区域都包含相应子树中的点数,以及从根到该地区的任何一点都完全在该地区内。
然后,您应该能够以递归方式对每个子区域执行相同的操作。对于每个子树,您需要以子树根周围的角度顺序对该子区域中的剩余点进行重新排序,这样可以使您T(n) = k*T(n/k) + O(n log n)
重复出现。
编辑:进一步思考,你可能无法选择一个任意点;你想在你的点的凸包上选择一个点,这样进入的线就不会与凸包相交 - 否则,你的子树可以穿过进入的线。这很容易通过选择当前角度排序中子集的第一个元素来完成。