Time complexity 四叉树的复杂性&x27;s范围搜索

Time complexity 四叉树的复杂性&x27;s范围搜索,time-complexity,big-o,discrete-mathematics,quadtree,aabb,Time Complexity,Big O,Discrete Mathematics,Quadtree,Aabb,我已经搜索过这个信息了。我们发现: 这是: ,但我不相信它能解决我的问题。也许是第一个,但我不明白为什么。切中要害 我有一个离散空间上的四叉树(2d正方形实体表)。这是一个区域树,如英文维基百科页面()所述。每个区域只能容纳一个实体。每个实体都有其离散坐标 我已经实现了一种方法来查找某些(离散)AABB中的所有实体,其工作原理与前面提到的Wiki页面中的queryRange()函数完全相同 我的问题是:这个queryRange()函数的时间复杂度是多少 我自己也尝试过,但这似乎取决于许多不同

我已经搜索过这个信息了。我们发现:

这是:

,但我不相信它能解决我的问题。也许是第一个,但我不明白为什么。切中要害

我有一个离散空间上的四叉树(2d正方形实体表)。这是一个区域树,如英文维基百科页面()所述。每个区域只能容纳一个实体。每个实体都有其离散坐标

我已经实现了一种方法来查找某些(离散)AABB中的所有实体,其工作原理与前面提到的Wiki页面中的
queryRange()
函数完全相同

我的问题是:这个
queryRange()函数的时间复杂度是多少

我自己也尝试过,但这似乎取决于许多不同的因素,例如:树的深度、树中元素的数量、给定AABB的大小。我认为它的核心与queryRange()递归访问的子树数量有关


我也很感谢任何可靠的消息来源。我正在写一篇硕士论文,我需要引文。不过,在这个话题上,我真的无法用谷歌搜索到任何好东西。

查询的时间复杂性取决于许多方面:

  • 数据分布
  • 插入顺序(除非重新平衡树)
  • 无论是存储点还是矩形(据我所知,点更常见)
  • 正在执行的查询类型
  • 我不是复杂性计算方面的专家,所以可能有某种方法可以计算平均复杂性,但对于给定的实际场景可能没有用处

    最大的复杂性要简单一些。假设n是条目数,h是树的高度

    一个大型查询显然会返回所有元素,因此复杂性为O(n)。一个非常狭窄的查询必须从根遍历到一个叶,因此O(h)。这给出了O(n+h)的组合

    有一些边界情况:例如,如果数据的形状使所有点都在一条线上(0,1)、(0,2)、(0,3)、(0,4),。。。如果按顺序插入,那么树可能会退化为一个列表,使得h=n,除非执行一些再平衡


    如果您对四叉树变体感兴趣,您可能想看看最近的。包含一些复杂度计算。PH树是基于位级trie分解的区域四叉树(分解为四叉树)。因此,最大深度等于值中的位数,通常为32或64。结构独立于插入顺序,因此不需要重新平衡(也不需要,因为深度有限)。可以找到一些技术更新。(免责声明:这是基于我在大学时自己的研究)。

    依赖“与AABB相交的叶/节点”对你来说足够好吗?如果我没有弄错的话,应该很容易证明复杂性是$$\mathcal O(l)=\mathcal O(n)$$,其中$$n$$是节点数,$$l$$是范围内的叶子数。四叉树的圣经是Hannan Samet:多维和度量数据结构的基础。你应该在那里找到你想要的信息。谢谢你的回答。不幸的是,我没有时间实现另一棵树,我必须坚持我所拥有的(我正处于硕士论文的最后阶段,截止日期非常接近)。我认为在我的四叉树中无法实现任何再平衡,因为它总是被4等分。因此,无论顺序如何,最终结果取决于点/实体的位置(我确实存储点)。我必须移动点来改变树的结构。至于广域查询中的O(n),如果我理解正确的话,即使我们的树有3层深,也只会留下问题:那么它是O(n+n/4+n/16)=O(n)仍然-对吗?1)O(n+n/4+n/8)=O(n),这是正确的。2) PH树的源代码在Apache许可下可用,因此如果Java还可以,您不必重新实现它。3)我假设在插入第一个元素时,数据的总范围是未知的。如果您不知道,在根节点之外可能有很多点,即您必须在根节点上方创建节点,这可能会导致非常不平衡的树。我认为,如果您在创建树时知道数据的范围,那么不平衡问题就不会那么严重了,对于集群数据,您仍然可以通过移动根节点来减少树的深度。2)Java不好,项目是用C#编写的,带有Unity engine。没关系。3) 是的,我可能还不够清楚。Rootnode的大小是恒定的,平方和偶数的大小是2的幂。深度其实不是什么大问题,因为这个四叉树是为RTS地图制作的——常见的尺寸:64、128、256分别给出深度6、7、8。这确实是一个可以忽略不计的数字(尽管在O表示法中仍然必须考虑h)。我想现在一切都清楚了:)