Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 批量装载点四叉树_Python_Data Structures_Quadtree - Fatal编程技术网

Python 批量装载点四叉树

Python 批量装载点四叉树,python,data-structures,quadtree,Python,Data Structures,Quadtree,我实现了一种批量加载点四叉树的方法。但对于某些输入,它不能正常工作,例如,如果有许多点具有相同的x或y坐标。 一个示例数据集是: test = [(3, 1), (16, 1), (11, 4), (5, 4), (9, 6), (5, 10), (1, 15), (11, 5), (11, 15), (12, 16), (19, 17)] tree = create(test) 问题出现在以下位置:(11,4)、(11,5)、(11,15)和(5,10)、(5,4) 这是创建

我实现了一种批量加载点四叉树的方法。但对于某些输入,它不能正常工作,例如,如果有许多点具有相同的x或y坐标。 一个示例数据集是:

test = [(3, 1), (16, 1), (11, 4), (5, 4), (9, 6), (5, 10),
        (1, 15), (11, 5), (11, 15), (12, 16), (19, 17)]
tree = create(test)
问题出现在以下位置:
(11,4)、(11,5)、(11,15)
(5,10)、(5,4)

这是
创建
功能:

def create(point_list, presorted=False):
    if not point_list:
        return QuadNode()

    if not presorted:
        point_list.sort(key=lambda p: [p[0],p[1]])

    median = len(point_list) >> 1

    relevantPoint = point_list[median]
    relevantYCoordinate = relevantPoint[1]

    node = QuadNode(data=relevantPoint)

    leftBins = point_list[:median]
    rightBins = point_list[median + 1:]

    nwBins = [bin for bin in leftBins if bin[1] >= relevantYCoordinate]
    swBins = [bin for bin in leftBins if bin[1] < relevantYCoordinate]

    neBins = [bin for bin in rightBins if bin[1] >= relevantYCoordinate]
    seBins = [bin for bin in rightBins if bin[1] < relevantYCoordinate]

    node.nwNode = create(nwBins, presorted=True)
    node.swNode = create(swBins, presorted=True)

    node.neNode = create(neBins, presorted=True)
    node.seNode = create(seBins, presorted=True)
    return node
我想遵循插入、删除等规则:

  • swNode
    point.x
    point.y
  • seNode
    point.x>=parent.x
    point.y
  • nwNode
    point.x
    point.y>=parent.y
  • neNode
    point.x>=parent.x
    point.y>=parent.y

您选择中间的方法是正确的(正如在的原始文章Quadtrees:A data structure for Retrieve on composite Key中所解释的那样),但是为子树构建子集合的方式是错误的

例如,对于此排序列表:

[(1,1)、(1,2)、(1,3)]

中位数为
1,2
,并且根据您的边界规则,
1,1
必须位于SE,而
1,3
必须位于NE。
在原始文章中,SE和NW是“开放”的,而NW和SE是封闭的:
1,1
在NW,而
1,3
在SE。正如您在边界定义中看到的,中间带之前的所有元素将位于东南或西北方向,中间带之后的所有元素将位于西南或东北方向。但这不符合你对边界的定义

因此,要么你的边界定义有问题,要么你必须检查列表中的每个元素,以确保它最终位于正确的区域。对于EAX示例:

relevantPoint = point_list[median]
node = QuadNode(data=relevantPoint)
del point_list[median]

nwBins = [(x,y) for x,y  in point_list if x < relevantPoint[0] and y >= relevantPoint[1]]
swBins = [(x,y) for x,y  in point_list if x < relevantPoint[0] and y < relevantPoint[1]]
seBins = [(x,y) for x,y  in point_list if x >= relevantPoint[0] and y <= relevantPoint[1]]
neBins = [(x,y) for x,y  in point_list if x <= relevantPoint[0] and y > relevantPoint[1]]
relevantPoint=点列表[中间值]
节点=四节点(数据=相关点)
del point_列表[中间值]
如果x=relevantPoint[1]],则nwBins=[(x,y)表示点_列表中的x,y]
如果xseBins=[(x,y)对于点列表中的x,y如果x>=相关点[0]和y,你能提供一篇讨论选择中值的论文或文章/博客吗?事实上,我刚刚意识到我的答案是完全错误的,将更改为几分钟,对不起…所以现在的输出是
[(1,15),(3,1),(5,4),(5,10),(9,6),(11,4),(11,5),(11,15),(11,15),(12,16),(16,1),(19,17)]
。您希望输出是什么?我有点忘记了四叉树是如何工作的。。
relevantPoint = point_list[median]
node = QuadNode(data=relevantPoint)
del point_list[median]

nwBins = [(x,y) for x,y  in point_list if x < relevantPoint[0] and y >= relevantPoint[1]]
swBins = [(x,y) for x,y  in point_list if x < relevantPoint[0] and y < relevantPoint[1]]
seBins = [(x,y) for x,y  in point_list if x >= relevantPoint[0] and y <= relevantPoint[1]]
neBins = [(x,y) for x,y  in point_list if x <= relevantPoint[0] and y > relevantPoint[1]]