当前,我正在制作自己的结构,该结构在2D空间中保存点。我知道有很多现成的算法和种类繁多的树,但是我想拥有一些轻量级的东西。所以我在每个节点内都有(x,y)点,每个节点包含4个子节点:topLeft,topRight,botLeft,botRight下一个节点。
是否插入新节点取决于其位置。
如果树为空,请插入新节点;如果树为空,请转到第一个节点并执行:
1.确定当前节点相对于新节点的位置。
2.如果是e。 G。 topLeft并且未被占用,然后插入新节点。
3.如果topLeft位置已被占用,请转到该节点并重复。
我需要的结构不需要具有“删除特定节点”功能,因此,如果作业完成,则析构函数将以递归方式删除整个树。
如果树不为空,则转到第一个节点,然后:
1.检查给定区域的x是否小于节点的x,区域的y是否小于节点的y(如果存在),然后转到topLeft子节点(如果存在)。
2. topRight相同(检查区域的x +宽度位置和y)。
3. botRight相同(检查区域的x +宽度和y +高度)。
4. botLeft相同(检查区域的x和y +高度)。
5.检查当前节点是否在区域内,如果它是您要处理的点。递归返回并重复。
这就是我的结构,图像显示了要检查特定区域(橙色颜色)的键: link
我的问题是,有没有更好的算法?我可以改善什么?我看到了四叉树,但它似乎有所不同,并且包含更多数据。我需要可以轻松地将移动物体保持为2D的物体。感谢您的帮助。
答案 0 :(得分:0)
您拥有的基本上是一个四叉树,但是您使用数据进行拆分,而不是使用典型的中间树。
您可以通过切换到KD tree来改善系统。除了沿单个维度拆分的每个点外,其他过程都相似。主要区别在于每个节点只有两个指针(而不是4个),因此可以节省大约一半的内存。
另一件事是,您将空间分开直到达到1点。因为现代CPU确实做着花哨的事情,所以对于较小的值,线性搜索将比遍历树更快。因此,只有在您有50-100个点时,我才拆分一个空间。这还将节省一堆根本不需要存储的指针。
如果您对点的分布有所了解,则可以做得更好。如果分布是均匀的,则可以简单地将空间分成统一的单元格并将点存储在关联的单元格中。一条经验法则说,如果您有N个点,则应该有sqrt(N)个像元,但是您应该尝试看看哪种方法最有效。