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 是范围大小?有人可以证实这一点吗?
我对@987654323@操作的时间复杂度也很感兴趣。是否有相同的 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 时间和空间复杂度的主要内容,如果未能解决你的问题,请参考以下文章