我已经搜索过这些信息了。发现这个:
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()递归访问的子树数量有关。
此外,我还要感谢任何可靠的消息来源。我正在写一篇硕士论文,我需要引用。我真的似乎无法谷歌任何关于这个主题的好东西。
答案 0 :(得分:3)
查询的时间复杂性取决于许多方面:
我不是复杂度计算方面的专家,所以可能有某种方式可以计算平均复杂度,但它可能对给定的真实场景没有用。
最大的复杂性更容易一些。假设 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。 (免责声明:这是基于我在大学期间自己的研究)。