TreeMap的时间复杂度<>操作:get()和subMap()

时间:2016-08-10 08:50:25

标签: java hashmap treemap red-black-tree

基于这篇文章, Time complexity of TreeMap operations- subMap, headMap, tailMap

subMap()本身是O(1),O(n)来自迭代子地图。


那么,为什么要使用get(key)呢?

我们可以使用subMap(key,true,key,true)来代替

是O(1)并且迭代该子图也是O(1)。

比get(key)快,即O(log(n))。这里有点不对劲......

3 个答案:

答案 0 :(得分:4)

  

我们可以使用subMap(key,true,key,true),即O(1)

这是正确的

  

并且迭代这个子地图也是O(1)。

O(n)来自这个问题。答案没有说明这一点,这很好,因为它不是真的。

迭代子树的时间复杂度为O(log n + k),其中n是整个地图中元素的数量,k是子地图中元素的数量。换句话说,当你开始迭代时,它仍然需要O(log n)到达第一个位置。查找getFirstEntry()实施以了解它是如何完成的。

这会将您的方法的整体复杂性带到O(log n),但它必然比简单的get慢,因为在此过程中会创建并丢弃中间对象。

答案 1 :(得分:1)

答案有点令人困惑。从技术上讲,创建子图是常量操作。但这只是因为除了设置低位和高位之外它实际上什么也没做,并且仍然与原始树共享树结构。

结果,树上的任何操作实际上都被推迟,直到调用特定方法。那么get()仍然会遍历整个原始地图,只检查它是否没有越过低边界和高边界。简单地说get()仍然是O(n) n来自原始地图,而不是来自子地图。

答案 2 :(得分:0)

subMap的构造花费O(1)时间,但是所有检索操作都采用与原始地图相同的O(log n)时间,因为SubMap只包装此对象并最终完成范围检查并委托get的调用()方法到原始源映射对象。