我期待看起来非常适合我对项目的需求的番石榴TreeRangeMap。 java文档说它基于(java标准?)TreeMap,它具有get(put和next)的O(log(n))时间。
但TreeRangeMap应该是某种范围树实现,根据此SO question,查询的时间复杂度为O(k + log(n)),O(n)空间,k为范围大小?。有人可以证实这一点吗?
我对TreeRangeMap.subRangeMap()操作的时间复杂性也很感兴趣。它是否具有相同的O(k + log(n))?
感谢。
答案 0 :(得分:8)
这是一种观点,而不是真正的突变或任何东西。 subRangeMap
在O(1)时间内返回,并且它返回的RangeMap
每个查询操作都有O(log n)
加法成本 - 也就是说,它的所有操作仍然需要{{1}只有更高的常数因子。
来源:我是“实施它的人。”
答案 1 :(得分:1)
我们通常使用Range树来查找给定间隔[x1, x2] and x1 < x2
中的点。但是,如果范围树是平衡二叉树(如使用红黑树实现的TreeMap
的情况),则x1
(或后继)和{{1}的搜索路径(或前任)的费用为x2
。当我们找到它们时,如果此范围内有O(log n)
个点数,我们将不得不使用树遍历报告它,该遍历将具有线性成本k
。总共O(k)
。
我对时间的复杂性也非常感兴趣 TreeRangeMap.subRangeMap()操作。它是否具有相同的O(k + LOG(n))的
O(k + log(n))
返回此范围地图中与范围相交的部分的视图,从而产生另一个<K,V> subRangeMap(Range<K> subRange)
。那为什么不呢?