【问题标题】:Are any of these quad-tree libraries any good?这些四叉树库中的任何一个都有用吗?
【发布时间】:2010-02-19 17:59:45
【问题描述】:

我的某个项目似乎需要使用四叉树,这是我以前从未使用过的。从我所读到的内容来看,它们应该允许显着的性能增强,而不是对问题的蛮力尝试。这些 python 模块有什么好处吗?

编辑 1:有谁知道比 pygame wiki 中提供的更好的实现?

编辑 2:以下是一些其他人可能会发现对 Python 中的路径查找技术有用的资源。

【问题讨论】:

  • 我想你在这里跳过了一步:如果你“以前没有四叉树的经验,也不知道如何使用它们”,那么你怎么知道你需要四叉树库?即使假设您找到了满足您需求的完美匹配项,您不会在正确使用它时遇到麻烦吗? IMO,在开始实施之前,您需要多研究一下这个问题。

标签: python performance quadtree


【解决方案1】:

this commentjoferkington 指的是当前问题并说:

就其价值而言,scipy.spatial.KDTree(和/或 scipy.spatial.cKDTree,出于性能原因用 C 语言编写)是比列出的选项更可靠的选择。

【讨论】:

  • 公平地说,如果可以选择安装 scipy,scipy.spatial.KDTree 只是一个更好的解决方案。可能不是(scipy 有一些有趣的依赖项)。
  • 请注意,scipy 的 KDTree 是面向集群用例的,并且还有一些对非科学家来说并不明显的术语。例如,想要在树中查询 AABB 中的所有点?那么你需要使用query_ball_pointp=1,当然(:但是你仍然不能输入你自己的盒子形状(它总是一个“球体”)。也不支持动态更新。这是很好的代码,但可能需要比其他一些解决方案更多的工作来理解并从中获得你想要的东西。
【解决方案2】:

另一个要检查的库是PyQuadTree,它是一个纯 Python 四叉树索引,也适用于 Python 3x。您只需添加一个项目的边界框作为一个 4 长度序列,因此它可以用于各种目的,甚至是负坐标系。

虽然我是作者,但我实际上只是采用了别人的四叉树结构/代码,使其更加用户友好,添加了对矩形四边形的支持,并添加了文档。如何使用它的一个简单示例:

#SETUP
import pyqtree
spindex = pyqtree.Index(bbox=[0,0,1000,500])

#ADD SOME ITEMS
for item in items:
    spindex.insert(item=item, bbox=item.bbox)

#RETRIEVE ITEMS FROM A REGION
result = spindex.intersect(bbox=[233,121,356,242])

【讨论】:

    【解决方案3】:

    搜索四叉树时,python 包索引会生成 2 个其他库:http://pypi.python.org/pypi?%3Aaction=search&term=quadtree&submit=search

    免责声明:从未使用过四叉树或任何这些库。

    【讨论】:

    • 这似乎是最好的答案。它没有帮助,但它是最好的。
    【解决方案4】:

    有时,如何在 Python 中实现像树这样的数据结构并不明显。

    例如,

          D 
        /   \
       B     F
      / \   / \
     A   C E   G
    

    是一个简单的二叉树结构。在 Python 中,您可以这样表示它:

    [D,B,F] 是一个具有左右子树的节点。要表示完整的树,您将拥有:

    [D,[[B,A,C],[F,E,G]]] 
    

    这是一个简单的嵌套列表列表,其中任何节点都可以是 D 或 C 之类的值,并且任何节点都可以是子树,递归地是嵌套列表的列表。你可以用字典做类似的事情。这些类型的实现有点快速和肮脏,并且在教师期望具有指向其他节点的指针的 N​​ode 类的作业中可能无法接受,但在现实世界中,通常最好使用 Python 列表/字典的优化实现第一的。仅当结果在某些方面不合适时,才将其重写为更像用 C 或 Java 编写的那样。

    除此之外,您当然需要实现各种算法来操作您的树,因为四叉树不仅仅是一些数据;它是关于如何插入和删除节点的一​​组规则。如果这不是课程作业问题,那么Quadtree 0.1.2 可能是个好主意。

    【讨论】:

    • Quadtree 0.1.2 将无法在 Python 3.1 中运行,因为没有设置工具。需要先编译源代码才能在 Windows 上运行。
    • 如果你真的需要性能,那么你可以编译 Python 3.1 的模块。如果你不能自己做,那就去 comp.lang.python 问问有没有人可以帮你做。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-27
    相关资源
    最近更新 更多