Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database 理解R-树的时间复杂性?_Database_Indexing_R Tree - Fatal编程技术网

Database 理解R-树的时间复杂性?

Database 理解R-树的时间复杂性?,database,indexing,r-tree,Database,Indexing,R Tree,在Wikipedia上快速搜索发现,R-树在搜索中的最坏情况性能是未定义的,平均情况是O(logMn) 我认为最坏的情况是这样的,因为在找到项目之前,我们不知道在这种结构中必须执行多少次搜索,事实上,Guttman确实说过“可能需要搜索访问的节点下的多个子树,因此不可能保证良好的最坏情况性能。”我们能用必须执行的搜索数量来表示最坏的情况吗 关于一般情况,我不明白这是如何计算的。那么最好的情况是什么呢?我认为最坏的情况是O(n+logM n):假设你在R-树中存储了很多重叠的矩形。现在存储一个小矩

在Wikipedia上快速搜索发现,R-树在搜索中的最坏情况性能是未定义的,平均情况是O(logMn)

我认为最坏的情况是这样的,因为在找到项目之前,我们不知道在这种结构中必须执行多少次搜索,事实上,Guttman确实说过“可能需要搜索访问的节点下的多个子树,因此不可能保证良好的最坏情况性能。”我们能用必须执行的搜索数量来表示最坏的情况吗

关于一般情况,我不明白这是如何计算的。那么最好的情况是什么呢?

我认为最坏的情况是O(n+logM n):假设你在R-树中存储了很多重叠的矩形。现在存储一个小矩形,该矩形位于所有其他矩形重叠的区域。对该矩形的查询必须遍历所有子树:节点->O(logM n)和条目->O(n)

最好的情况是O(logn)。R-树在每个分支中具有相同的深度,并且数据仅存储在叶节点中,因此您将始终必须遍历O(logM n)节点和该节点中的所有条目,因此它应该是O(M*logM n)


我不确定你真的能计算出平均O(logM n)。但是,如果您有一些平均正态分布数据(无论这意味着什么),并且重叠很少(无论这几项意味着什么),那么您的平均查询(无论其平均值是多少)就不必遍历多个(1或2?)子树。实际上,我会说平均值是O(M*logM n),因为在一个节点中遍历了M个条目。

感谢您的澄清,最坏的情况不是O(nlogMn)吗?对于每个条目O(n),必须将子树转换为O(logMn)?在您的示例中,由于重叠,n将更大。我使用“n”作为数据项的数量(仅包含在叶节点中)。对于格式错误的树中的查询,您将遍历所有节点一次(但不超过一次),即O(logM(n))。每当遇到叶节点时,都会遍历所有条目,总计为O(n)。总的来说,您遍历所有节点+所有条目,因此O(n+logM(n))。我在理解n+logM(n)时遇到了困难,因为在搜索每个节点时,会搜索许多分支。所以在我看来,应该有多个logM(n)-一些常数附加到logM(n)上。你是否要忽略这个常量?当你遍历树中的一个节点时,你所能遍历的要么是子节点(它们包含在O(logM(n))中,要么是数据项(它们包含在O(n))中。换句话说,树总共包含(logM(n)+n)个可遍历项(节点+数据项)。遍历单个元素需要O(1)。我不太确定您还需要遍历什么?logM(n)已经是R-树中估计的节点数。“平均”的问题显然是:平均哪些数据分布,以及哪些查询。但是如果您在地球上有用户位置,并且希望找到1个最近的邻居,O(logM n)-树的高度-是一个很好的估计搜索时间。您可能需要访问几个叶节点,但不是很多。但请尝试以“平均复杂性”的理论方式将其形式化。。。