Algorithm 将平衡树映射到平面上的点

Algorithm 将平衡树映射到平面上的点,algorithm,computational-geometry,Algorithm,Computational Geometry,我们得到了一个大小为N的平衡树,在这个意义上,对于树中的每个节点,如果根在该节点上的子树有大小N和k子树,那么它的k个子树的大小是Omega(N/k)。我们还得到了平面上的N点,没有三个点是共线的。我们试图在树中的节点和平面上的点之间找到一个双射,这样在平面上绘制树不会导致任何边交叉k是Theta(1),每个节点可以不同 我试图找到一个递归的解决方案来解决这个问题,但是没有用,因为我不知道如何保证无交叉的要求。目标运行时是O(nlog^2n),因此T(n)=k*T(n/k)+O(nlogn)形式

我们得到了一个大小为
N
的平衡树,在这个意义上,对于树中的每个节点,如果根在该节点上的子树有大小
N
k
子树,那么它的k个子树的大小是
Omega(N/k)
。我们还得到了平面上的
N
点,没有三个点是共线的。我们试图在树中的节点和平面上的点之间找到一个双射,这样在平面上绘制树不会导致任何边交叉
k
Theta(1)
,每个节点可以不同


我试图找到一个递归的解决方案来解决这个问题,但是没有用,因为我不知道如何保证无交叉的要求。目标运行时是
O(nlog^2n)
,因此
T(n)=k*T(n/k)+O(nlogn)
形式的重复会导致这种情况,因此我尝试沿着这些思路思考。我将通过x坐标对点进行排序,找到中间值,然后将其余的点划分成块并递归求解。但我已经列出了让解决方案失败的测试用例。有什么帮助吗?

您应该能够为根选择一个任意点,然后像饼图一样分割围绕它的平面,这样每个区域都包含其相应子树中的点数,并且从根到区域中任何点的线都完全位于该区域内

然后,您应该能够递归地对每个子区域执行相同的操作。对于每个子树,您将需要围绕子树根按角度顺序重新排序该子区域中的剩余点,这将给出您的
T(n)=k*T(n/k)+O(n log n)
循环


编辑:进一步考虑,你可能无法选择任意点;您希望在点的凸包上拾取一个点,以便引入线不与凸包相交——否则,子树可能会与引入线相交。这很容易做到,比如说,在当前角度排序中选择子集的第一个元素