Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.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
Algorithm 数据结构预处理给定的N个点集,并给出一个查询并行条带输出,所有点都位于条带内_Algorithm_Data Structures_Computational Geometry_Lines_Points - Fatal编程技术网

Algorithm 数据结构预处理给定的N个点集,并给出一个查询并行条带输出,所有点都位于条带内

Algorithm 数据结构预处理给定的N个点集,并给出一个查询并行条带输出,所有点都位于条带内,algorithm,data-structures,computational-geometry,lines,points,Algorithm,Data Structures,Computational Geometry,Lines,Points,我被要求设计一种算法,对给定的N个点进行预处理,例如给定的查询平行条带,输出的所有点都位于该条带内 我试图设计算法,但我只能单独解决查询 我不知道使用哪种数据结构,并对给定的N个点进行预处理,这样我就可以轻松回答查询 我只需要一个关于如何做的想法,以及它的复杂性。解决此类问题的通常方法是使用一个 想一想把点装在盒子里,把那些盒子装在更大的盒子里,等等。。。如果你的一个较大的盒子完全在条带外面,那么你不需要检查它。然而,如果它在长条带里面,那么你必须看看里面是什么。如果里面有一个盒子不在条带里,你

我被要求设计一种算法,对给定的N个点进行预处理,例如给定的查询平行条带,输出的所有点都位于该条带内

我试图设计算法,但我只能单独解决查询

我不知道使用哪种数据结构,并对给定的N个点进行预处理,这样我就可以轻松回答查询


我只需要一个关于如何做的想法,以及它的复杂性。

解决此类问题的通常方法是使用一个

想一想把点装在盒子里,把那些盒子装在更大的盒子里,等等。。。如果你的一个较大的盒子完全在条带外面,那么你不需要检查它。然而,如果它在长条带里面,那么你必须看看里面是什么。如果里面有一个盒子不在条带里,你也不必检查盒子里的东西。当然,关键是包装这些框,这样您通常可以跳过检查许多子框和点

(请注意,并非所有BVH都使用长方体——有些使用球体,有些使用,有些使用有点奇怪的分区,但大多数使用长方体。)

适用于大型数据库中的二维应用程序。您还可以使用一个结构(这或多或少只是BVH的一个特化),您可以这样做,因为已经有很多库用于K-d树(一种空间分区)

无论最终的结构是什么,顶级算法都将保持不变:

# This algorithm could be implemented with a stack or recursively
# instead of maintaining a potentially very long list of nodes.
nodes = { top_level_node }
loop while there are nodes left to process
    set node = first element of nodes
    remove node from nodes
    if node does not intersect strip continue loop
    if node directly contains points that are within the strip add them to the output
    if node directly contains subnodes that intersect the strip add them to nodes
end loop
根据您使用的结构,对于固定数量的尺寸,您可以预期一般行为为
O(O log n)
,其中
n
是总点数,
O
是条带内的点数。请注意,这种有点幼稚的算法使用
O(O)
内存,但如果使用堆栈或递归,则可以使用
O(logn)

Box2D物理引擎有一个相当好的2D BVH实现,非常容易使用。(许可证看起来非常宽松。)Box2D的BVH一度是基于Bullet的(可能仍然如此)。Bullet physics engine有一个3D BVH实现,我以前已经将其转换为2D,它有一个zlib(非常许可)许可证。实时物理引擎的问题在于,他们通常不想得到一棵最优的树——他们只想在几毫秒内“尽可能好地”得到它,因为他们没有时间进行优化。然而,它们对于您的目的来说可能已经足够好了


Rosettacode甚至有一个——但您的里程数可能会有所不同,因为我希望这些条目比一个使用良好的库(例如,我相信其中包含一个K-d树)的测试要少。

解决此类问题的通常方法是使用一个

想一想把点装在盒子里,把那些盒子装在更大的盒子里,等等。。。如果你的一个较大的盒子完全在条带外面,那么你不需要检查它。然而,如果它在长条带里面,那么你必须看看里面是什么。如果里面有一个盒子不在条带里,你也不必检查盒子里的东西。当然,关键是包装这些框,这样您通常可以跳过检查许多子框和点

(请注意,并非所有BVH都使用长方体——有些使用球体,有些使用,有些使用有点奇怪的分区,但大多数使用长方体。)

适用于大型数据库中的二维应用程序。您还可以使用一个结构(这或多或少只是BVH的一个特化),您可以这样做,因为已经有很多库用于K-d树(一种空间分区)

无论最终的结构是什么,顶级算法都将保持不变:

# This algorithm could be implemented with a stack or recursively
# instead of maintaining a potentially very long list of nodes.
nodes = { top_level_node }
loop while there are nodes left to process
    set node = first element of nodes
    remove node from nodes
    if node does not intersect strip continue loop
    if node directly contains points that are within the strip add them to the output
    if node directly contains subnodes that intersect the strip add them to nodes
end loop
根据您使用的结构,对于固定数量的尺寸,您可以预期一般行为为
O(O log n)
,其中
n
是总点数,
O
是条带内的点数。请注意,这种有点幼稚的算法使用
O(O)
内存,但如果使用堆栈或递归,则可以使用
O(logn)

Box2D物理引擎有一个相当好的2D BVH实现,非常容易使用。(许可证看起来非常宽松。)Box2D的BVH一度是基于Bullet的(可能仍然如此)。Bullet physics engine有一个3D BVH实现,我以前已经将其转换为2D,它有一个zlib(非常许可)许可证。实时物理引擎的问题在于,他们通常不想得到一棵最优的树——他们只想在几毫秒内“尽可能好地”得到它,因为他们没有时间进行优化。然而,它们对于您的目的来说可能已经足够好了


Rosettacode甚至有一个——但您的里程数可能会有所不同,因为我希望这些条目比一个使用良好的库(例如我相信其中包含一个K-d树)测试得更少。

已知的条带是平行于x轴还是y轴的?条带是二维的吗?(也就是说,你所有的点都是二维的吗?)当然是二维的,否则就太容易了。条带不平行于轴,它们彼此平行。条带方向是否固定?条带是否平行于x轴或y轴?条带是否为二维?(也就是说,你所有的点都是二维的吗?)当然是二维的,否则就太容易了。带材与轴线不平行,它们彼此平行。带材方向是否固定?