Algorithm 用O(n)时间内排序的y坐标生成优先搜索树

Algorithm 用O(n)时间内排序的y坐标生成优先搜索树,algorithm,data-structures,tree,computational-geometry,Algorithm,Data Structures,Tree,Computational Geometry,这是马克·德·伯格、奥特弗里德·张、马克·范·克雷维德、马克·奥维马斯的计算几何书中的一个练习题 第10章练习10.2: 设p是平面上n个点的集合,按y坐标排序。显示 也就是说,因为P是排序的,所以P中的点的优先级搜索树可以是 按时建成。范围查询的形式如下−∞ : qx]×[qy:q`y] 以下是我对此的想法: 从这些点创建一个完整的二元搜索树,而不是一个平衡的二元搜索树。这将在基于y值排序的自点上完成 使用x值,使用自下而上的方法构建最大堆。再次执行此操作时,将节点的y_中值设置为其左子节点的

这是马克·德·伯格、奥特弗里德·张、马克·范·克雷维德、马克·奥维马斯的计算几何书中的一个练习题

第10章练习10.2:

设p是平面上n个点的集合,按y坐标排序。显示 也就是说,因为P是排序的,所以P中的点的优先级搜索树可以是 按时建成。范围查询的形式如下−∞ : qx]×[qy:q`y]

以下是我对此的想法:

从这些点创建一个完整的二元搜索树,而不是一个平衡的二元搜索树。这将在基于y值排序的自点上完成

使用x值,使用自下而上的方法构建最大堆。再次执行此操作时,将节点的y_中值设置为其左子节点的y值

该算法存在一些问题。 考虑这个例子: 创建二叉树后,我们忽略了y_中值:

(50/8) (58/4) (33/12) (70/2) (81/6) (39/10) (31/14) (28/1) (22/3) (71/5) (90/7) (57/9) (27/11) (48/13) (86/15) 这是生成堆过程后的输出:

(22/3) (28/1) (27/11) (50/8) (71/5) (33/12) (31/14) (58/4) (70/2) (81/6) (90/7) (57/9) (39/10) (48/13) (86/15) 可以观察到,节点50/8和71/5违反了点分布的优先级。对于父级中位数处的任何值,左侧的y值都不能大于右侧的y值。 同样适用于58/4和70/2分

这是我的解决方案。 在构建堆时。如果他们不符合要求的财产,我将交换左右两个孩子。我不确定这是否有效

我需要的解决方案是基于伪代码的

如果我想实现这样的功能,那么使用基于数组的样式交换这个左右指针的堆将很困难


我走的方向对吗?如果不是,我缺少什么。

答案是创建一个平衡的二叉搜索树,如下所示。中点是根。递归地生成左边和右边的树。就像这个未经测试的代码

def make_tree (elements, left=None, right=None):
    if left is None:
        left = 0
    if right is None:
        right = len(elements) - 1

    middle = (left + right) // 2
    answer = Node(middle)
    if left < middle:
        answer.left = make_tree(elements, left, middle - 1)
    if middle < right:
        answer.right = make_tree(elements, middle + 1, right)
    return answer

此函数将以每个元素作为中间元素调用一次,每次执行O1操作。所以它是打开的。

这会创建一个BST。为什么它会是优先级搜索树?