看来我的某个项目需要使用四叉树,这是我以前从未使用过的。从我所看到的,他们应该允许大量的性能增强,而不是蛮力尝试解决问题。这些python模块中的任何一个都不错吗?
编辑1:有没有人知道比pygame wiki中提供的更好的实现?
编辑2:以下是其他人可能会发现Python中的路径查找技术有用的一些资源。
答案 0 :(得分:11)
在this comment中,joferkington引用了当前的问题并说:
只是为了它的价值,
scipy.spatial.KDTree
(和/或scipy.spatial.cKDTree,出于性能原因用C语言编写)是一个比列出的选项更强大的选择。
答案 1 :(得分:4)
另一个要检查的库是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])
答案 2 :(得分:1)
有时,如何在Python中实现像树一样的数据结构并不明显。
例如,
D
/ \
B F
/ \ / \
A C E G
是一个简单的二叉树结构。在Python中,您可以这样表示:
[D,B,F]
是具有左右子树的节点。要表示您将拥有的完整树:
[D,[[B,A,C],[F,E,G]]]
这是一个简单的嵌套列表列表,其中任何节点都可以是D或C之类的值,任何节点都可以是一个子树,递归地是一个嵌套列表列表。你可以用字典词典做类似的事情。这些类型的实现有点快速和肮脏,并且在教师期望Node类具有指向其他节点的指针的赋值中可能是不可接受的,但在现实世界中,通常更好地使用Python列表/词典的优化实现第一。只有当结果在某种程度上不合适时,才能将其重写为更像是用C或Java编写它。
除此之外,你需要实现各种算法来操纵你的树,因为四叉树不仅仅是一些数据;它是一组关于如何插入和删除节点的规则。如果这不是一个课程作业问题,那么Quadtree 0.1.2可能是一个好主意。
答案 3 :(得分:1)
在搜索四叉树时,python包索引会生成另外两个库:http://pypi.python.org/pypi?%3Aaction=search&term=quadtree&submit=search
免责声明:从未使用四叉树或任何这些库。