TreeRangeMap 时间和空间复杂度

Posted

技术标签:

【中文标题】TreeRangeMap 时间和空间复杂度【英文标题】:TreeRangeMap time and space complexities 【发布时间】:2013-11-29 07:58:06 【问题描述】:

我正在寻找番石榴TreeRangeMap,这似乎非常适合我对项目的需求。 java文档说这是基于(java标准?)TreeMap,它有O(log(n))时间来获取,放置和下一步。

但是 TreeRangeMap 应该是某种范围树实现,根据这个SO question,查询的时间复杂度为 O(k + log(n)),空间为 O(n),k 是范围大小?有人可以证实这一点吗?

我对@9​​87654323@操作的时间复杂度也很感兴趣。是否有相同的 O(k + log(n))?

谢谢。

【问题讨论】:

他似乎没有说明他使用的是什么算法,但我可以想象,它实际上是一个B+ tree,它是一个标准的数据库存储数据结构,支持范围查询。 subRangeMap 操作发送一个查询并创建一个新映射,因此如果您的范围包含 k 个值,您最终可能会遇到一个范围查询 + k 个插入的复杂性。 【参考方案1】:

这是一个视图,而不是实际的突变或任何东西。 subRangeMap 在 O(1) 时间内返回,并且它返回的 RangeMap 对于每个查询操作都有 O(log n) 附加成本——也就是说,它的所有操作仍然采用 O(log n),只是具有更高的常数因素。

来源:我是“实施它的人”。

【讨论】:

谢谢 Louis :) 事实上我已经意识到我对这个子范围中的所有值感兴趣,即返回 Map<Range<K>, V>asMapOfRanges() 方法的复杂性。还是有其他方法可以从RangeMap 获取所有值? asMapOfRanges() 是一个视图,在 O(1) 时间内返回,迭代其值是 O(n)。遍历asMapOfRanges 得到subRangeMap 实际上可能是O(log n + k) @LouisWasserman 我知道这已经过时了,你已经不在那个团队了,但是最好在 javadoc 中记录这些复杂性,而不是在 *** 中查找它们,谢谢跨度> 【参考方案2】:

我们通常使用范围树来查找位于给定区间[x1, x2] and x1 < x2 内的点。但是,如果范围树是平衡二叉树(如用红黑树实现的 TreeMap 的情况),则到 x1(或后继)和 x2(或前任)的搜索路径有成本O(log n)。当我们找到它们时,如果有k 的点数在此范围内,我们将不得不使用具有线性成本O(k) 的树遍历来报告它。所以总共O(k + log(n))

我也对时间复杂度很感兴趣 TreeRangeMap.subRangeMap() 操作。是否有相同的 O(k + 日志(n))?

<K,V> subRangeMap(Range<K> subRange) 返回此范围图与范围相交的部分的视图,结果只是另一个balanced-binary search Tree。那为什么不呢?

【讨论】:

是的,这似乎是答案,但让我们等待实现它的人有话。

以上是关于TreeRangeMap 时间和空间复杂度的主要内容,如果未能解决你的问题,请参考以下文章

时间复杂度和空间复杂度

什么是时间复杂度、空间复杂度?

时间复杂度和空间复杂度

php算法基础----时间复杂度和空间复杂度

Python语言算法的时间复杂度和空间复杂度

浅淡数据结构时间复杂度和空间复杂度