基于这篇文章, 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))。这里有点不对劲......
答案 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的调用()方法到原始源映射对象。