【问题标题】:Understanding the time complexities of the R-Tree?了解 R-Tree 的时间复杂度?
【发布时间】:2018-02-15 20:39:24
【问题描述】:

在 Wikipedia 上的快速搜索显示,R-Tree 搜索的最坏情况性能未定义,平均情况为 O(logMn)。

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

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

【问题讨论】:

    标签: database indexing r-tree


    【解决方案1】:

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

    最好的情况是 O(log n)。 R-Tree 在每个分支中具有相同的深度,并且数据仅存储在叶节点中,因此您将始终必须遍历 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-Tree 中估计的节点数。
    • “平均”的问题很明显:平均哪些数据分布和哪些查询。但是如果你有例如用户在地球上的位置,并且想要找到 1 个最近的邻居,O(logM n) - 树的高度 - 是一个很好的估计搜索时间。您可能需要访问一些叶节点,但不是很多。但是尝试以理论上的方式将其形式化为“平均复杂性”......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-20
    • 2020-01-30
    • 2017-10-29
    • 2018-06-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多