四叉树范围搜索的复杂性

时间:2016-09-13 19:24:36

标签: time-complexity big-o discrete-mathematics quadtree aabb

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

https://groups.google.com/forum/#!topic/uw.cs.cs240/MGfrsvKAiMA

和此:

How can worst case complexity of quad tree O(N)?

,但我不相信它能解决我的问题。也许是第一个,但我不明白这个解释。到目前为止。

我在离散空间(实体的2d方形表)上有一个四叉树。它是一个区域树,如英语维基百科页面(https://en.wikipedia.org/wiki/Quadtree#Types)中所述。每个区域只能容纳一个实体。每个实体都有其离散坐标。

我已经实现了一种方法来查找某些(离散)AABB中的所有实体,与上述Wiki页面中的queryRange()函数完全一样。

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

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

此外,我还要感谢任何可靠的消息来源。我正在写一篇硕士论文,我需要引用。我真的似乎无法谷歌任何关于这个主题的好东西。

1 个答案:

答案 0 :(得分:3)

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

  1. 数据分发
  2. 插入顺序(除非您重新平衡树)
  3. 是否存储点或矩形(据我所知,点数更常见)
  4. 您正在执行的查询类型
  5. 我不是复杂度计算方面的专家,所以可能有某种方式可以计算平均复杂度,但它可能对给定的真实场景没有用。

    最大的复杂性更容易一些。假设 n 是条目的数量, h 是树的高度。

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

    有一些边界情况:例如,如果数据的形状使得所有点都在一条线(0,1),(0,2),(0,3),(0,4)上, ...并且它们按顺序插入,然后树可以退化为列表,使得h = n,除非您执行一些重新平衡。

    如果您对四叉树变体感兴趣,可能需要查看最近的http://blog.2ndquadrant.com/compiling-postgresql-extensions-visual-studio-windows/PH-Tree包含一些复杂性计算。 PH-Tree是基于比特级trie分解的区域四叉树(分解为象限)。因此,最大深度等于值中的位数,通常为32或64.结构与插入顺序无关,因此没有重新平衡(也不需要,因为深度有限)。可以找到一些技术更新PDF。 (免责声明:这是基于我在大学期间自己的研究)。