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

Time complexity of TreeMap<> operations: get() and subMap()

基于此post, 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))。这里有问题...

答案有点混乱。从技术上讲,创建子图确实是持续不断的操作。但这只是因为它实际上除了设置低调和高调之外什么都不做,并且仍然与原始树共享树结构。

因此,对树的任何操作实际上都被推迟,直到调用特定方法。那么接下来get()还是遍历整个原图,只检查是否没有越过上下边界。简单地说 get() 仍然是 O(n) 其中 n 来自原始地图,而不是子地图。

We can use subMap(key, true, key, true) instead, which is O(1)

这是正确的

and iterating this sub map is also O(1).

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

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

这使您的方法的总体复杂性达到 O(log n),但它肯定比简单的 get 慢,因为在此过程中创建和丢弃了一个中间对象。

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